Schreiben Sie einen Begriff auf den reinen untypisierten Lambda-Kalkül, der, wenn er auf eine kirchenkodierte Liste von Zahlen angewendet wird , ihn mit aufsteigenden oder absteigenden Zahlen zurückgibt. Kirchenlisten und -nummern müssen für ihre üblichen ADTs als Falten codiert werden:
-- Usual ADTs for Lists and Nats (in Haskell, for example)
data List a = Cons a (List a) | Nil
data Nat a = Succ (Nat a) | Zero
-- Their respective folds are the λ-calculus representation used on this challenge
church_list = (λ c n . (c ... (c ... (c ... n))))
church_num = (λ succ zero . (succ (succ (succ ... zero))))
Beispieleingabe:
(λ cons nil .
(cons (λ f x . (f x)) -- 1
(cons (λ f x . (f (f (f (f (f (f (f x)))))))) -- 7
(cons (λ f x . (f (f x))) -- 2
(cons (λ f x . (f (f (f x)))) -- 3
nil)))))
Beispielausgabe:
(λ cons nil .
(cons (λ f x . (f x)) -- 1
(cons (λ f x . (f (f x))) -- 2
(cons (λ f x . (f (f (f x)))) -- 3
(cons (λ f x . (f (f (f (f (f (f (f x)))))))) -- 7
nil)))))
Die Punktzahl einer Einreichung wird wie folgt berechnet:
score(x) = 1
score(λx.t) = score(t) + 1
score(t s) = score(t) + score(s) + 1
Die niedrigste Punktzahl gewinnt.