純粋な型付けされていないラムダ計算に、教会でエンコードされた数値のリストに適用されると、昇順または降順で並べ替えられた数値を返す用語を記述します。教会のリストと番号は、通常のADTの折りたたみとしてエンコードする必要があります。
-- 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))))
入力例:
(λ 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)))))
出力例:
(λ 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)))))
提出物のスコアは次のように計算されます。
score(x) = 1
score(λx.t) = score(t) + 1
score(t s) = score(t) + score(s) + 1
最も低いスコアが勝ちます。