5 ms·
Conway's Game of Life in CoffeeScript
- wsbail29 15y agoI'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 15y agoNice 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 15y agoBe sure to check out the annotated source - http://willbailey.name/conway/docs/conway.html http://willbailey.name/conway/docs/conway.html
- pan69 15y agoI really like how that is done. It would be great to be able to annotate source code like this within your IDE.
- AlecSchueler 15y agoLooks like it was created using Docco - http://jashkenas.github.com/docco/ http://jashkenas.github.com/docco/
- alttab 15y agothe newest version of vim has this seamlessly integrated :)
- d0m 15y agoPretty 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 15y agoOr simply: cell.live = count is 3 no?
- ggchappell 15y agoNo. 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 15y agoThe original version still contains redundancy. It would be: cell.live = count == 3 if count != 2
- ggchappell 15y agoYes, that would do it.
- ggchappell 15y agoNope. The point of those if's is that the value of cell.live remains unchanged if the condition is false. Your code does not do that. What should happen is that, if count is 3, then cell.live becomes true. If count is 2, then cell.live retains its previous value. For all other values of count, cell.live becomes false.
- amirshim 15y agoI 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.
- jacobolus 15y agoIf you add a space after the + also, it’ll be fine (indeed, better). But to be honest, I hate code that tries to do 5 bits of logic on one 100-character-long line, instead of just breaking into two more readable lines. [Edit: looks like that was fixed in the version at http://willbailey.name/conway/docs/conway.html http://willbailey.name/conway/docs/conway.html] Also, can’t your isAlive function look like: isAlive: (row, col) -> @world[row]?[col]?.live
- jashkenas 15y ago@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 15y agogreat!
- xtat 15y agoheh, reminds me of my js version http://rapidpacket.com/ http://rapidpacket.com/
- wsbail29 15y agoThanks 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 15y agoAnd here I was thinking it must be about Ron Conway. Too much startup news.
- eschulte 15y agoIt's no APL... conway's game of life in a single line of code http://news.ycombinator.com/item?id=1041500 http://news.ycombinator.com/item?id=1041500