Anda harus menulis sebuah program atau fungsi yang mengambil string tanda kurung dan menampilkan apakah string itu benar-benar cocok atau tidak. Program Anda harus mencetak nilai yang benar atau salah , dan IO bisa dalam format yang masuk akal .
Aturan dan definisi:
Untuk tujuan tantangan ini, "braket" adalah salah satu karakter:
()[]{}<>
.Sepasang tanda kurung dianggap "cocok" jika tanda kurung buka dan tutup berada dalam urutan yang benar dan tidak memiliki karakter di dalamnya, seperti
() []{}
Atau jika setiap subelemen di dalamnya juga cocok.
[()()()()] {<[]>} (()())
Subelemen juga dapat disarungkan beberapa lapisan.
[(){<><>[()]}<>()] <[{((()))}]>
String dianggap "Sepenuhnya cocok" jika dan hanya jika:
Setiap karakter tunggal adalah braket,
Setiap pasangan braket memiliki braket pembuka dan penutup yang benar dan dalam urutan yang benar, dan
Setiap braket dicocokkan.
Anda dapat berasumsi bahwa input hanya akan berisi ASCII yang dapat dicetak .
Tes IO
Berikut adalah beberapa masukan yang harus mengembalikan nilai kebenaran:
()
[](){}<>
(((())))
({[<>]})
[{()<>()}[]]
[([]{})<{[()<()>]}()>{}]
Dan berikut adalah beberapa output yang harus mengembalikan nilai palsu:
( Has no closing ')'
}{ Wrong order
(<)> Each pair contains only half of a matched element
(()()foobar) Contains invalid characters
[({}<>)> The last bracket should be ']' instead of '>'
(((())) Has 4 opening brackets, but only 3 closing brackets.
Seperti biasa, ini adalah kode-golf, sehingga celah standar berlaku, dan jawaban tersingkat dalam byte menang.
sumber
[}
cocok? Dan jika tidak, di mana itu dikecualikan oleh aturan-aturan ini?Each pair of brackets has the correct opening and closing bracket and in the right order.
Jawaban:
05AB1E , 19 byte
Masukan diberikan dalam tanda kutip . Kode:
Nah omong kosong, banyak bug dan fitur yang tidak diterapkan ditemukan. Penjelasan:
Ini sebenarnya bagian yang sulit. Seperti apa ini dalam pseudocode adalah:
Ini dicakup oleh bagian ini dari kode 05AB1E :
Seperti yang Anda lihat, ini adalah penggantian tanpa batas (dilakukan hingga string tidak berubah lagi). Jadi, saya tidak perlu khawatir tentang pengaturan penggantian menjadi satu lingkaran, karena ini sudah builtin. Setelah itu:
Menggunakan pengodean CP-1252 . Cobalah online! (sedikit dimodifikasi karena versi di atas sudah usang).
sumber
õ
ditambahkan?Brain-Flak ,
1101, 1085, 981 byteCobalah online!
Ini adalah 980 byte kode sumber, dan
+1
untuk-a
flag memungkinkan input ASCII (tetapi output desimal)Ini adalah jawaban yang saya sudah lama ingin menulis untuk sangat sangat lama. Setidaknya 6 bulan. Saya menunggu untuk memposting ini karena saya tahu bahwa menjawab tantangan ini akan sangat sulit di otak. Tapi itu layak untuk satu alasan yang sangat penting: Kode sumber itu sendiri adalah input yang benar, yang merupakan inti dari bahasa ini sendiri.
Dan ketika saya menulis di sini , pertanyaan ini adalah apa yang mengilhami saya untuk menulis kritik.
Jawaban ini membutuhkan sekitar dua jam untuk menulis. Saya akui golfnya buruk, kebanyakan karena banyak kode diulang untuk setiap jenis braket. Tetapi saya sebagian besar kagum bahwa saya bisa menulis jawaban sama sekali, terutama mengingat bahwa Brain-Flak adalah
Saya akan mencoba untuk menurunkannya nanti, tetapi saya tetap ingin mendapatkan ini di luar sana.
Saya punya penjelasan mendetail, tapi panjangnya sekitar 6 ribu karakter, jadi saya pikir tidak bijaksana untuk menyisipkan semuanya ke dalam jawaban ini. Anda dapat membacanya di sini jika Anda mau. Saya akan menambahkan penjelasan singkat di sini.
Ide dasarnya, adalah kita mengulangi langkah-langkah berikut untuk setiap karakter di stack:
Kami memeriksa setiap karakter untuk melihat apakah itu cocok dengan braket apa pun. Jika ini adalah braket pembuka, kami mendorong nomor ke tumpukan lain sesuai dengan pemetaan berikut:
Kemudian kami memeriksa untuk melihat apakah cocok dengan braket penutup. Jika ya, kami mendorong nomor yang setara ke tumpukan alternatif, seperti halnya untuk membuka tanda kurung. Kemudian , kami memeriksa apakah dua angka teratas sama. Jika ya, keduanya akan muncul dan program berlanjut seperti biasa. Jika tidak, kami menghapus kedua tumpukan (untuk menghentikan perulangan) dan mendorongnya ke tumpukan alternatif. Ini pada dasarnya adalah pernyataan "istirahat".
Setelah memeriksa 8 jenis braket, kami mendorong nilai run ini melalui loop. Karena sebagian besar nol, sebagian besar potongan yang memiliki nilai adalah persyaratan saat kami membandingkannya dengan tanda kurung. Jadi jika ada braket yang cocok, seluruh loop memiliki nilai 1. Jika tidak ada yang melakukannya, seluruh loop memiliki nilai 0. Dalam hal ini, kami akan menghapus kedua tumpukan dan mendorong 0 ke tumpukan alternatif. Sekali lagi, ini seperti pernyataan "istirahat".
Setelah loop utama ini berjalan, sisanya cukup sederhana. Kami berada di tumpukan utama (kosong), dan tumpukan alternatif kosong (jika tanda kurung cocok) atau tidak kosong jika tidak. Jadi kami menjalankan ini:
Ini akan mendorong 0 atau 1 ke tumpukan utama, dan ketika program berakhir, dicetak secara implisit.
Terima kasih kepada @WheatWizard untuk membuat potongan "equals" dan "logical not" yang bersih, dan untuk memperbarui wiki github secara teratur dengan contoh-contoh yang berguna.
Terima kasih kepada @ ASCII-only untuk menulis metagolfer integer online yang sangat membantu dalam menulis program ini
revisi
Menghapus beberapa redundansi pop push
Mengubah logika penghitung nol saya
sumber
Brain-Flak ,
204196190 byteCobalah online!
-8 Bytes berkat Wheat Wizard. -6 byte terima kasih kepada Jo King.
Penjelasan
Program ini menyimpan kode karakter semua tanda kurung yang tidak tertutup pada tumpukan kedua. Pasangan bracket
<>
,[]
dan{}
masing-masing memiliki kode karakter yang berbeda dengan tepat 2, sehingga tidak perlu untuk memeriksa mereka secara khusus. Pasangan ini()
hanya berbeda dengan 1, jadi kami memeriksa secara(
khusus, dan secara efektif mengurangi byte tersebut (sebenarnya setiap byte bertambah) sebelum melanjutkan.sumber
([{}]<>({}))((){[()](<{}>)}{})
({<>[()]}())
-6 byteJavaScript (ES6),
5250 byteHapus kurung berulang kali hingga hasilnya sama dengan aslinya, lalu kembalikan salah kecuali string sekarang kosong.
Sunting: Disimpan 2 byte berkat @ edc65.
sumber
Retina, 20 byte
Cobalah online
sumber
CJam,
25242321 byteTerima kasih kepada Sp3000 untuk menghemat 2 byte.
Terima kasih kepada jimmy23013 untuk menghemat 2 byte.
Suite uji.
Bekerja pada dasarnya sama dengan jawaban yang lain: kita berulang kali menghapus
()
,[]
,<>
dan{}
dari string dan memeriksa apakah kita berakhir dengan string kosong. Untuk menghindari harus memeriksa kapan kita selesai, kita menghapus pasanganN
kali di manaN
panjang string, yang selalu cukup (karena setiap iterasi akan menghapus setidaknya dua karakter, kecuali kita selesai). Saya senang melihat ini tidak mengalahkan Retina. :) (Meskipun Pyth atau Jelly mungkin ...)Ada satu trik golf yang menyenangkan di sini: untuk mendapatkan string,
()<>[]{}
kami menggunakan yang berikut ini:The,
{()<>}
hanyalah sebuah blok (yaitu fungsi), yang berisi tanda kurung lain sebagai kode. Dengana
kami bungkus blok dalam sebuah array. The`
stringifies bahwa array, yang memberikan"[{()<>}]"
. Akhirnya, kami mengurutkan string dengan$
, yang mengatur ulang tanda kurung()<>[]{}
.sumber
()<>[]{}`
akan berfungsi dengan baik, dan menjadi jumlah byte yang sama, bukan?()<>
ada empat operator (penurunan, kenaikan, dan kemudian perbandingan atau pemotongan tergantung pada operan), yang akan dieksekusi segera, sedangkan{}
menunjukkan sebuah blok (setara dengan fungsi CJam), yaitu sepotong kode yang hanya didorong ke tumpukan tanpa mengevaluasinya segera. Itu sebabnya saya perlu{}
membungkus()
dan<>
, tetapi kemudian menggunakana
untuk meletakkan semuanya dalam array lebih pendek dari[...]
.Python, 67 byte
Menghasilkan dan mengevaluasi ekspresi yang terlihat seperti
dan memeriksa apakah hasilnya kosong.
Sp3000 menyimpan 8 byte dengan menunjukkan bahwa
[],(),{}
dapat ditubuhkan tanpa tanda kutip karena mereka objek Python, dan bahwa dua parens tidak diperlukan.sumber
Yacc, 119 byte
Tidak menggunakan regex / ganti.
Tidak disatukan
Kompilasi
Pemakaian
sumber
Pyth,
312524 byteGolf turun menjadi 25 byte berkat FryAmTheEggMan Dihapus 1 byte
Coba di sini: Test suite !
Saya masih pemula Pyth, bantuan apa pun dihargai.
Penjelasan
BTW, selamat untuk jawaban Pyth lainnya (yang saat ini 20 byte)
sumber
Vz=:z"<>|\[]|{}|\(\)"k;!z
. Terutama catatan, Anda pada dasarnya tidak perlu menggunakanl
jika Anda tidak benar-benar membutuhkan nomor, dan=
secara otomatis menebak variabel pertama yang digunakan dalam ekspresi. Beri tahu saya jika Anda ingin saya menjelaskan hal lain di ruang obrolan Pyth :)l
itu tidak perlu, itu bagus untuk diketahui. Pada awalnya, saya mendeklarasikan fungsi karena logika saya berbeda, dan lupa menghapusnya. Haruskah saya memasukkan jawaban Anda untuk saya? (Saya seorang pemula>. <)Pyth, 20 byte
Cobalah online: Test Suite
Berulang kali menghapus kejadian
[]
,()
,<>
dan{}
oleh pemecahan dan re-penggabungan. Cek apakah string yang dihasilkan kosong atau tidak.sumber
Javascript ES6, 54 byte
Menggunakan implementasi pengganti rekursif. Cukup sederhana.
sumber
Regex (rasa PCRE),
4137 byteHanya solusi standar dengan regex rekursif.
Terima kasih jimmy23013 untuk mencukur 4 byte
sumber
Perl,
3433 byteTermasuk +2 untuk
-lp
Jalankan dengan input pada STDIN:
brackets.pl
:Temukan pasangan braket pertama tanpa apapun di antara mereka dan menghapusnya selama ada. Kemudian periksa apakah string terakhir kosong.
sumber
s/\(\)|\[]|<>|{}//&&redo;$_=!$_
bekerja :)Brain-Flak , 204 byte
Cobalah online!
Tidak sesingkat jawaban Nitroden , tetapi menggunakan pendekatan yang sangat berbeda. Yang ini berjalan melalui input berulang kali, menghapus pasangan kurung yang cocok setiap kali sampai tidak ada yang tersisa. Pada titik itu jika ada sesuatu yang tersisa di tumpukan, maka string tidak sepenuhnya cocok.
Penjelasan:
sumber
Brainfuck, 132 byte
Diformat:
Mengharapkan input tanpa baris baru yang tertinggal. Cetakan
\x00
untuk false dan\x01
true.Cobalah online.
Pendekatan: Pertahankan tumpukan yang dimulai dengan
\x01
, dan dorong braket penutup yang sesuai setiap kali braket pembuka ditemukan. Sebelum memeriksa apakah karakter saat ini adalah braket pembuka, pertama periksa apakah karakternya sama dengan braket penutup di bagian atas tumpukan, dan jika demikian lepaskan. Jika bukan braket penutup yang tepat atau braket pembuka, konsumsilah sisa input sambil menggerakkan pointer ke kanan. Pada akhirnya, periksa apakah pointer di sebelah inisial\x01
.sumber
Grime v0.1, 34 byte
Mencetak
1
untuk pertandingan dan0
tanpa pertandingan. Cobalah online!Penjelasan
Grime adalah bahasa pencocokan pola 2D saya yang dirancang untuk tantangan ini ; itu juga dapat digunakan untuk mencocokkan string 1D. Ini jawaban pertamaku dengannya. Saya memang memodifikasi Grime hari ini, tetapi hanya untuk mengubah karakter satu elemen sintaks (
`
bukan,
), jadi itu tidak mempengaruhi skor saya.sumber
Reng v.3.3, 137 byte, tidak bersaing
Coba di sini!
Ada sedikit lebih banyak golf yang harus dilakukan, tetapi setidaknya itu berfungsi. Saya menambahkan perintah
ð
untuk melacak tumpukan setelah tantangan ini agar ini menjadi mungkin / mudah. Saya akan menjelaskan ini sedikit, tetapi umumnya melacak semua string berulang dan mencari pengulangan; jika ada pengulangan, maka string tidak dapat direduksi. Jika tidak, string akan direduksi menjadi string / stack kosong, dan akan ditampilkan1
. Kalau tidak, output tidak akan diproduksi.sumber
PowerShell v2 +,
6362 byteTidak bisa cukup menangkap JavaScript, tetapi saat ini sedang menjajaki non-esolang lainnya.
Pendekatan yang sama seperti jawaban lainnya: loop sederhana yang terus selama kita dapat menghapus salah satu
[]
,()
atau<>
(dengan beberapa karakter yang asing karena kita perlu untuk melarikan diri spesial regex). Kami menggunakan$b
sebagai penolong di sepanjang jalan untuk mengingat apa loop kami sebelumnya$a
ditetapkan sebagai. Variabel tidak diinisialisasi adalah$null
, jadi saat pertama kali loop ditemukan,$a
jelas tidak sama dengan$null
.Pada akhir loop,
$a
kosong atau tidak, dan Boolean-bukan dari string itu adalahTrue
atauFalse
.Contoh
sumber
C,
121122114 byteDicukur 8 byte berkat @xsot!
Menggunakan tumpukan.
sumber
c%7&2
. Sebenarnya, kamu tidak perluk
. Sebagai gantinya, Anda bisa menambahkan dii
mana Anda akan memodifikasik
karena Anda perlu memeriksa apakah padai
akhirnya nol. Sesuatu seperti ini (kode belum teruji):a[99],i;main(c){for(;read(0,&c,1);c%7&2?i+=a[i--]^c/9:(a[++i]=c/9))i+=!strchr("()[]{}<>",c);putchar(48+!i);}
.a[99],i,k;main(c){for(;read(0,&c,!k);c%7&2?k|=a[i--]^c/9:(a[++i]=c/9))k|=!strchr("()[]{}<>",c);putchar(48+!i*!k);}
a[99],i;main(c){for(;read(0,&c,1);c%7&2?i+=a[i]^c/9?1:-1:(a[++i]=c/9))i+=!strchr("()[]{}<>",c);putchar(48+!i);}
Tapi ini belum berfungsi untuk input seperti()))
, karena "popping" dari stack sebenarnya tidak nol nilai-nilai dalam array.Java 7,
156151 byteSaya tidak mengharapkan ini untuk memenangkan penghargaan tetapi saya belum melihat jawaban Java Selain itu, saya suka bersembunyi di sekitar PPCG dan saya akan senang bisa memberikan suara / komentar pada jawaban lain.
Input diberikan sebagai parameter program. Ini mengikuti format yang sama dengan banyak jawaban lain di sini yaitu membentuk preforms pengganti regex dalam satu lingkaran. Awalnya saya memilikinya loop N kali di mana N adalah panjang dari string asli tetapi perulangan ke
Integer.MAX_VALUE
lebih pendek:]. Ini harus ok karenaInteger.MAX_VALUE
panjang maksimum aString
di Jawa sehingga ada asumsi implisit bahwa panjang input adalah sesuatu yang dapat ditangani oleh Java. Runtime sangat buruk (memakan waktu sekitar 20 menit di lappytop saya) karena loop tetapi saya tidak melihat adanya batasan pada itu.sumber
Haskell , 151 byte
Cobalah online!
sumber
(#)
perlu dipanggil dengan string kosong sebagai argumen kedua, Anda perlu menghitung ke(#"")
arah jumlah byte Anda. Juga hanyaTrue
danFalse
dianggap benar / salah, lihat Panduan Aturan Golf .a:x#b:y|a==b=x#y
, membawa byte ke 113: Coba online!Python 2.7, 96 byte
sumber
Python 2, 80 byte
sumber
Julia, 51 byte
Paling tidak gila dari beberapa opsi. Tidak mengherankan, meningkatkan kekuatan regex adalah jalur terpendek menuju pencocokan string, tetapi ini hanya berlaku jika pola yang cocok adalah biasa. Mencoba melakukan pola rekursif PCRE berakhir membengkak ukuran kode, baik dengan melihat apakah seluruh string cocok atau dengan jangkar ujungnya dan kemudian membuat konstruksi untuk menentukan tubuh bagian dalam untuk rekursi regex. Tak satu pun dari yang cantik atau kondusif untuk kode golf.
Penjelasan:
Fungsi ini berulang kali menghilangkan pasangan kurung yang berdekatan dari satu-satunya argumen, dan mengembalikan true jika ia dapat menurunkan string kosong dengan cara ini.
sumber
sed,
3936 bytes (34 untuk kode, 2 untuk -r)Cobalah online!
versi sed apa yang tampaknya menjadi pendekatan standar. Membutuhkan ekspresi reguler yang diperluas (
sed -r
)Disimpan 3 byte berkat Sapi dukun
sumber
a
is:a
danta
menyimpan byteq
dari/./
dan drop kawat gigi di sana juga. Cobalah online! Ini karena carac
kerja hange05AB1E, 9 byte
Masukan diberikan dalam tanda kutip.
Cobalah online!
Penjelasan:
sumber
Clojure, 153 byte
Lebih lama daripada jawaban C dan Brainfuck: o
Tidak menggunakan regex, melainkan menggunakan karakter pertama untuk menentukan apa tag penutup dan menemukan indeks pertama di mana braket itu seimbang (jumlah kumulatif adalah nol). Kemudian secara iteratif memeriksa bahwa apa yang ada dalam kurung dan setelah kurung valid.
Harus melihat apakah ada pendekatan yang lebih baik ...
sumber
Lua , 295 byte
Versi Tidak Serigala
Cobalah online!
sumber
Japt v2.0a0
-!
, 16 byteCobalah
sumber
R, 298
Pendekatan di sini adalah mengubah urutan menjadi kode R, dan kemudian mencoba mengurai dan mengevaluasinya. Jika itu memberikan kesalahan, maka kembali
FALSE
.Tetapi ada masalah kecil ... Aturan R untuk tanda kurung berbeda, jadi
<
dan>
sama sekali bukan tanda kurung, dan tipe lainnya memiliki aturan sendiri. Ini diselesaikan dengan pendekatan revolusioner - fungsi mencicit, yang fungsinya hanya untuk memberi tanda kesalahan jika kepala dan ekornya mencicit dengan cara yang berbeda.Misalnya,
[]
diubah menjadiS('[', {}, ']')
, di mana S didefinisikan sebagai ...Karena mencicit kepala dan mencicit ekor, tidak ada kesalahan dilemparkan.
Beberapa contoh lain (bagian kiri adalah urutan kurung dan bagian kanan adalah transformasi menjadi kode R yang valid yang dapat dievaluasi):
Beberapa urutan kurung lain akan menghasilkan kesalahan parse:
Jadi bagian yang tersisa hanya menangkap kesalahan dan mengembalikan SALAH jika ada, dan BENAR jika tidak ada.
Kode yang dapat dibaca manusia:
Menerapkannya pada kasus sampel:
sumber