NB. 15 position peg solitaire
NB. The board (position 5 initially vacant)

NB.         0
NB.       1   2
NB.      3  4   5
NB.    6  7   8   9
NB.  10 11 12  13 14

   xor =: ((+.)*.(-.@:*.))
   board =: 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1  NB. 0s for vacant, 1s occupied
   board
1 1 1 1 1 0 1 1 1 1 1 1 1 1 1
   move =: 0 2 5
   move
0 2 5
   board xor +./((1 0 0 0 0 0 0 0 0 0 0 0 0 0 0) |.!.0~ 3 1 $ -) move
0 1 0 1 1 1 1 1 1 1 1 1 1 1 1  NB. The desired result, a new board
   f =: ((1 0 0 0 0 0 0 0 0 0 0 0 0 0 0) |.!.0~ 3 1 $ -)
   f move
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
   +./f move
1 0 1 0 0 1 0 0 0 0 0 0 0 0 0  NB. Move 0 2 5 expressed as 15 element
binary array
   board xor +./f move
0 1 0 1 1 1 1 1 1 1 1 1 1 1 1  NB. Again, the desired result
   board                       NB. Both board and move unchanged
1 1 1 1 1 0 1 1 1 1 1 1 1 1 1
   move
0 2 5
   g =: xor +./
   make_move =: g f
   board make_move move
0 1 0 1 1 1 1 1 1 1 1 1 1 1 1  NB. Again, the desired result

++++++++++++++++++++++++++++++++++

The question: How to write make_move without creating subfunctions f and g?

I've tried several definition variations and keep getting 'length error'
messages upon usage.

One example:
   make_move =: xor+./((1 0 0 0 0 0 0 0 0 0 0 0 0 0 0) |.!.0~ 3 1 $ -)
   board make_move move
|length error: make_move
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to