Giriş: Kombinatorik Mantık
Kombine edici mantık (CL), temel olarak işlev olan birleştiriciler olarak adlandırılan şeylere dayanır . İki temel "yerleşik" birleştirici vardır S
ve K
bunlar daha sonra açıklanacaktır.
Sol associativity
CL sol çağrışımdır , yani onu içeren anter çiftinin en solunda yer alan braketler (eşya içeren), eşyaları serbest bırakılarak çıkarılabilir. Örneğin, böyle bir şey:
((a b) c)
İçin azaltılabilir
(a b c)
Nerede (a b)
büyük desteğinin aşırı solda ((a b) c)
, bu yüzden çıkarılabilir.
Sol ilişkinin çok daha büyük bir örneği (köşeli parantezler açıklamalardır):
((a b) c ((d e) f (((g h) i) j)))
= (a b c ((d e) f (((g h) i) j))) [((a b) c...) = (a b c...)]
= (a b c (d e f (((g h) i) j))) [((d e) f...) = (d e f...)]
= (a b c (d e f ((g h i) j))) [((g h) i) = (g h i)]
= (a b c (d e f (g h i j))) [((g h i) j) = (g h i j)]
Köşeli ayraçlar, aynı nesnelerin çevresine birden fazla çift sarıldığında da azaltılabilir. Örnekler:
((((a)))) -> a
a ((((b)))) -> a b
a (((b c))) -> a (b c) [(b c) is still a group, and therefore need brackets.
Note that this doesn't reduce to `a b c`, because
`(b c)` is not on the left.]
yerleşikleri
CL, iki "yerleşik" birleştiriciye sahiptir S
ve K
nesneleri (tek birleştiriciler veya parantez etrafına sarılmış bir birleştiriciler / gruplar) bu şekilde değiştirebilir:
K x y = x
S x y z = x z (y z)
Nerede x
, y
ve z
herhangi bir şey için stand-ins olabilir.
Bunun bir örneği S
ve K
aşağıdaki gibidir:
(S K K) x [x is a stand-in for anything]
= S K K x [left-associativity]
= K x (K x) [S combinator]
= x [K combinator]
Başka bir örnek:
S a b c d
= a c (b c) d [combinators only work on the n objects to the right of it,
where n is the number of "arguments" n is defined to have -
S takes 3 arguments, so it only works on 3 terms]
Yukarıdakiler, ifadenin daha fazla değerlendirilemediği ve sınırlı bir süre içinde bir sonuç elde ettiği normal CL ifadelerinin örnekleridir. Normal olmayan ifadeler vardır (bunlar sona ermeyen ve sonsuza dek değerlendirilmeye devam edecek CL ifadeleridir), ancak meydan okuma kapsamları içinde değildir ve ele alınmasına gerek yoktur.
CL hakkında daha fazla bilgi edinmek istiyorsanız, bu Wikipedia sayfasını okuyun .
Görev:
Göreviniz, argümanların sayısı ve girdi olarak değerlendirdiği gibi, birleştiriciler yapmaktır;
{amount_of_args} = {evaluated}
{amount_of_args}
Arg sayısına eşit pozitif bir tam sayı nerede ve {evaluated}
şunlardan oluşur:
- argüman miktarına kadar olan
1
argümanlar, ilk argüman,2
ikincisi olmak vb.- Arg miktarının üzerindeki argüman numaralarının ( sadece bir
4
zaman{amount_of_args}
olduğu zaman3
) görünmeyeceği garanti edilir{evaluated}
.
- Arg miktarının üzerindeki argüman numaralarının ( sadece bir
- parantez
()
Yani girdi örnekleri:
3 = 2 3 1
4 = 1 (2 (3 4))
İlk girdi, R
üç bağımsız değişkeni ( R 1 2 3
) içeren bir birleştirici (örneğin ) ister;
R 1 2 3 -> 2 3 1
İkinci girdi bunu sorar (bir birleştirici adıyla A
):
A 1 2 3 4 -> 1 (2 (3 4))
Bu biçimde girdi göz önüne alındığında, bir dizi dönmelidir S
, K
ve ()
bir combinator isminin yerine ve argümanlarla çalıştırdığınızda, aynı değerlendirilen açıklamada döndüren {evaluated}
komut bloğu geri o combinator adı için ikame edilmektedir blokta.
Çıktı birleştirici deyiminin boşlukları kaldırılmış ve dış köşeli ayraçlar kaldırılmış olabilir, böylece benzer bir şey (S K K (S S))
dönüştürülebilir SKK(SS)
.
Eğer programın çıktılarını test etmek isterseniz, @aditsu (içeren bir kombinatoriyel mantık ayrıştırıcı yapmıştır S
, K
, I
ve hatta diğerleri gibi B
ve C
) burada .
Puan:
Bu bir metatagolf olduğundan , bu zorluğun amacı, bu 50 test vakası göz önüne alındığında, mümkün olan en düşük miktarda bayt elde etmektir . Lütfen 50 test vakası için sonuçlarınızı cevaba koyun veya bir macun (veya benzer bir şey) yapın ve bu macine için bir bağlantı gönderin.
Beraberlik durumunda, en eski çözüm kazanır.
Kurallar:
- Cevabınız DOĞRU çıktı döndürmelidir - bu nedenle bir girdi verildiğinde, görevdeki tanıma göre doğru çıktıyı döndürmelidir.
- Yanıtınız her test vakası için modern bir dizüstü bilgisayarda bir saat içinde çıkmalıdır.
- Herhangi bir çözüm kodlamasına izin verilmez. Ancak, 10 birleştiriciye kadar sabit kodlama yapmanıza izin verilir.
- Programınız aynı girdi için her seferinde aynı çözümü döndürmelidir.
- Programınız yalnızca test senaryoları için değil, verilen tüm girdiler için geçerli bir sonuç döndürmelidir.
1
çıkarabileceğinizi 1
ve daha sonra bu cevap için çözümü satabileceğinizi fark ettim K()
. Örnek: Çözüm için 2 -> 1
ise K
, bu nedenle çözüm 3 -> 2
olduğunu KK
, çözümü 4 -> 3
olduğunu K(KK)
vs.