An iterative approach:
scored=: adverb define
:
pscr=. x NB. previous scores
'scr rest'=. u y
(pscr, +/scr);rest
)
openr=: 2&{. ; 2&}.
open=: openr scored
assert (22 3;3 4 5) -: 22 open 1 2 3 4 5
sparer=: (2+1)&{. ; 2&}.
spare=: sparer scored
assert (22 15;5 4 3) -: 22 spare 3 7 5 4 3
striker=: (1+2)&{. ; 1&}.
strike=: striker scored
assert (22 19;5 4 3 2) -: 22 strike 10 5 4 3 2
rind=: 13 : '>:* 10-~ +/2{.y' NB. 0 open, 1 spare, 2 strike
assert 0-: rind 2 3 4 5
assert 1-: rind 2 8 1 2
assert 2-: rind 10 2 3 4
chooser=: [EMAIL PROTECTED]([EMAIL PROTECTED])
assert (22 20;7 3 4 5)-: 22 chooser 10 7 3 4 5
assert (22 13;3 4 5)-: 22 chooser 3 7 3 4 5
assert (22 3; 3 4 5)-: 22 chooser 1 2 3 4 5
doframe=: (chooser&>)/
assert (3 7 9;'') -: doframe^:3 '';1 2 3 4 5 4
assert (20 12 7 5;'') -: doframe^:4 '';10 3 7 2 5 4 1
upto10frames=: 10 > [: # [: > {.
game=: 13 : '+/ > {. doframe^:upto10frames^:_ '''';y'
empty_case=: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
open_case=: 9 0 8 1 7 2 6 3 5 4 4 5 3 6 2 7 8 1 0 9
spare_case=: 9 1 8 2 7 3 6 4 5 5 4 6 3 7 2 8 1 9 8 2 1
strike_case=: 10 10 10 10 10 10 10 10 10 10 10 10
alt_case=: 9 1 10 8 2 10 7 3 10 6 4 10 5 5 10 4 6
none_and_spare_case=: 0 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
assert 0-:game empty_case
assert 90-:game open_case
assert 145-:game spare_case
assert 300-:game strike_case
assert 200-:game alt_case
assert 30-:game none_and_spare_case
Any comments for improvement?
On 3/27/06, Henry Rich <[EMAIL PROTECTED]> wrote:
> A different approach:
>
> NB. Index of each ball that starts a frame
> framex =: 10 {. 0 {~^:a:~ _1 _1 ,~ [EMAIL PROTECTED] > :@:+ 10&~:
> NB. Score for each ball, assuming that ball starts a frame
> scoreifframe =: 3 +^:(9<])`+/@|.\ ,&0
> NB. Pick the balls that actually start frames & add em up
> gamescore =: [: +/ framex { scoreifframe
>
> Henry Rich
> >
> > empty_case=: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> > open_case=: 9 0 8 1 7 2 6 3 5 4 4 5 3 6 2 7 8 1 0 9
> > spare_case=: 9 1 8 2 7 3 6 4 5 5 4 6 3 7 2 8 1 9 8 2 1
> > strike_case=: 10 10 10 10 10 10 10 10 10 10 10 10
> > alt_case=: 9 1 10 8 2 10 7 3 10 6 4 10 5 5 10 4 6
> > none_and_spare_case=:0 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> >
> >
> >
> > assert 0=+/scores empty_case
> > assert 90=+/scores open_case
> > assert 145=+/scores spare_case
> > assert 300=+/scores strike_case
> > assert 200=+/scores alt_case
> > assert 30=+/scores none_and_spare_case
>
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm