Stack Cats adalah bahasa berbasis stack yang dapat dibalik. Sifatnya yang dapat dibalik membuat loop yang agak aneh. Tantangan ini adalah tentang loop bersyarat (...)
. Ketika loop ini bersarang dengan cara tertentu, dimungkinkan untuk mengubah kode untuk mengurangi kedalaman bersarang. Berikut adalah aturannya (di mana A
dan B
berdiri untuk cuplikan yang sewenang-wenang):
- Ketika satu loop dimulai dengan loop lain, kita dapat mengekstrak loop dalam ke depan:
((A)B)
menjadi(A)(B)
. - Ketika satu loop berakhir dengan loop lain, kita dapat mengekstrak loop dalam ke ujung:
(B(A))
menjadi(B)(A)
. - Loop kosong
()
,, dapat dihapus dari program sepenuhnya. Sebagai akibat wajar (dalam hubungannya dengan aturan lain),((A))
setara dengan(A)
.
Satu-satunya loop bersarang yang akan tersisa adalah dari bentuk (A(B)C)
, di mana A
, B
danC
tidak kosong.
Tantangan
Anda diberi program Stack Cats yang valid dan tugas Anda adalah mengurangi sebanyak mungkin level loop, tanpa meninggalkan loop kosong, menggunakan transformasi di atas.
Program Stack Cats yang valid ...
- ... hanya terdiri dari karakter
()/\<>[]{}!"*+-:=ITX^_|
. - ... memiliki simetri cermin (mis.
\(]{}!{}[)/
adalah program yang valid, tetapi/|/
tidak). - ... telah benar-benar cocok dan bersarang
()
dan{}
([]
,<>
dan\/
tidak perlu dicocokkan seperti biasa, meskipun mereka akan muncul berpasangan karena persyaratan simetri cermin).
Anda dapat mengambil string atau daftar karakter sebagai input, tetapi output harus disajikan dalam format yang sama.
Anda dapat menulis sebuah program atau fungsi dan menggunakan salah satu metode standar kami untuk menerima input dan memberikan output. Perhatikan bahwa celah ini dilarang secara default.
Ini adalah kode-golf , sehingga jawaban terpendek yang valid - diukur dalam byte - menang.
Uji Kasus
Kasing uji masing-masing adalah dua jalur (input dan output), dipisahkan oleh jalur kosong. Perhatikan bahwa satu output kosong. Anda juga perlu mendukung input kosong (yang seharusnya menghasilkan output kosong).
(((=+|+=)))
(=+|+=)
({(=+|+=)})
({(=+|+=)})
((\)/)I(\(/))
(\)(/)I(\)(/)
(()()(())()())
((<|>((X((T)))[_]))\^/(([_](((T))X))<|>))
(<|>)(X)(T)([_])(\^/)([_])(T)(X)(<|>)
sumber
()
, jadi input{{A}B}
akan tetap apa adanya dan tidak akan diekstraksi{A}{B}
juga?(...)
loop -type.\^/
di dalam kurung?(<|>((X((T)))[_]))
dan(([_](((T))X))<|>)
.((A)B(C))
akan menjadi(A)(B)(C)
karena kedua aturan 1 dan 2 selanjutnya:((A)B(C))
→(A)(B(C))
(aturan 1) →(A)(B)(C)
(aturan 2).Jawaban:
Retina 0.8.2 ,
1131076766 byteCobalah online!Termasuk penghematan
34 byte berkat @MartinEnder. Penjelasan:Lakukan penggantian secara berulang sampai tidak ada kecocokan.
Cocokkan loop kosong (dalam hal ini tidak ada yang ditangkap sehingga substitusi hanya menghapusnya) atau:
Secara opsional cocok dengan a
(
. Ini ditangkap di grup 1 jika cocok, tetapi tidak jika tidak.Tangkap bagian utama pertandingan di grup 2 dan cocokkan a
(
.Cocokkan berulang kali dengan a
(
, menangkapnya di grup 4, atau a)
, menghapus tangkapan dari grup 4 (gagal jika tidak ada), atau yang lainnya.Pastikan tidak ada tangkapan cadangan yang tersisa di grup 4.
Akhiri penangkapan grup 2 dengan yang lain
)
.Jika capture group 1 kosong, maka capture a
)
di capture group 5. (Jadi tepat salah satu dari dua grup tersebut akan memiliki capture).Pindahkan braket yang ditangkap dalam grup 1 atau grup 5 ke sisi lain grup 2. Ini memiliki efek memindahkan loop dalam ke depan atau akhir loop luar tergantung pada sisi mana yang cocok.
sumber
Stax v1.0.3 +,
7665646258 byte CP43770 byte saat dibongkar,
Jalankan dan debug online!
Penjelasan
{.((:/Yc{Z{40=+_41=-c^Ci~^Fdy,,\32&jEa:{a:{a4l$c}Md
adalah blok yang memisahkanA((B)C)D
menjadi empat bagian dan mengubahnya menjadiA(B)(C)D
.X!:Rx!:R
mengeksekusi blok pada string input (langkah 1), kemudian mencerminkan string (refleksi string dalam Stax mengacu pada membalikkan string plus mengganti (menerjemahkan)(<[{/
dengan (untuk)\}]>)
) dan menjalankan blok pada string yang diperoleh, dan kemudian memantulkannya kembali (Langkah 2). Langkah 2 pada dasarnya mengkonversi(A(B))
ke(A)(B)
.c.()z:r
hapus semua loop kosong (langkah 3).gp
adalah generator yang menemukan titik perbaikan iterasi. Dalam hal ini string diulangi dengan proses 3 langkah hingga tidak lagi berubah.Output tersirat.
sumber
Python 3 ,
226223212206 byteOke, ini adalah upaya untuk menyelesaikan ini dalam bahasa yang tidak mendukung regex rekursif.
Cobalah online!
Suntingan:
[::-1]
untuk menyimpan 6 byte, terima kasih kepada Mr.Xcoder.The
g
fungsi adalah blok bangunan dasar, yang menemukan kejadian dari((A)B)
, perubahan itu(A)(B)
, maka berlaku itu sendiri untuk hasil sampai tidak ada lagi transformasi adalah mungkin.Langkah-langkah utamanya adalah:
g
untuk input secara normal.g
untuk input terbalik. Jalankan ini menemukan terjadinya))A(B(
input terbalik, yang secara efektif menangani(A(B))
.()
.Masalahnya adalah,
g
memiliki struktur kontrol yang sangat buruk sehingga mencoba untuk membuat satu baris itu membuatnya kembung, jadi saya tidak berpikir perbaikan besar dimungkinkan berdasarkan solusi ini.sumber