That solution doesn't work on empty input either. The problem is that (0,~ 2 =/\ $0) has length one when it should be zero; since we know in this case that the input is never negative, we can append _1 before finding equal groups rather than a 0 after.
mergerow =. ((*>:) #~ _1|.-.@]) [:>/\.&.|. 2 =/\ ,&_1 mergerow $0 $mergerow $0 0 Marshall On Tue, Jun 07, 2016 at 06:12:54PM -0400, Marshall Lochbaum wrote: > Unpredictable behavior? The second version of mergerow seems like it > should give exactly the same results as the first. Any problems it > causes seem like cases for further debugging. > > Here's a version that doesn't rely on rplc, if it helps. > > mergerow =: ((*>:) #~ _1|.-.@]) [:>/\.&.|. 0,~ 2 =/\ ] > > mergerow 3 4 4 4 4 4 5 8 8 7 > 3 8 8 4 5 16 7 > > The tricky part is suppressing extra matches. My initial solution used > a nice trick for counting within groups of ones: > > ]m =. 0,~ 2 =~/\ 3 4 4 4 4 4 5 8 8 7 > 0 1 1 1 1 0 0 1 0 0 > ([*+)/\.&.|. m > 0 1 2 3 4 0 0 1 0 0 > 2|([*+)/\.&.|. m > 0 1 0 1 0 0 0 1 0 0 > > Since we only need the answer mod 2, we can shift the 2&| inside, and > note that (2|+) is the same as (~:) on binary inputs. Then ([*~:) turns > out to be equal to (>) on binary inputs, a fact I found just by > computing the truth table. > > ([*~:)/\.&.|. m > 0 1 0 1 0 0 0 1 0 0 > ([*~:)"0/~ 0 1 > 0 0 > 1 0 > >/\.&.|. m > 0 1 0 1 0 0 0 1 0 0 > > Marshall > > On Wed, Jun 08, 2016 at 09:15:14AM +1200, Ric Sherlock wrote: > > I'm looking for a J-like approach to a verb for merging adjacent numbers in > > a row where the numbers are the same. For example > > > > mergerow 4 4 4 4 > > > > 8 8 > > > > mergerow 8 8 > > > > 16 > > > > mergerow 16 > > > > 16 > > > > mergerow 4 4 4 > > > > 8 4 > > > > mergerow 8 4 > > > > 8 4 > > > > mergerow 4 8 8 4 > > > > 4 16 4 > > > > > > My version below which I've used as part of the answer to a RosettaCode task > > <http://rosettacode.org/wiki/2048#J> is very non J-like: > > > > mergerow=: verb define > > len=. <:@# y > > row=. i. i=. 0 > > while. (i <: len) *. len >: 0 do. > > if. =/ (i , i+1) { y,_9 do. > > row=. row, +: i { y > > i=. i + 2 > > else. > > row=. row, i { y > > i=. i + 1 > > end. > > end. > > row > > ) > > > > I thought I had a good solution with: > > > > mergerow=: rplc (2&# ; +:)&>@~. > > > > But this seemed to cause unpredictable behaviour when used as part of the > > whole solution. > > ---------------------------------------------------------------------- > > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
