Starry , kodun yalnızca +*.,`'
bu karakterlerin her biri tarafından temsil edilen asıl komutun önündeki boşlukların sayısı tarafından belirlendiği yerlerden oluştuğu komik bir ezoterik programlama dilidir . Bu, sabit çıktı zorluklarını golf oynamak için bile zorlaştırır, çünkü farklı komutlar çok farklı sayıda bayt için hesap verebilir. Özellikle, sayı hazırlayıcıları, daha küçük sayılar üzerinde çalışarak daha büyük sayılar oluşturmayı gerekli kılan tek bir temsilidir.
Bu nedenle, bu zorluk, bu tür Yıldızlı programları golf edebilecek bir program yazmakla ilgilidir.
Starry nasıl çalışır?
(Bazı detaylar, esolangçlarda belirtilmemiş olarak bırakılıyor, bu yüzden Ruby tercümanının davranışına gidiyorum .)
Starry, tek bir isteğe bağlı tamsayı değerleri (başlangıçta boş olan) içeren bir yığın tabanlı dildir.
Tek anlamlı karakterler:
+*.,`'
ve boşluklar. Diğer tüm karakterler göz ardı edilir. Boşluk olmayan karakterlerden birinin izlediği her boşluk sırası, tek bir talimatı temsil eder. Öğretim tipi boşluk olmayan karaktere ve boşluk sayısına bağlıdır.
Talimatlar:
Spaces Symbol Meaning
0 + Invalid opcode.
1 + Duplicate top of stack.
2 + Swap top 2 stack elements.
3 + Rotate top 3 stack elements. That is, send the top stack element
two positions down. [... 1 2 3] becomes [... 3 1 2].
4 + Pop and discard top of stack.
n ≥ 5 + Push n − 5 to stack.
0 mod 5 * Pop y, pop x, push x + y.
1 mod 5 * Pop y, pop x, push x − y.
2 mod 5 * Pop y, pop x, push x * y.
3 mod 5 * Pop y, pop x, push x / y, rounded towards -∞.
4 mod 5 * Pop y, pop x, push x % y. The sign of the result matches the sign of y.
0 mod 2 . Pop a value and print it as a decimal number.
1 mod 2 . Pop a value and print it as an ASCII character. This throws an error
if the value is not in the range [0, 255].
n ` Mark label n.
n ' Pop a value; if non-zero, jump to label n.
Tercümanın, yürütme başlamadan önce etiketlerin kaynak kodunu taradığını unutmayın, bu nedenle geriye ve geriye doğru atlamak mümkündür.
Elbette, Starry'nin de giriş komutları vardır ( ,
benzer şekilde kullanılır .
), ancak bunlar bu zorluk için anlamsızdır.
Meydan okuma
Bir dize verildiğinde, girdi almayan ve bu dizeyi tam olarak STDOUT'a basan bir Starry programı oluşturun.
STDIN (veya en yakın alternatif), komut satırı argümanı veya işlev argümanı yoluyla giriş alarak ve sonucu STDOUT (veya en yakın alternatif), fonksiyon dönüş değeri veya function (out) parametresi ile çıktı alarak bir program veya işlev yazabilirsiniz.
Dizenin 128 karakterden uzun olmadığını ve yalnızca yazdırılabilir ASCII karakterlerinden oluşacağını varsayabilirsiniz (kod noktaları 0x20 - 0x7E).
Çözümünüz makul bir masaüstü bilgisayarında bu tür girişleri 5 dakikadan daha az bir sürede işlemelidir (buna biraz yer var; dizüstü bilgisayarımda birkaç dakika daha fazla sürerse sorun çıkarmaz, ancak 15 sürerse diskalifiye edeceğim o).
Çözümünüz, aşağıda listelenen bir dizi farklı dizi üzerinde test edilecektir. Puanınız, karşılık gelen Yıldızlı programların toplam bayt sayısıdır. Beraberlik durumunda, en kısa metagolfer kazanır. Diğer bir deyişle, bir beraberlik olmadıkça kendi kodunuzu silmekten çekinmeyin (bence sadece optimal bir çözümün mümkün olması durumunda gerçekleşir).
Kodunuzu aşağıda listelenen belirli test durumlarına göre optimize etmemelisiniz. Özellikle, onlar için el yapımı çözümler kod yazmamalısınız. Yapısı verilen karakter dizisine benzer karakter dizileri sınıfına göre optimizasyon iyidir. Kodlama çözümlerinden herhangi birinin şüphesini alırsam, test durumlarının bazılarını veya tümünü değiştirme hakkını saklı tutarım (karşılaştırılabilir yapıların dizeleriyle).
Test Kılıfları
Her satır ayrı bir test durumudur:
Hello, World!
pneumonoultramicroscopicsilicovolcanoconiosis
.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.
Hickory, dickory, dock. The mouse ran up the clock. The clock struck 1. The mouse ran down. Hickory, dickory, dock.
36912059868043514648560046917066768694455682545071266675083273015450033938555319356951628735735013250100789433961153496780296165
bVZ48121347GLtpYnt76CZSxTpMDs6791EJE808077eySXldY162424ddTB90707UupwlWGb63618542VhA252989453TXrWgqGm85899uHOAY2oAKE198GOVUttvW63
7MYxoWBNt180CDHS5xBGvU70HHVB17bh8jYzIIiU6n6g98Rose1nOe8Svcg56nax20q30kT3Ttb2jHl5q2Iuf1vPbjPxm9cyKXwxc0OUK8pr13b2n7U9Y7RwQTc26A1I
n9}unwxVa}[rj+5em6K#-H@= p^X/:DS]b*Jv/_x4.a5vT/So2R`yKy=in7-15B=g _BD`Bw=Z`Br;UwwF[{q]cS|&i;Gn4)q=`!G]8"eFP`Mn:zt-#mfCV2AL2^fL"A
İkinci test senaryosu için kredi Dennis'e gidiyor . Dördüncü test vakası için kredi Sp3000'e gitti.
Referans çözümü
İşte CJam'da gerçekten temel bir referans çözümü:
q{S5*\iS*'+S'.}%
Burada tüm test odasına karşı koşabilirsiniz. Puanlar:
1233
5240
4223
11110
7735
10497
11524
11392
Total: 62954
Mümkün olan en basit yaklaşım budur: her karakterin kod noktasını değişmez olarak itin ve yazdırın. Ardışık karakterler, tamsayı baskı, dizenin tekrarlayan kısımları vb. Arasındaki küçük farkları kullanmaz. Bunları size bırakacağım.
Gelişme için çok yer olduğuna inanıyorum. Başvuru için, el yapımı en kısa "Merhaba, Dünya!" sadece 169 byte uzunluğunda.