

Conway's Game of Life in CoffeeScript - wsbail29
http://willbailey.name/conway/index.html

======
wsbail29
I've been playing around with CoffeeScript and docco a bit lately and I
thought I'd share this little project. Thanks to Jeremy Ashkenas for creating
these fantastic tools.

~~~
spatten
Nice code!

Docco always impresses too, eh?

I really like the use of:

this[key] = value for key, value of options

I'm going to use that for sure :)

------
starnix17
Be sure to check out the annotated source -
<http://willbailey.name/conway/docs/conway.html>

~~~
pan69
I really like how that is done. It would be great to be able to annotate
source code like this within your IDE.

~~~
alttab
the newest version of vim has this seamlessly integrated :)

~~~
heimidal
For real? If so, how do you access it?

~~~
freyrs3
!docco %

------
amirshim
I love CoffeeScript, except that it makes me hate writing javascript code now
:) Thanks @jashkenas for an amazing language.

I personally like code like this:

    
    
      countNeighbors: (cell) ->
        neighbors = 0
        neighbors += @isAlive cell.row+x, cell.col+y for x in [-1..1] when x || y for y in [-1..1]
        neighbors 
      isAlive: (row, col) -> if @world[row] and @world[row][col] and @world[row][col].live then 1 else 0
    

but you have to be careful, since putting a space before the "+x" will cause
some bad stuff to happen. Maybe I shouldn't drop so many parenthesis.

@jashkenas can you fix [-10..10] (constant boundary) loops to not check for
increasing/decreasing :) I can't think of an edge case that breaks it.

~~~
jashkenas
@amirshim:

Yes, range comprehensions were recently optimized to remove direction-checking
when possible. On CoffeeScript master ...

    
    
        x for x in [-10..10]
    

... compiles into:

    
    
        var x;
        for (x = -10; x <= 10; x++) {
          x;
        }
    

Even if the start/end values are variables, the check can be avoided by
specifying the step as a number. It'll go out with the next release.

~~~
amirshim
great!

------
d0m
Pretty clean code! A small suggestion:

    
    
      cell.live = false if count < 2 or count > 3
      cell.live = true  if count == 3
    

Could become:

    
    
      cell.live = count < 2 or count > 3
      cell.live = count == 3
    

since it's a bit redundant to write "true" since it's already a boolean
expression. It's a little bit like saying:

    
    
      if a == true:
        return true
      else:
        return false
    

instead of:

    
    
      return a // Agreed that a could be a "truth" value without being the real "true". Still:
    
      return !!a // With a hack

~~~
jashkenas
Or simply:

    
    
        cell.live = count is 3
    

no?

~~~
ggchappell
No. You aren't handling the case when count is 2 correctly. In that case,
cell.live should remain unchanged, while you are setting it to false. (Note,
however, that the code in the comment you are replying to is also incorrect.
And does the same thing as your code. So you posted a correct transformation
of incorrect code, that keeps it incorrect.)

~~~
abarrett
The original version still contains redundancy. It would be:

    
    
        cell.live = count == 3 if count != 2

~~~
ggchappell
Yes, that would do it.

------
eschulte
It's no APL... conway's game of life in a single line of code
<http://news.ycombinator.com/item?id=1041500>

------
wsbail29
Thanks for the code review folks. I made the countNeighbors method a bit more
concise and removed some unnecessary binding code from the travelWorld method.

------
truthseeker
And here I was thinking it must be about Ron Conway. Too much startup news.

------
xtat
heh, reminds me of my js version <http://rapidpacket.com/>

