Latar Belakang
Stack Cats adalah bahasa esoterik yang dapat dibalik yang dibuat oleh Martin Ender. Setiap perintah dalam Stack Cats adalah kebalikan dari dirinya sendiri (diwakili sebagai karakter simetris, seperti -_:T|
), atau memiliki perintah kebalikannya (diwakili sebagai gambar cermin, seperti ()
{}
[]
<>
). Stack Cats memiliki persyaratan sintaksis yang kuat bahwa keseluruhan program harus menjadi citra cermin itu sendiri. Perhatikan bahwa ini berarti program Stack Cats yang valid adalah ambigram gambar cermin alami .
Berikut ini seluruh rangkaian perintah Stack Cats:
- Simetris diri:
!*+-:=ITX^_|
- Pasangan simetris:
()
{}
[]
<>
\/
Karakter lain tidak valid; setiap input yang memiliki karakter tidak dalam karakter yang ditetapkan di atas harus menghasilkan false.
Bahasa memiliki kendala tambahan yang harus dipasangkan ()
dan {}
berpasangan, tetapi demi kesederhanaan, Anda tidak perlu memeriksa kondisi ini.
Berikut ini adalah beberapa contoh program Stack Cats yang valid (sekali lagi, perhatikan bahwa Anda tidak memeriksa parens seimbang):
{[+]==[+]}
[)>^<(]
({T)}|{(T})
<(*]{[:!-_:>}<[<)*(>]>{<:_-!:]}[*)>
Ini bukan:
b<+>d
())(
({[<++<]})
Tantangan
Tulis program atau fungsi yang menentukan apakah string yang diberikan adalah program Stack Cats yang valid. Kode Anda juga harus berupa ambigram gambar cermin alami , yang berarti:
- Kode Anda harus merupakan citra cermin itu sendiri.
- Kode Anda mungkin memiliki satu atau lebih baris baru, selama keseluruhan kode, ditampilkan secara alami, adalah gambar cermin itu sendiri.
- Anda dapat menghilangkan atau menambahkan spasi putih pada setiap baris, karena itu tidak mengubah tampilan.
- Karakter tab tidak diperbolehkan karena mereka memiliki beberapa ambiguitas pada layar.
Catatan: kode Anda tidak harus merupakan program Stack Cats yang valid; mungkin berisi karakter tambahan tertentu yang tidak diperbolehkan di Stack Cats. (Lihat di bawah untuk daftar lengkap.)
Misalnya, dua program berikut ini simetris (dan dengan demikian pengajuan yang valid ), sedangkan yang ketiga tidak:
({bTd})
[<q|p>]
({bTd})
IXI
({bTd})
IXI
- Mengenai "simetri cermin", hanya simetri gaya Kucing Tumpukan yang dipertimbangkan (mis.
({IH})
Bukan pengajuan yang valid, meskipun memiliki simetri cermin). - Kode Anda hanya dapat berisi set karakter ini, ditambah baris baru:
- Self-symmetric: space (
0x20
) +!"'*+-.8:=AHIMOTUVWXY^_ovwx|
- Pasangan simetris:
()
/\
<>
[]
bd
pq
{}
- Self-symmetric: space (
Set karakter dipilih untuk benar-benar simetris atau simetris sendiri ketika ditampilkan sebagai kode pada SE.
Masukan dan keluaran
Rentang input adalah string satu-baris karakter ASCII yang dapat dicetak .
Anda dapat memilih untuk mengambil input sebagai string, daftar karakter, atau daftar nilai ASCII.
Anda dapat memilih untuk menampilkan:
- Nilai-nilai kebenaran / kepalsuan seperti yang didefinisikan oleh bahasa pilihan Anda
- Nilai hasil aktual dapat berbeda antara input (misalnya output 1 untuk input yang benar dan 2 untuk input yang benar lain).
- Bertukar nilai kebenaran dan kepalsuan tidak diizinkan.
- Setiap dua nilai konstan untuk true / false masing-masing
- Dalam hal ini, nilai-nilai hasil harus tepat menjadi salah satu dari dua nilai konstan.
Anda harus menentukan metode input dan nilai output dalam kiriman Anda.
Kondisi Menang
Ini adalah kode-golf , sehingga byte terendah di setiap bahasa menang.
Catatan
- Celah standar dilarang seperti biasa.
- Tentu saja Anda dapat menyelesaikan ini di Stack Cats, tetapi kemungkinan Anda tidak dapat menggunakan flag yang memungkinkan untuk mengurangi ukuran kode Anda hingga setengahnya. Dan ini adalah bahasa yang sangat sulit untuk dipahami: P
sumber
#
tidak diizinkan?Jawaban:
JavaScript (ES6),
487467378298292280266264 byteDisimpan 14 byte berkat @Bubbler
Menentukan fungsi anonim yang mengambil array karakter dan mengembalikan output yang diinginkan. Output benar / salah; biasanya
1
/0
, tetapi string kosong memberitrue
.Bagaimana?
Trik yang paling jelas adalah menggunakan
//\\
sebagai titik pusat untuk mengomentari versi mirror dari kode. Setelah itu, itu menjadi permainan mencari tahu cara terpendek untuk menyelesaikan masalah dengan hanya menggunakan rangkaian karakter yang diberikan.Masalah pertama yang kami hadapi adalah kurangnya kata kunci dan bawaan. Kami secara ajaib masih memiliki
.pop()
, tetapi segala sesuatu yang lain harus dilakukan melalui operator yang diizinkan (yang termasuka[b]
danf(c)
), dengan rekursi untuk meniru loop.Masalah kedua adalah kurangnya operator yang logis. Tidak juga
&
dan?
diizinkan, yang berarti satu - satunya operator pengambilan keputusan yang dapat kita gunakan adalah||
. Karena itu, kita harus hati-hati menyusun logika kita untuk menjelaskan hal ini.Hal pertama yang saya lakukan adalah mendefinisikan fungsi
T
yang mencerminkan karakter individu. Ide dasarnya adalah untuk mengulangi setiap karakter dalam serangkaian karakter yang dapat dipantulkan cermin, menguji masing-masing untuk kesetaraan dengan karakter yang diberikan. Jika sama, kita mengembalikan cerminnya — arangindex^1
untuk(){}[]<>\/
, atau arang itu sendiri untuk sisanya.Masalah pertama yang saya temui di sini adalah mendapatkan nilai cermin atau nilai salah pada setiap iterasi. Solusi saya akhirnya muncul adalah
(x!=A[o]||A)[o^o<88/8]
, di manax
karakter input,A
adalah alfabet mirroring, dano
indeks saat ini. Jikax
tidak sama denganA[o]
, ini memberitrue
, dan ekspresi indeks mengevaluasi keundefined
; jika tidak,||A
ini diaktifkan, dan kami akhirnya mendapatkanA[o^(o<11)]
.Masalah kedua adalah bagaimana cara menghentikan rekursi. Saya menemukan bahwa cara terbaik untuk melakukan ini adalah dengan hanya menyatukan hasil setiap iterasi, mengembalikan string kosong ketika akhir
A
tercapai. Ini memberi kita dua masalah lebih lanjut: mengubahundefined
s ke string kosong, dan mengembalikan||
sesuatu string kosong . Ini dapat diselesaikan dengan penyalahgunaan array:[a]+""
memberikan representasi stringa
, atau string kosong jikaa
tidak ditentukan. Sebagai bonus,[]
adalah benar tetapi mengikat ke string kosong, sehingga kita dapat dengan mudah menggunakan ini sebagai "string kosong benar".Sekarang kita dapat menggunakan
T
fungsi untuk mencerminkan karakter tunggal. Kami melakukan ini secara rekursif, membandingkan cerminI[v++]
hinggaI.pop()
hingga akhir array karakter tercapai. Kami tidak dapat menggunakan&&
atau&
untuk memeriksa apakah semua perbandingan itu benar, tetapi*
sebaliknya gunakan . Mengalikan semua hasil ini bersama-sama memberi1
jika setiap karakter adalah cermin dari yang sebaliknya, atau0
jika perbandingan gagal.Dan pada dasarnya itulah jawaban ini bekerja. Saya mungkin tidak menjelaskan dengan sangat jelas, jadi tolong ajukan pertanyaan yang mungkin Anda miliki dan tunjukkan kesalahan yang saya buat.
sumber
U=([A,...H])=>!(V=H.pop())||!(W=([x,...X]=(T="!*+-:=ITX^_|")+"(){}[]<>\\/",[o,...O]=T+")(}{][></\\")=>!x||((o!=A)+(x!=V))*(W(X,O)))()*U(H)//...
280 byteStax ,
7670 byteJalankan dan debug itu
Stax adalah teman Stack Cats dan memiliki internal untuk menghasilkan paruh selanjutnya dari program Stack Cats dari babak pertama. Jika kita tidak peduli dengan pembatasan pada sumber dan tidak perlu memeriksa charset, berikut ini adalah solusi 4-byte:
4 byte
Jalankan dan debug itu
Penjelasan
sumber
R
danW
sangat menarik. Pengakhiran program denganpq
kombinasi juga mengesankan bagi saya.:R
dan:W
. Saya merasa bahwa saya tidak dapat membantu mengatakan kepada semua orang ada internal di Stax yang melakukan ini.