30行のLiveScriptでのゲームライフ

30行のミームに続いて、有名なLifeゲームの実装をLiveScript (Javascriptに翻訳された言語)に投稿します。



人生のゲームは、単純なルールを持つセルオートマトンです。



手始めに、コード自体:

stopped=true document.body.onkeyup = (e) -> e.keyCode==13 && stopped := !stopped change = (div, a) -> div.setAttribute(\class, a and "cell active" or "cell") div.ac=a window.activate = (div) -> div.ac ?= false change div, !div.ac setInterval -> unless stopped arr=document.getElementById("board").children newarr=[[false for _ to arr[0].children.length-1] for _ to arr.length-1] c=0 for i in [0 to arr.length-1] for j in [0 to arr[i].children.length-1] for sx in [i-1 to i+1] for sy in [j-1 to j+1] when not (sy == j and sx ==i) arr[(sx+newarr.length)%newarr.length].children[(sy+newarr[0].length)%newarr[0].length].ac and ++c (c == 3 or (c == 2 and arr[i].children[j].ac)) and newarr[i][j]=true c=0 for i in [0 to newarr.length-1] for j in [0 to newarr[i].length-1] change arr[i].children[j], newarr[i][j] , 1000/15
      
      





ご覧のとおり、コードはシンプルで簡潔です。 中括弧がないため、コードのサイズが小さくなります。

jsfiddleへのリンク。 まず、フィールドの初期状態(ループ状態)を設定してから、Enterキーを押すと、ゲームが開始されます。



ブロードキャストの結果は次のとおりです。
 // Generated by LiveScript 1.2.0 (function(){ var stopped, change; stopped = true; document.body.onkeyup = function(e){ return e.keyCode === 13 && (stopped = !stopped); }; change = function(div, a){ div.setAttribute('class', a && "cell active" || "cell"); return div.ac = a; }; window.activate = function(div){ div.ac == null && (div.ac = false); return change(div, !div.ac); }; setInterval(function(){ var arr, newarr, res$, i$, to$, _, lresult$, j$, to1$, c, ref$, len$, i, ref1$, len1$, j, k$, ref2$, len2$, sx, l$, ref3$, len3$, sy, lresult1$, results$ = []; if (!stopped) { arr = document.getElementById("board").children; res$ = []; for (i$ = 0, to$ = arr.length - 1; i$ <= to$; ++i$) { _ = i$; lresult$ = []; for (j$ = 0, to1$ = arr[0].children.length - 1; j$ <= to1$; ++j$) { _ = j$; lresult$.push(false); } res$.push(lresult$); } newarr = res$; c = 0; for (i$ = 0, len$ = (ref$ = (fn$())).length; i$ < len$; ++i$) { i = ref$[i$]; for (j$ = 0, len1$ = (ref1$ = (fn1$())).length; j$ < len1$; ++j$) { j = ref1$[j$]; for (k$ = 0, len2$ = (ref2$ = (fn2$())).length; k$ < len2$; ++k$) { sx = ref2$[k$]; for (l$ = 0, len3$ = (ref3$ = (fn3$())).length; l$ < len3$; ++l$) { sy = ref3$[l$]; if (!(sy === j && sx === i)) { arr[(sx + newarr.length) % newarr.length].children[(sy + newarr[0].length) % newarr[0].length].ac && ++c; } } } (c === 3 || (c === 2 && arr[i].children[j].ac)) && (newarr[i][j] = true); c = 0; } } for (i$ = 0, len$ = (ref$ = (fn4$())).length; i$ < len$; ++i$) { i = ref$[i$]; lresult1$ = []; for (j$ = 0, len1$ = (ref1$ = (fn5$())).length; j$ < len1$; ++j$) { j = ref1$[j$]; lresult1$.push(change(arr[i].children[j], newarr[i][j])); } results$.push(lresult1$); } return results$; } function fn$(){ var i$, to$, results$ = []; for (i$ = 0, to$ = arr.length - 1; i$ <= to$; ++i$) { results$.push(i$); } return results$; } function fn1$(){ var i$, to$, results$ = []; for (i$ = 0, to$ = arr[i].children.length - 1; i$ <= to$; ++i$) { results$.push(i$); } return results$; } function fn2$(){ var i$, to$, results$ = []; for (i$ = i - 1, to$ = i + 1; i$ <= to$; ++i$) { results$.push(i$); } return results$; } function fn3$(){ var i$, to$, results$ = []; for (i$ = j - 1, to$ = j + 1; i$ <= to$; ++i$) { results$.push(i$); } return results$; } function fn4$(){ var i$, to$, results$ = []; for (i$ = 0, to$ = newarr.length - 1; i$ <= to$; ++i$) { results$.push(i$); } return results$; } function fn5$(){ var i$, to$, results$ = []; for (i$ = 0, to$ = newarr[i].length - 1; i$ <= to$; ++i$) { results$.push(i$); } return results$; } }, 1000 / 15); }).call(this);
      
      









言語の短いレビューも行います。誰かが興味を持つかもしれません。

LiveScriptは、すでに確立されているCoffeeScriptに似ていますが、関数型言語の要素、多くのデザインの構文糖衣も備えています。

基本的な構文要素を検討してください。



関数定義:

 add = (x, y) -> x+y
      
      





関数呼び出し:

 add 5 6 add(5, 6) add 5, 6
      
      





ループ:

 for i in [0 to 10] console.log i
      
      





スペースのない行は次のように記述できます。

 a = \string alert \str
      
      





クラス定義:

 class Accumulator (num) -> @acc = num sum:8 add: (n) -> @acc+=n @acc+@sum #returns a = new Accumulator 1 a.sum # 8 a.acc # 1 a.add 9 # @acc now 10; return 18
      
      







それだけです ご清聴ありがとうございました。



All Articles