Buradaki zorluk, yazılmamış lambda matematiği için bir tercümanı olabildiğince az karakterle yazmaktır . Yazılmamış lambda hesabını şu şekilde tanımlarız:
Sözdizimi
Aşağıdaki üç tür ifade vardır:
Lambda deyimi forma sahiptir herhangi bir yasal değişken adı ve olabilecek herhangi bir hukuki ifadesi. İşte parametre denir ve işlev gövdesi denir.
(λ x. e)
x
e
x
e
Sadelik uğruna,
x
şu anda kapsamda olan adda bir değişken bulunmaması gerektiğine dair daha fazla kısıtlama getiriyoruz. Bir değişken, adı arasında(λ
ve.
ile göründüğünde kapsamda olmaya başlar ve karşılık gelen kapsamda olmayı durdurur)
.- İşlev başvuru formu vardır ve yasal ifadelerdir. İşte işlev denir ve argüman denir.
(f a)
f
a
f
a
- Bir değişken forma sahiptir yasal değişken adıdır.
x
x
semantik
Fonksiyon gövdesinde parametrenin her bir oluşumunu argümanı ile değiştirerek bir fonksiyon uygulanır. Daha biçimsel formunun ifadesi ((λ x. e) a)
, x
değişken adım ve e
ve a
ifade ifadeler, değerlendirir (ya da azaltan) olan her oluşumunu değiştirilmesi sonucu olarak birlikte .e'
e'
x
e
a
Normal bir form daha fazla değerlendirilemeyen bir ifadedir.
Meydan okuma
Göreviniz, kabul etmeyi seçmeniz durumunda, girdi olarak serbest değişken içermeyen ve yazılmamış lambda hesabının bir ifadesini alan ve çıktısı olarak ifadenin normal biçimini (veya ona uygun bir ifadesiyle) üreten bir tercüman yazmaktır. . İfadenin normal bir formu yoksa veya geçerli bir ifade değilse, davranış tanımsızdır.
En az sayıda karakter içeren çözüm kazanır.
Birkaç not:
- Girdi, stdin'den veya komut satırı argümanı olarak verilen bir dosya adından okunabilir (ikisinden birini değil yalnızca birini veya diğerini uygulamanız gerekir). Çıktı stdout'a gider.
- Alternatif olarak, girişi bir dizge olarak alan ve çıktıyı bir dizge olarak döndüren bir işlev tanımlayabilirsiniz.
- ASCII olmayan karakterler sizin için sorunluysa
\
, λ yerine ters eğik çizgi ( ) karakterini kullanabilirsiniz . - Bayt değil, karakter sayısını sayarız; bu nedenle kaynak dosyanız unicode λ olarak kodlanmış olsa bile bir karakter olarak sayılır.
- Yasal değişken isimleri bir veya daha fazla küçük harflerden oluşur, yani a ve z arasındaki karakterler (alfanümerik isimleri, büyük harfleri veya latin olmayan harfleri desteklemenize gerek yoktur - bunun yerine çözümünüzü geçersiz kılmaz).
- Bu zorluk söz konusu olduğunda, parantez içinde isteğe bağlı değildir. Her lambda ifadesi ve her fonksiyon uygulaması tam olarak bir çift parantez ile çevrelenecektir. Hiçbir değişken isim parantez içine alınmaz.
- Sözdizimsel şeker gibi yazma
(λ x y. e)
için(λ x. (λ y. e))
desteklenmesi gerekmez. - Bir işlevi değerlendirmek için 100'den fazla özyineleme derinliği gerekirse, davranış tanımsızdır. Bu, tüm dillerde optimizasyon olmadan uygulanabilecek kadar düşük ve çoğu ifadeyi yürütebilecek kadar büyük olmalıdır.
- Ayrıca, boşlukların örneklerde olduğu gibi, yani girişin başında ve sonunda boşluk kalmayacağını
λ
veya bir fonksiyondan önce ve bir fonksiyondan.
sonra ve a'dan sonra tam olarak bir boşluktan önce olacağını varsayabilirsiniz ..
λ
Örnek Giriş ve Çıkış
Giriş:
((λ x. x) (λ y. (λ z. z)))
Çıktı:
(λ y. (λ z. z))
Giriş:
(λ x. ((λ y. y) x))
Çıktı:
(λ x. x)
Giriş:
((λ x. (λ y. x)) (λ a. a))
Çıktı:
(λ y. (λ a. a))
Giriş:
(((λ x. (λ y. x)) (λ a. a)) (λ b. b))
Çıktı:
(λ a. a)
Giriş:
((λ x. (λ y. y)) (λ a. a))
Çıktı:
(λ y. y)
Giriş:
(((λ x. (λ y. y)) (λ a. a)) (λ b. b))
Çıktı:
(λ b. b)
Giriş:
((λx. (x x)) (λx. (x x)))
Çıktı: herhangi bir şey (Bu, normal formu olmayan bir ifade örneğidir)
Giriş:
(((λ x. (λ y. x)) (λ a. a)) ((λx. (x x)) (λx. (x x))))
Çıktı:
(λ a. a)
(İşlev çağrısından önceki argümanları değerlendirirseniz normal olmayan bir ifadenin örneği ve ne yazık ki benim teşebbüsümün başarısız olduğu bir örnek.)Giriş:
((λ a. (λ b. (a (a (a b))))) (λ c. (λ d. (c (c d)))))
Çıktı:
`(λ a. (λ b. (a (a (a (a (a (a (a (a b))))))))))
Bu, Kilise sayılarında 2 ^ 3 hesaplar.
(\y. a)
.