あなごるでv
仕事が落ち着いたので、前から気になっていたあなごるのvの code を読んでみました。
基本は↓の関数を作ること。
f x = if succ x == w then out x else f (succ x)
名前はつけられないので↓みたいにして、引数 x に関数を渡す。
f x y = if succ y == w then out y else x x (succ y)
これだと x x (succ y) のところが無限ループになってしまうので、どうするか。
irie さんの 51B のコードは大胆で、x を丸々 if succ y == w then y else x で置き換えてしまう。あと out は外出し。
f x y = if succ y == w then y else (if succ y == w then y else x) (if succ y == w then y else x) (succ y)
長くなりそうだけど、if succ y == w then y の部分を再利用してるので、短い。
ww : f x y = WWWWw : succ y WWWWWWw : du (succ y) Wwww : du (succ y) y Wwwwww : du (succ y) y x Ww : (du (succ y) y x) (du (succ y) y x) Wwwwww : (du (succ y) y x) (du (succ y) y x) (succ y) WWWWwv : du (succ y) y ((du (succ y) y x) (du (succ y) y x) (succ y)) Ww : f f Wwwwww : f f du WWWWw : out (f f du)
niha さん、51b さんのコードも、out を外出ししていたり、骨格は似ている。
f x y = (if succ y == w then (if succ y == w then y else) else x x) (succ y)
ww : f x y = WWww : x x WWWWWww : succ y Wwwwwwww : (succ y) du Wwwww : (succ y) du y WWw : (succ y) du ((succ y) du y) Wwwwww : (succ y) du ((succ y) du y) (x x) Wwwwwwv : (succ y) du ((succ y) du y) (x x) (succ y) Ww : f f Wwwwww : f f du WWWWw : out (f f du)
kinaba さんのコードは素直で読みやすい。
f x y = (if succ y == w then out else x x) (if succ y == w then y else succ y)
ww : f x y = WWww : x x WWWWWww : succ y WWWWWWWw : du (succ y) Wwwwwww : du (succ y) out Wwwww : du (succ y) out (x x) WWWwwwwww : du (succ y) y Wwwwww : du (succ y) y (succ y) WWWwv : (du (succ y) out (x x)) (du (succ y) y (succ y)) Ww : f f Wwwwww : f f du
out の引数が増えても出力されるのは第1引数だけなので、2引数関数として使うのもあり。
f x y = (if succ x == w then out else y) (if succ x == w then x else succ x) (if succ x == w then out else y)
kt3k さんのコード
ww : f x y = WWWWww : succ x WWWWWWw : du (succ x) Wwwww : du (succ x) x Wwww : du (succ x) x (succ x) WWWwwwwwww : du (succ x) out Wwwwwww : du (succ x) out y Wwww : (du (succ x) out y) (du (succ x) x (succ x)) Wwwv : (du (succ x) out y) (du (succ x) x (succ x)) (du (succ x) out y) Wwwww : f du Www : f du f
kik さん、irori さんは、succ を2回適用して判定。
f x y = (if succ (succ y) == w then out else x x) (succ y)
ww : f x y = WWww : x x WWWWWww : succ y WWWWWWw : succ (succ y) WWWWWWWWw : du (succ (succ y)) Wwwwwwww : du (succ (succ y)) out Wwwwww : du (succ (succ y)) out (x x) Wwwwwwv : du (succ (succ y)) out (x x) (succ y) Ww : f f Wwwwww : f f du
shinh さん、ksk さんは、succ 2回適用で out 2引数バージョン。
f x y = (if succ (succ x) == w then out else y) (succ x) y
shinh さんのコード
ww : f x y = WWWWww : succ x WWWWWw : succ (succ x) WWWWWWWw : du (succ (succ x)) Wwwwwww : du (succ (succ x)) out Wwwwww : du (succ (succ x)) out y Wwwwww : (du (succ (succ x)) out y) (succ x) Wwwwwwwwv : (du (succ (succ x)) out y) (succ x) y Wwwww : f du Www : f du f
ksk さんのコード。関数が2つあるけど基本は同じ。
w : f x = WWWw : succ x Wwwwww : (succ x) du Wwwwwv : (succ x) du out ww : g x y = WWWWWww : succ x WWWWw : f (succ x) Wwww : f (succ x) y Wwww : f (succ x) y (succ x) Wwwwwwv : (f (succ x) y) (succ x) y Wwwwww : g du succ Www : g du g
youz さんのコードは独特。最初に見たときは再帰してないじゃんと思った。よく見たら out する前にしてる。これは‥‥邪道だ。www
ww : f x y -> WWWWw : succ y WWWWWWw : du (succ y) Wwww : du (succ y) y Wwwwww : du (succ y) y x Ww : (du (succ y) y x) (du (succ y) y x) Wwwwww : (du (succ y) y x) (du (succ y) y x) (succ y) WWWWWWWWWwwwv : out (du (succ y) y x) Ww : f f Wwwwww : f du
でもいちばん驚いたのは、hirose さんのコード。
チャーチ数のべき乗をやっと理解しました。かっこいい。
wWWWwWWWWWwWwwwWwwwv : f x = du (succ x) x (succ x) wwWWwWWWwv : 2 Ww : 4 = 2 ^ 2 Ww : 256 = 4 ^ 4 Wwwww : 256 f Wwwwwwwww : 256 f du WWWWWWWw : out (256 f du)