Life Goes On

まあまあだけど楽しんでる方です

あなごるで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)