n        =: 5
Neighbors=: 3 3 ((>:i.n,n) e. (9$_1 1 _1 1 1 1) * ,);._3 >:m 
,(m,.(i.n,n),.m),m=: *:n
out      =: [ ~: Neighbors {~ <@]



----- Original Message -----
From: Roger Hui <[email protected]>
Date: Thursday, February 4, 2010 16:34
Subject: Re: [Jprogramming] Lights Out!
To: Programming forum <[email protected]>

> n        =: 5
> Neighbors=: 3 3 ((9$_1 1 _1 1 1 1) * ,);._3 n ,(n,.(i.n,n),.n),n
> 
> out      =: [ ~: i...@$@[ e. Neighbors {~ 
> <@]
>    BOARD0 out 3 2
> 0 0 0 0 0
> 0 0 0 0 0
> 1 0 0 0 1
> 0 1 1 1 0
> 0 0 1 0 0
> 
> 
> 
> ----- Original Message -----
> From: Dan Bron <[email protected]>
> Date: Thursday, February 4, 2010 14:08
> Subject: [Jprogramming] Lights Out!
> To: 'Programming forum' <[email protected]>
> 
> > When I was a kid I had a handheld version of the game "lights 
> > out" [1,2], and I was addicted.    The game is 
> > played on a 5-by-5
> > board of lights, and starts with some of the lights on and all 
> > the others off; the goal is to turn off all the lights.  
> > You can
> > toggle the state of a light and its 4 neighbors (NSEW) by 
> > pressing on it.  
> > 
> > For example, here is the classic starter board:
> > 
> >     00000
> >     00000
> >     10101
> >     00*00
> >     00000
> > 
> > Where 0 is an off light, 1 is an on light, and * is a light 
> I'm 
> > about to press (which happens to be off, but you can't see 
> that in
> > this notation).  After I press that light, the board looks 
> > like this:
> > 
> >     00000
> >     00000
> >     10001
> >     0111*
> >     00100
> > 
> > Where again the light I'm about to press happens to be off 
> (i.e. 
> > there's a 0 under that *).  Having pressed that, the board now
> > looks like this:
> > 
> >     00000
> >     00000
> >     10000
> >     01101
> >     00101
> >    
> > and so on until I turn off all the lights.
> > 
> > I have an implementation of this in J that I wrote when I was 
> > first learning the language (I frequently use this game as my
> > language-familiarization problem, following "Hello,world!" -- 
> I 
> > have one in x86 assembler, somewhere).    When I 
> > wrote it, one of
> > the things that bothered me was that I couldn't come up with 
> an 
> > elegant, array-ish way to toggle the lights, given the light the
> > user pressed.     
> > 
> > So, given J's array mastery, can you?  That is, given the inputs:
> > 
> >            ] 
> > BOARD0 =: 5 5 $ 0 0 0 0 0   0 0 0 0 0  1 0 1 0 
> > 1  0 0 0 0 0   0 0 0 0 0
> >     0 0 0 0 0
> >     0 0 0 0 0
> >     1 0 1 0 1
> >     0 0 0 0 0
> >     0 0 0 0 0
> > 
> >            
> > PUSH   =: 3 2
> >            
> > can you write a dyad   out   such that:
> > 
> >            ] 
> > BOARD1 =: BOARD0 out PUSH
> >     0 0 0 0 0
> >     0 0 0 0 0
> >     1 0 0 0 1
> >     0 1 1 1 0
> >     0 0 1 0 0
> >                       
> > 
> > in an elegant, array-oriented way?  I'm thinking about 
> > maybe an inner product of some sort, as opposed to calculating 
> > the index
> > array and manually amending the board (e.g. BOARD0 4 : '(-. z 
> { 
> > x ) (z=.<"1 y <@+"1 _2 ]\ _1 0  0 _1  0 0  
> > 0 1  1 0)} x' PUSH).  I'd
> > also like to see solutions which avoid handling the edge- and 
> > corner-cases specially, especially if this can be done *without*
> > changing the representation of the as a boolean table (but if 
> > necessary, feel free to select your own representations for 
> > BOARD or
> > PUSH).
> > 
> > -Dan
> > 
> > [1]:   You can play the game online here:  
> >     http://www.whitman.edu/mathematics/lights_out/
> >         and also see its Java 
> > source.
> > [2]  Wikipedia nicely describes the mathematics of Lights Out:
> >     http://en.wikipedia.org/wiki/Lights_Out_(game)
> >        including spoilers on how 
> > to win (or write a program to determine if a given board is 
> winnable).> 
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to