I am not sure if this is an improvement but I removed some duplication with:
andbonus=: conjunction define
(x+y)&{. ; (x)&}.
)
openr=:2 andbonus 0 NB. ie. two shots and no bonus shot
sparer=:2 andbonus 1
striker=:1 andbonus 2
On 4/10/06, June Kim <[EMAIL PROTECTED]> wrote:
> 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