Escreva um termo no cálculo lambda puro não digitado que, quando aplicado a uma lista de números codificados por igrejas , o retorne com seus números classificados em ordem crescente ou decrescente. As listas e os números das igrejas devem ser codificados como dobras para seus ADTs habituais:
-- 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))))
Exemplo de entrada:
(λ 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)))))
Exemplo de saída:
(λ 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)))))
A pontuação de uma submissão será calculada da seguinte forma:
score(x) = 1
score(λx.t) = score(t) + 1
score(t s) = score(t) + score(s) + 1
Menor pontuação ganha.