99 ("doksan dokuz" olarak telaffuz edilir) yepyeni bir Ezoterik programlama dilidir ( 99 ile karıştırılmamalıdır , italik yazıya dikkat edin). Buradaki göreviniz, 99 için mümkün olduğunca kısa bir tercüman yazmak . En az bayt olan gönderim kazanır. Tiebreaker ilk gönderilenlere gider.
Bu soru her zamankinden biraz daha derin olduğundan ve iyi cevaplar görmeye istekli olduğum için en sevdiğim cevaba 250 rep ödül vereceğim (mutlaka kazanan değil).
99 Spec
99 bir olan zorunlu dili. 99 programındaki her satır tek bir ifadedir ve yürütme sırasında, komut göstericisi en üst satırdan başlar ve sonraki satırların her birini sırayla izleyerek yol boyunca yürütür. Program, son satır çalıştırıldığında sona erer. Goto ifadeleri, talimat göstergesinin yolunu yeniden yönlendirebilir.
Newline, boşluk ve 99 programda 9
önemli olan sadece üç karakter . Diğer tüm karakterler tamamen göz ardı edilir. Ek olarak, her satırdaki izleyen boşluklar yoksayılır ve bir satırdaki birden çok boşluk bir boşluk olarak okunur. ("Newline", herhangi bir ortak satır sonu kodlamasını ifade eder . Tercümanınızın hangisini kullandığı önemli değildir.)
Yani bu program:
9 BLAH 99 9a9bb9c9
9 this line and the next have 6 trailing spaces 9
Bu programla aynı mı:
9 99 9999
9 9
Değişkenler
99'daki değişkenlerin tümü bir veya daha fazla 9
dizilmiş ( 9+
regex cinsinden) isimlere sahiptir . Örneğin 9
, 99
ve 9999999999
tüm farklı değişkenlerdir. Doğal olarak, sınırsız sayıda var (hafıza kısıtlamalarını kısıtlayan).
Her değişkenin değeri imzalı, keyfi bir tamsayıdır. Varsayılan olarak, her değişken kendi sayısal temsiline atanır. Bu nedenle, yeniden atanmamışsa, değişkenin değeri 9
9, değişkenin değeri ise 99
99, vb. Olur. Değişkenlere açıkça atanana kadar düz sayılar gibi davrandığını düşünebilirsiniz.
V
Aşağıda rastgele bir değişken adına başvurmak için kullanacağım .
Her örneği V
ile değiştirilmesi mümkündür 9
, 99
, 999
, 9999
, vb
tablolar
99'da beş farklı ifade türü vardır . 99 programdaki her satır tam olarak bir deyim içerir.
Burada açıklanan sözdizimi, tüm yabancı karakterlerin kaldırıldığını, tüm izleyen boşlukların kaldırıldığını ve çoklu boşlukların tüm dizilerinin tek boşluklarla değiştirildiğini varsayar.
1. işlem yok
Boş bir satır no-op'tur . Hiçbir şey yapmaz (talimat göstergesini arttırmanın yanı sıra).
2. Çıkış
V
Satırdaki tek bir değişken V
bu değişkeni stdout'a yazdırır.
V
Tek sayıda 9
( 9
, 999
vb.) Varsa , V
9'a bölünen tam sayı değeri (ondalık olarak) yazdırılır.
Eğer V
çift sayıları 9
( 99
, 9999
vb.) Varsa , 9'a bölünmüş kodlu ASCII karakteri V
mod 128 basılacaktır. (Bu (V / 9) % 128
, 0 ila 127 arasında bir değerdir.)
Örnek : Program
9
9999
yazdırırdı 1W
. İlk satır 1
9/9 1 olduğundan yazdırıyor . İkinci satır W
9999/9 1111 ve 1111 mod 128 87, 87 87 ise karakter kodudur W
.
Satır sonlarının çıktı belirteçleri arasında yazdırılmadığını unutmayın. \n
Satır sonu için açıkça yazdırılması gerekir.
3. Giriş
V
Önde boşluğu olanV
bir satırdaki tek bir değişken , stdin'den girdi alır ve onu bu değişkende saklar.
V
Tek sayıda varsa , 9
kullanıcı işaretli bir tamsayıyı yazabilir ve V
bu değerin 9 katına ayarlanır.
V
Çift sayıları varsa , 9
kullanıcı herhangi bir ASCII karakterini yazabilir V
ve karakter kodunun 9 katına ayarlanır.
Örnek : Verilen -57
ve A
girdi olarak, bu program
9
9
99
99
çıktı -57A
. Dahili olarak, değişken 9
-513 değerine ve 99
585 değerine sahip olacaktır.
Tercümanınız, girişlerin her zaman sözdizimsel olarak geçerli olduğunu varsayabilir.
4. Atama
Bu ifade keyfi olarak uzun olabilir. Satırda boşluklarla ayrılmış iki veya daha fazla değişken var:
V1 V2 V3 V4 V5 ...
Bu, tüm endekslere sahip olanların toplamına eksi olarak eksi tek endekslere sahip olanların toplamına atar (hariç ). Atamalar referans değil değere göredir.V1
V
V
V1
Çoğu dile çevrilebilir .V1 = V2 - V3 + V4 - V5 + ...
Yani, sadece iki değişken varsa, bu normal bir atamadır:
V1 V2
→ V1 = V2
Üç tane varsa, o zaman çıkarma:
V1 V2 V3
→ V1 = V2 - V3
Ve +
/ -
sign her bir ek değişkenle ileri geri geçiş yapmaya devam ediyor:
V1 V2 V3 V4
→ V1 = V2 - V3 + V4
Örnek : Bu program şöyle olur 1110123
:
999 Prints triple-nine divided by nine (111).
999 9 9 Assigns triple-nine to zero (nine minus nine).
999 Prints triple-nine divided by nine (0)
9 999 9 Assigns single-nine to negative nine (zero minus nine).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (1).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (2).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (3).
5. Goto (eğer sıfırsa zıpla)
Bu ifade ayrıca keyfi bir şekilde uzun olabilir. Bu, boşluk ile ayrılan bir çizgi, iki veya daha fazla değişken olduğu bir lider alanı :
V1 V2 V3 V4 V5 ...
Yanındaki değerlerin bazıları sıfır değil ise, o zaman no-op gibi davranır. Komut işaretçisi her zamanki gibi bir sonraki satıra taşınır.V1
Eğer bütün değerlerin yanı sıra olan sıfır, o zaman kullanıcı işaretçi dizi hat taşınır . Satırlar sıfır dizinlidir, yani sıfırsa, işaretçi üst satıra gider. Olumsuz veya mümkün olan en yüksek endeksten daha büyükse program (normalde hatasız) sona erer ( satır eksi bir satır).V1
V1
V1
V1
Not Burada 9 bölü değildi. Ve bir değişkenin 9'un katı olmadığı bir değer olması imkansız olduğundan, yalnızca 9'un katı olan satır sayıları atlanabilir.V1
Örnekler:
Bu program 1
sonsuza dek yazacaktır:
9 Prints single-nine divided by nine (always 1).
99 9 9 Assigns double-nine to zero.
99 99 Jumps to line zero (top line) if double-nine is zero.
Bu program
99999999 Print G.
999 99 Set triple-nine to ninety-nine.
9999999999 9999999999 9999999999 99 99 9 9 999 999 Set 10-nine to zero.
99999999999 9999999999 Set 11-nine to zero.
999 Print triple-nine's value divided by nine. (This is the ninth line.)
99999999 Print G.
999 999 9 Subtract nine from triple-nine.
99999 999 Jump to line 5-nines if triple-nine is zero (ends program).
9 99999999999 9999999999 Jump to line nine if 10-nine and 11-nine are zero (always jumps).
11'den 1'e kadar olan sayıları azalan sırayla, G
'ile çevrili olarak çıkarır:
G11G10G9G8G7G6G5G4G3G2G1G
ek detaylar
İdeal tercüman, 99 program dosya ismi ile komut satırından bağımsız değişken olarak çalışacaktır . G / Ç ayrıca komut satırında anında yapılır.
Bununla birlikte, programda bir dize gibi giriş belirteçlerinin bir listesini (örneğin ["-57", "A"]
) alan bir tercüman işlevi yazabilirsiniz . İşlev, çıkış dizesini yazdırmalı veya döndürmelidir.
Tercüman çalıştırmanın ve G / Ç işlemlerini kullanmanın biraz farklı yolları, bu seçenekler sizin dilinizde imkansızsa.
Bonus: 99'da havalı bir şeyler yazın ve memnuniyetle bu yazıya bir örnek olarak koyacağım.
- İşte Pastebin var gelen programın "Bira 99 şişeler" düzgün bir Mac cevap .