Cari tahu apakah ini program Stack Cats yang valid, dengan gaya Stack Cats!

16

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 {}

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 , 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
Bubbler
sumber
1
Mengapa tajam #tidak diizinkan?
tsh
1
@ tsh Ini sedikit miring pada banyak font, termasuk font kode pada SE (setidaknya itu yang saya lihat di Chrome).
Bubbler
@Dosc saya mencoba menjelaskan beberapa poin di sekitarnya. Tetapi jika Anda pikir uraiannya masih belum jelas, silakan edit.
Bubbler
Terkait Terkait
Martin Ender

Jawaban:

16

JavaScript (ES6), 487 467 378 298 292 280 266 264 byte

Disimpan 14 byte berkat @Bubbler

I=>(V=v=>!I[v]||((T=o=>[[]][+!!A[o]]||[(I[v]!=A[o]||A)[o^o<88/8]]+T(++o))(8-8)==I.pop())*V(++v))(V|(A='(){}[]<>\\/ !*+-:=ITX^_|'))//\\(('|_^XTI=:-+*! \//<>[]{}()'=A)|V)((v++)V*(()qoq.I==(8-8)((o++)T+[[8\88>o^o](A||[o]A=![v]I)]||[[o]A!!+][[]]<=o=T))||[v]I!<=v=V)<=I

Menentukan fungsi anonim yang mengambil array karakter dan mengembalikan output yang diinginkan. Output benar / salah; biasanya 1/ 0, tetapi string kosong memberi true.

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 termasuk a[b]dan f(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 Tyang 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 — arang index^1untuk (){}[]<>\/, 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 mana xkarakter input, Aadalah alfabet mirroring, dan oindeks saat ini. Jika xtidak sama dengan A[o], ini memberitrue , dan ekspresi indeks mengevaluasi ke undefined; jika tidak, ||Aini diaktifkan, dan kami akhirnya mendapatkan A[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 Atercapai. Ini memberi kita dua masalah lebih lanjut: mengubah undefineds ke string kosong, dan mengembalikan ||sesuatu string kosong . Ini dapat diselesaikan dengan penyalahgunaan array: [a]+""memberikan representasi string a, atau string kosong jika atidak 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 Tfungsi untuk mencerminkan karakter tunggal. Kami melakukan ini secara rekursif, membandingkan cermin I[v++]hingga I.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 memberi 1jika setiap karakter adalah cermin dari yang sebaliknya, atau 0jika 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.

Produksi ETH
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 byte
tsh
@tsh koma tidak diperbolehkan dalam kode sumber, karena tidak simetris (dalam font kode SE) dan tidak memiliki mirror (dalam ASCII, pokoknya)
ETHproductions
maaf, saya melewatkan bagian itu.
tsh
@ tsh Saya melewatkannya juga pada awalnya, dan menghabiskan 20 menit pada solusi hanya untuk menyadari bahwa itu tidak valid: P
ETHproductions
Lagi pula, karena Anda sudah memposting solusi JavaScript. Kami tidak memerlukan solusi JSF * k lainnya sekarang ... // Jika saya jadi Anda, saya akan memperbaikinya dengan hanya mengompilasinya ke JSF * k ...
tsh
1

Stax , 76 70 byte

:Wx^^MH_=_"{([</!*+-:=ITX^_|":W-!*pq*!-W:"|_^XTI=:-+*!\>])}"_=_HM^^xW:

Jalankan 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

:R_=

Jalankan dan debug itu

Penjelasan

:Wx^^MH_=_"{([</!*+-:=ITX^_|":W-!*pq...
:W                                         "Mirror" the string
                                           Equivalent to appending the reverse of the string to itself
                                           And map `{([</\>])}` to its mirror in the appended string
  x^^                                      2, but we can't just use `2` here ...
     MH                                    Partition the "mirror"ed string to two parts, take the later part.
       _=                                  The string is the same as the original one (*)
                                           `:Wx^^MH_=` is just `:R_=`, but we can't use `R` here ...
         _                                 Input string
          "{([</!*+-:=ITX^_|":W-           Remove valid characters from input
                                !          The final string is empty (**)
                                 *         (*) and (**)
                                  p        Pop and print result
                                   q       Peek stack and print
                                           Since the stack is now empty, this causes the program to terminate
                                    ...    Not executed
Weijun Zhou
sumber
Keberadaan Rdan Wsangat menarik. Pengakhiran program dengan pqkombinasi juga mengesankan bagi saya.
Bubbler
Terima kasih. Instruksi sebenarnya dua byte: :Rdan :W. Saya merasa bahwa saya tidak dapat membantu mengatakan kepada semua orang ada internal di Stax yang melakukan ini.
Weijun Zhou