Skema Piramida adalah bahasa yang dikembangkan oleh @ ConorO'Brien . Dalam Skema Piramida, kode yang Anda tulis terlihat seperti ini:
^ ^
/ \ /3\
/ \ ---
/ + \
^-------^
/9\ /3\
/123\ ---
-----
Sekarang, kode itu memiliki dua kualitas yang jelas: Sulit untuk diurai, dan sulit untuk menulis. Conor telah memecahkan yang pertama, namun tugas Anda untuk menyelesaikan masalah kedua itu.
Kode di atas diproses oleh interpreter PyramidScheme menjadi array string bersarang, seperti ini:
[["+", ["9123", "3"]], "3"]
Tugas Anda adalah menulis sebuah program atau fungsi, yang diberi serangkaian string, bersarang, atau mengembalikan kode PyramidScheme yang dibuat ulang. Anda dapat mengasumsikan bahwa array input akan selalu valid.
Piramida adalah segitiga sama kaki. Bagian atas adalah ^
, sisi miring secara diagonal menjauh dengan /
dan \
, dan bagian bawahnya -
. Dua sudut bawah kosong atau berisi awal dari piramida lain, yang merupakan argumen. Bagian tengah diisi dengan nama piramida, mengabaikan garis putus-putus.
Inilah cara pengurai mengubah kode menjadi format yang bisa digunakan. Pertama, memindai piramida tingkat atas. Jika tidak membutuhkan argumen, ia merepresentasikannya dengan string tunggal dan melanjutkan. Kalau tidak, itu mewakili sebagai array ["name",[arg1,arg2]]
atau ["name",[arg1]]
. Argumennya adalah piramida di kiri bawah dan kanan bawah piramida, yang bisa berupa string atau lebih array yang dijelaskan di atas. Anda mungkin memperhatikan bahwa ini agak mirip dengan Lisp, dalam hal ini Anda mungkin juga telah memperhatikan kata-kata buruk yang merupakan nama bahasa. Setelah piramida terwakili sepenuhnya, parser bergerak ke yang berikutnya.
Ini kode-golf , kode terpendek menang!
Kasus Uji: Ini bukan satu-satunya output yang valid, ini adalah contoh dari output yang valid.
[["+", ["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\
---
Perhatikan dalam kasus uji kedua, out
piramida kedua dan ketiga memiliki ["chr", ["108"]]
parameter, yang diciutkan menjadi satu tumpukan piramida yang dibagi oleh dua yang tingkat atas. Ini adalah pengoptimalan yang valid yang didukung oleh kode Anda, tetapi sepenuhnya opsional; penilaian tidak didasarkan pada panjang output Anda.
Bagi yang penasaran, kasing pertama ditampilkan 9126 3
karena pencetakan implisit piramida tingkat atas, yang kedua dicetak Hello
, dan yang terakhir adalah kesalahan sintaksis, termasuk hanya karena memiliki struktur yang rapi.
Anda mungkin menganggap bahwa input hanya berisi ASCII dicetak, tidak termasuk spasi, ^
, /
, \
, dan -
. Masukan akan selalu valid, dan mengandung setidaknya satu piramida. Tidak ada batasan pada ukuran array atau string input, namun Anda dapat menulis kode Anda seolah-olah jenis integer default bahasa Anda adalah ketepatan tak terbatas dan bahwa komputer Anda memiliki memori sewenang-wenang. Jika mengambil input sebagai string tunggal, Anda dapat menggunakan sesuatu yang masuk akal (koma, spasi, dll. Asalkan itu dalam ascii yang dapat dicetak dan tidak "
atau []
) untuk membatasi array. Anda tidak harus menyertakan tanda kurung yang mengelilingi semuanya, dan alih-alih mengambil beberapa array yang dipisahkan oleh pembatas Anda.
Output Anda tidak harus di-golf, Anda dapat memasukkan ruang ekstra atau membuat piramida Anda lebih besar dari yang diperlukan. Piramida Toplevel harusnya ada di baris pertama. Output harus berupa string dengan baris baru atau daftar string.
Siapapun yang melakukan menyertakan versi kode mereka yang optimal golfs piramida mungkin menerima beberapa rep dalam bentuk upvotes / karunia (tapi mungkin hanya upvotes).
Jawaban:
Lisp Umum -
25241890 byteTerima kasih kepada @coredump untuk sejumlah trik golf. Sampel keluaran dari pertanyaan:
Berikut ini adalah versi asli, (kebanyakan) ungolfed:
Cobalah secara Online!
sumber
()
; Anda juga dapat menggunakan variabel pembaca, terkadangloop while (not x)
isloop until x
,(cdr (cdr x))
is(cddr x)
,(setf a b c d)
lebih pendek dari(setf a b)
diikuti oleh(setf c d)
, dll. Tetapi ini sudah merupakan jawaban yang bagus