Mor Yorumlayıcı Golf
Mor , iki ana amaç için tasarlanmış bir esolang:
- Patlıcanın en aza indirilmesi için, etrafında sadece kendi kendini değiştiren tek talimat dilleri yoktur.
- Korkunç derecede küçük golfçü tercümanlar olasılığını kabul etmek . Makul tam özellikli bir Python 2 yorumlayıcısında ilk geçişim sadece 702 bayt ve eminim daha deneyimli bir golfçü bundan biraz tıraş olabilir.
Amacınız bu dil için bir tercüman yazmaktır.
Mor hakkında bilgi:
Mor program, programın ilk karakteri sıfır adrese yerleştirilecek şekilde sonsuz, adreslenebilir bir bellek dizisine yerleştirilen bir karakter dizisidir. Dizinin geri kalanı (Mor programın depolanmasından önce ve sonra) sıfıra başlatılır.
Purple'da a ve b ve i adında üç kayıt vardır; bunların her biri işaretli bir tamsayıyı tutabilir ve sıfıra sıfırlanır. i aynı zamanda komut göstergesidir ve her zaman yürütülmekte olan Mor talimatı gösterir.
Her döngü, yorumlayıcı, talimat işaretçisi tarafından belirtilen bellek konumundan başlayarak üç bitişik karakterden oluşan bir sekans okuyacak ve bu sekansı Mor talimat olarak yürütmeye çalışacaktır. Daha sonra, talimat işaretçisi her zaman 3 arttırılır.
Sözdizimsel olarak, Mor komutu arka arkaya " xyz " gibi üç karakterden (veya kodlamalarından) oluşur .
İlk x karakteri aşağıdakilerden herhangi biri olabilir:
abABio
Bu semboller şu anlama gelir:
a - Place the result in register a.
b - Place the result in register b.
A - Place the result in the location in memory referred to by register a.
B - Place the result in the location in memory referred to by register b.
i - Set the instruction pointer to the result.
o - Output the result to stdout.
Diğer iki bayt y ve z aşağıdakilerden herhangi biri olabilir:
abABio1
Bu sembollerin her biri şu anlama gelir:
a - Return the contents of register a.
b - Return the contents of register b.
A - Return the contents of the memory array at the address stored in register a.
B - Return the contents of the memory array at the address stored in register b.
i - Return the contents of register i (the instruction pointer).
o - Return the value of a single character read from stdin.
1 - Return the literal numeric value 1.
Talimatı getirdikten sonra, Mor yorumlayıcı y ve sonra z'yi değerlendirir , z'nin sonucunu y sonucundan çıkarır ve sonra fark üzerinde x ile belirtilen eylemi gerçekleştirir .
Üç karakter dizisi (veya kodlamaları) geçerli bir Mor talimat değilse, yorumlayıcı herhangi bir hata vermeden hemen durur.
Tercümanınız:
- İşlev değil, tam bir program olun.
- EOF okunmadıkça asla stderr'e çıkış yapmayın .
- Aşağıda verilen test programları da dahil olmak üzere çok büyük sayı içermeyen tüm iyi oluşturulmuş girdilerdeki referans uygulamasına aynı şekilde davranın. (Eh, aynı zamanlamaya kadar - daha yavaş çalışabilir, ancak çok fazla değil!)
Programı tercümana istediğiniz herhangi bir biçimde sağlayabilirsiniz: bir dosyadan okuyun, programa bir dize olarak gömün veya stdin'den okuyun.
Test senaryoları:
Program
ooo
girdi ile çalıştırıldığında
z!
vermeli
Y
Program
bbboobiii
girdi ile çalıştırıldığında
It's a cat program.
(veya başka herhangi bir girdi)
It's a cat program.
(veya aldığı her giriş) ve ardından baştan başlayın ve aynı şeyi tekrar yapın .
Program
Aoab11bi1bABoAaiba
girdi ile çalıştırıldığında
0
vermeli
0
ve sonra durun, ancak girdi ile çalıştırıldığında
1
çıktı almaya devam etmeli
1
sonsuza dek.
Program
b1bbb1oAbabaa1ab1Ab1Bi1b
vermeli
b1bbb1oAbabaa1ab1Ab1Bi1b
Program
aA1aa1bb1oAbbi1bb1bbAb1Bi1b Purple is the awesomest! Why haven't you tried it yet?
!dlroW ,olleG
vermeli
Hello, World!
puanlama:
Bu kod-golf , aşağıdaki bonus tarafından potansiyel olarak değiştirildiği gibi, bayt cinsinden en kısa kaynak kazanır.
Bonus:
- Tercümanınız stdin'den veya komut satırı bağımsız değişkeninden bir dosya adı okuyor ve programı dosyadan yüklüyorsa% -10.
uint32
karakterler için ve INTS için MAXINT kullanmalıyım