Stackylogic, daha önceki bir zorlukta oluşturduğum bir programlama dilidir: Run Stackylogic . Tüm ayrıntılar ve örnekler için bu yayını okuyun, ancak nasıl yorumlandığı aşağıda açıklanmıştır:
Stackylogic alır
0
sitesindeki ve1
giriş için sitesindeki ve tek bir çıkış olarak0
veya1
üzerine tamamlama.Bir program yalnızca karakterleri içeren satırlardan ve satırlardan
01?
birinin<
sonunda tam olarak bir satırdan oluşur. Çizgiler boş olmayabilir ve hattı<
en az birine sahip olması gerekir0
,1
ya da?
ondan önce.İşte hesaplayan bir örnek program NAND iki bit:
1 ?< 11 ? 0
Bir programdaki her satır , alt kısmı solda ve üst kısmı sağda olacak şekilde bir yığın olarak kabul edilir . Örtük olarak, bir programdaki ilk satırdan önce ve son satırdan sonra boş bir yığın (yani boş satır) vardır.
<
Bir program çalıştırıldığında, imleç adı verilen işaretler yığın günü başlayacak. Yürütme aşağıdaki gibi devam eder:
Üst karakteri imlecin şu anda işaret ettiği yığından çıkar.
- Karakter ise
?
, kullanıcıdan bir0
veya a1
isteyin ve karaktermiş gibi davranın.- Karakter ise
0
, imleci bir yığın yukarı taşı (geçerli satırın üzerindeki satıra).- Karakter ise
1
, imleci bir yığın aşağı taşı (geçerli satırın altındaki satıra).İmlecin hareket ettiği yığın boşsa, bir yığına atılan son değeri (her zaman a
0
veya1
) çıkarın ve programı sonlandırın.Aksi takdirde, imlecin hareket ettiği yığın boş değilse, 1. adıma dönün ve işlemi tekrarlayın.
Bu zorluk için gerçekleştirilecek en önemli şey, tüm Stackylogic programlarının bir doğruluk tablosuna eşit olmasıdır . Bazı önceden belirlenmiş sayıda boolean değeri girilir ve tam olarak bir boolean deterministik olarak çıkar.
Bu nedenle göreviniz, verilen herhangi bir doğruluk tablosuyla aynı çıktıya sahip olan veya benzeyen bir Stackylogic programı oluşturmaktır. Ancak Stackylogic'in herhangi bir doğruluk tablosunu simüle edebileceği açık değildir , bu yüzden indüksiyonla bir kanıt :
Temel Durum
İki 0-girişli doğruluk tablosu her zaman
0
veya çıktı veren tablolardır1
. Bu tabloların Stackylogic eşdeğerleri sırasıyla0<
ve1<
.Endüktif Adım
Stackylogic'in herhangi bir N-giriş doğruluk tablosunu simüle edebileceğini varsayın. M = N + 1 olsun.
Bir M-giriş masası, T, iki N-tablo giriş, T olarak ifade edilebilir 0 ve T 1 , artı B 0 ek giriş biti B., T sonucu 0 kullanılır. B 1 olduğunda, T sonucu 1 kullanılır.
Örneğin, sözde koda karşılık gelen 3 girişli doğruluk tablosu
if B: result = x OR y else: result = x NAND y
dır-dir
B x y | result 0 0 0 | 1 0 0 1 | 1 0 1 0 | 1 0 1 1 | 0 1 0 0 | 0 1 0 1 | 1 1 1 0 | 1 1 1 1 | 1
Bu gerçekten NAND ve OR için iki girişli iki doğruluk tablosu.
S 0 ve S 1 sırasıyla T 0 ve T 1'i karşılayan Stackylogic programları olsun (bunların ilk varsayım temelinde var olduğunu biliyoruz). T'yi karşılayan S programı daha sonra şu şekilde yapılandırılabilir:
[lines of S0 excluding the cursor, with 0 appended to all lines below the cursor] ?< [lines of S1 excluding the cursor, with 1 appended to all lines above the cursor]
S arasındaki Bu düzenleme etkili bir muxes 0 ve S 1 (hattından birinci giriş bit göre
?<
). Eğer öyleyse,0
imleç ekli0
olanları S 0'ın orijinal imleç konumuna kadar sürecek, daha sonra boş yığınlarla üst ve alt kenarlarla sınırlanacak ve böylece orijinal S 0 ile tamamen aynı olacaktır . Aynı şekilde,1
girdidir, imleç binecek1
'S aşağı s 1 s imleç pozisyonu' ve yalnız sanki bunu çalıştırmak için devam edin.Örneğin, OR ve NAND için Stackylogic programları
? ?<
ve
1 ?< 11 ? 0
Simüle etmek için birleştirilebilirler
if B: result = x OR y else: result = x NAND y
şöyle:
1 ? 110 ?0 00 0 ?< ?1 ?
Böylece, herhangi bir doğruluk tablosu bir Stackylogic programı ile simüle edilebilir.
Meydan okuma
N giriş doğruluk tablosunu (N> 0) alan , tablo çıkışlarını artan ikili sırada temsil eden 2 N boole değeri listesi şeklinde alan bir program veya işlev yazın .
Herhangi bir makul giriş formatı uygundur. örneğin bir OR doğruluk tablosu için
x y | OR
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 1
bu giriş stillerinden herhangi biri iyi olur:
0111
0, 1, 1, 1
0
1
1
1
[False, True, True, True]
Doğruluk tablosunu karşılayan, yani aynı girdi verildiğinde aynı çıktıya sahip bir Stackylogic programı yazdırın veya döndürün. Tabloyu sağlayan herhangi bir sonlu program geçerli çıktıdır. Endüktif kanıtın yapım yöntemini izlemenize gerek yoktur. Stackylogic programlarının en iyi şekilde kısa olması gerekmez.
Örneğin, girdi olsaydı, 11100111
geçerli bir çıktı
1
?
110
?0
00
0
?<
?1
?
ama daha birçokları var.
Bayt cinsinden en kısa kod kazanır.
Bir tercümana ihtiyacınız varsa orijinal Stackylogic yarışmasına bakın .