Pyramid Scheme @ ConorO'Brien tarafından geliştirilen bir dildir . Piramit Düzeninde, yazdığınız kod şöyle görünür:
^ ^
/ \ /3\
/ \ ---
/ + \
^-------^
/9\ /3\
/123\ ---
-----
Şimdi, bu kodun iki belirgin özelliği var: Ayrıştırılması zor ve yazması zor. Conor ilki çözdü, ancak bu ikinci sorunu çözmek sizin işiniz olacak.
Yukarıdaki kod PyramidScheme yorumlayıcısı tarafından aşağıdaki gibi iç içe bir dizge halinde işlenir:
[["+", ["9123", "3"]], "3"]
Göreviniz, iç içe dizgeler dizisi verilen, yeniden oluşturulan PyramidScheme kodunu çıkaran veya veren bir program veya işlev yazmaktır. Giriş dizisinin her zaman geçerli olacağını varsayabilirsiniz.
Bir piramit ikizkenar üçgendir. En iyi olan ^
çapraz uzak tarafını eğimi, /
ve \
ve alt edilir -
. İki alt köşe ya boştur ya da argümanlar olan diğer piramitlerin başlangıcını içerir. Orta, piramitlerin ismiyle doludur, satır sonlarını görmezden gelir.
Ayrıştırıcı kodu kullanılabilir bir biçime dönüştürür. İlk olarak, bir üst seviye piramit tarar. Argüman almazsa, onu tek bir dizeyle temsil eder ve devam eder. Aksi takdirde, temsil eden bir dizi ["name",[arg1,arg2]]
veya ["name",[arg1]]
. Argümanlar, piramidin sol alt ve sağ altındaki piramitler olup, yukarıda belirtildiği gibi sicim ya da daha fazla dizi olabilir. Bunun biraz Lisp'e benzediğini fark edebilirsiniz, bu durumda dil adı olan korkunç kelimeyi de fark etmiş olabilirsiniz. Piramit tamamen temsil edildikten sonra ayrıştırıcı bir sonrakine geçer.
Bu kod golf , en kısa kod kazanır!
Test Durumları: Bunlar sadece geçerli çıktılar değil, bunlar geçerli çıktılara örnek.
[["+", ["9123", "3"]], "3"]
^ ^
/ \ /3\
/ \ ---
/ + \
^-------^
/9\ /3\
/123\ ---
-----
[["out", [["chr", ["72"]], ["chr", ["101"]]]], ["out", [["chr", ["108"]]]], ["out", [["chr", ["108"]]]], ["out", [["chr", ["111"]]]]]
^ ^ ^ ^
/ \ / \ / \ / \
/out\ /out\ /out\ /out\
^-----^ -----^----- -----^
/ \ / \ / \ / \
/chr\ /chr\ /chr\ /chr\
^----- -----^ -----^ ^-----
/ \ / \ / \ / \
/72 \ /101\ /108\ /111\
----- ----- ----- -----
[ ["+", [ ["asdfghjkl"], ["do", [ "1" ]] ]] ]
^
/ \
/ + \
/ \
^-------^
/a\ /d\
/sdf\ /o \
/ghjkl\ ^-----
-------/1\
---
İkinci test durumunda, ikinci ve üçüncü out
piramidin her ikisi de ["chr", ["108"]]
, iki üst seviye olan tarafından paylaşılan bir piramit yığına daraltılan bir parametresi olarak bulunur. Bu, kodunuzun destekleyebileceği geçerli bir optimizasyondur, ancak tamamen isteğe bağlıdır; puanlama, çıktınızın uzunluğuna bağlı değildir.
Meraklı için, ilk vaka 9126 3
üst düzey piramitlerin örtük şekilde basılmasından kaynaklanıyor, ikincisi yazdırıyor Hello
ve sonuncusu da sadece düzgün bir yapıya sahip olduğundan sözdizimi hatası.
Sen girişi sadece yazdırılabilir ASCII hariç boşluklar içerdiğini varsayalım olabilir ^
, /
, \
ve -
. Giriş her zaman geçerli olacak ve en az bir piramit içerecektir. Dizinin büyüklüğü veya giriş dizgisi sınırlaması yoktur, ancak kodunuzu dilinizin varsayılan tamsayı türü sonsuz hassasiyetmiş gibi ve bilgisayarınızın keyfi belleğine sahipmiş gibi yazabilirsiniz. Tek bir dize olarak girdi alıyorsanız, dizileri sınırlandırmak için makul herhangi bir şey (virgül, boşluk, vb. Basılabilir şekilde "
veya değil []
) kullanabilirsiniz. Tüm şeyi çevreleyen köşeli parantezler dahil etmek zorunda değilsiniz, bunun yerine sınırlayıcınızla ayrılmış çoklu diziler almanız gerekmez.
Çıktınızın golf oynamak zorunda olması gerekmez, fazladan boşluk ekleyebilir veya piramitlerinizi gereğinden fazla büyütebilirsiniz. Toplevel piramitler gereken ilk satırda olmak. Çıktı, yeni satırlı bir dize veya bir dize listesi olmalıdır.
Herkes yapar optimal piramitleri çoraplar kendi kod versiyonunu içerir upvotes / nimetlerini (ama muhtemelen sadece upvotes) şeklinde bazı temsilcisi alabilirsiniz.