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)(<|>)
(...)
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).
()
, jadi input{{A}B}
akan tetap apa adanya dan tidak akan diekstraksi{A}{B}
juga?