const Z = (f=> (x=>f(y=>x(x)(y))) (x=>f(y=>x(x)(y))) )
console.log(
Z(
(x) => (
(n) => (
(n==0) ? 1 : n * x(n-1)
)
)
)(5)
)
Zコンビネーターでラムダ関数だけで再帰
import random;
(lambda f:(lambda x:f(lambda y:x(x)(y)))(lambda x:f(lambda y:x(x)(y))))(lambda x:lambda i:print("キヨシ!")if i==30 else [i:=i*2+random.randint(0,1)&31,print(["ドコ", "ズン"][1&i]),x(i)])(0)
(f=>(x=>f(y=>x(x)(y)))(x=>f(y=>x(x)(y))))(x=>(i=>{(i==30)?console.log("キヨシ!"):[console.log(["ズン","ドコ"][1&~(i=i*2+(Math.random()>.5)&31)]),x(i)]}))(0)
Z = (lambda f:(lambda x:f(lambda y:x(x)(y)))(lambda x:f(lambda y:x(x)(y))))
PythonのZコンビネーター
Z = (lambda f:(lambda x:f(lambda y:x(x)(y)))(lambda x:f(lambda y:x(x)(y))))
# Z(lambda x:lambda i:print("キヨシ!")if i==30 else [i:=i*2+random.randint(0,1)&31,print(["ドコ", "ズン"][1&i]),x(i)])(0)
import random;
(lambda f:(lambda x:f(lambda y:x(x)(y)))(lambda x:f(lambda y:x(x)(y))))(lambda x:lambda i:print("キヨシ!")if i==30 else [i:=i*2+random.randint(0,1)&31,print(["ドコ", "ズン"][1&i]),x(i)])(0)
# zundoko(0)
# print((lambda f:(lambda x:f(lambda y:x(x)(y)))(lambda x:f(lambda y:x(x)(y))))(lambda x:(lambda n: 1 if n==0 else n * x(n-1)))(5))
# const Z = (f=> (x=>f(y=>x(x)(y))) (x=>f(y=>x(x)(y))) )
#
# console.log(
# Z(
# (x) => (
# (n) => (
# (n==0) ? 1 : n * x(n-1)
# )
# )
# )(5)
# )
(f=>(x=>f(y=>x(x)(y)))(x=>f(y=>x(x)(y))))(x=>(i=>{(i==30)?console.log("キヨシ!"):[console.log(["ズン","ドコ"][1&~(i=i*2+(Math.random()>.5)&31)]),x(i)]}))(0)