Kami menyebut grup paren paren terbuka (
, paren dekat yang cocok)
dan semua yang ada di dalamnya.
Grup atau string parens disebut tanda kurung seimbang jika tidak mengandung apa-apa atau hanya 2 kelompok parens seimbang murni.
Sebagai contoh:
The string "(()())()" is parenthesly balanced
( )() Because it contains exactly 2 parenthesly balanced parens groups
()() The left one is parenthesly balanced because it contains 2 parenthesly balanced parens groups (balanced because they are empty). The right one is parenthesly balanced because it contains nothing.
Juga:
The string "(()(()))()" is not parenthesly balanced
( )() Because it contains a parens group that is not parenthesly balanced: the left one
()( ) The left one is not balanced because it contains a parens group that is not balanced: the right one
() The right one is not balanced because it only contains one balanced group.
Jadi, string atau grup parens seimbang harus:
- Tidak mengandung apa pun.
- Atau hanya berisi dan persis 2 grup parens seimbang yang disusun dalam tanda kurung. Seharusnya tidak mengandung yang lain.
Tugas:
Tugas Anda adalah menulis fungsi atau program yang memeriksa apakah string yang diberikan adalah tanda kurung yang seimbang atau tidak.
Memasukkan:
Input akan berupa string atau daftar karakter atau yang serupa. Anda dapat mengasumsikan bahwa string hanya akan terdiri dari karakter '('
dan ')'
. Anda juga dapat mengasumsikan bahwa setiap paren terbuka (
akan memiliki cocok paren penutupan )
, jadi jangan khawatir tentang string seperti "((("
atau ")("
atau "(())("
...
Catatan: Seperti yang disebutkan oleh @DigitalTrauma dalam komentarnya di bawah, tidak apa-apa untuk mengganti ()
kombo dengan karakter lain (seperti <>
,[]
, ...), jika itu menyebabkan pekerjaan tambahan seperti melarikan diri dalam beberapa bahasa
Keluaran:
Apa pun untuk memberi sinyal apakah string tersebut diseimbangkan dengan tanda kurung atau tidak (benar atau salah, 1 atau 0, ...). Harap sertakan dalam jawaban Anda apa fungsi / program Anda diharapkan untuk menghasilkan.
Contoh:
"" => True
"()()" => True
"()(()())" => True
"(()(()(()())))(()())" => True
"(((((((()())())())())())())())()" => True
"()" => False
"()()()" => False
"(())()" => False
"()(()(())())" => False
"(()())(((((()())()))())())" => False
"()(()()()())" => False
"()(()(()())()())" => False
Dua contoh terakhir benar-benar membuat perbedaan!
Semoga berhasil!
sumber
"(()())()"
akan direpresentasikan sebagai[0, 0, 1, 0, 1, 1, 0, 1]
. Ini akan menghapus keharusan untuk mengkonversi input ke kode karakter dan kemudian mengurangi.Jawaban:
Japt v2, 20 byte
Uji secara online!
Setiap orang salah memahami tantangan pada awalnya dan meskipun setiap pasang tanda kurung harus mengandung jumlah sub-pasangan yang genap , padahal sebenarnya tantangan itu sebenarnya meminta 0 atau 2 sub-pasangan. Jadi inilah jawaban saya yang telah direvisi, menggunakan teknik yang sama seperti sebelumnya.
Kita masih bisa menyelesaikan tantangan dengan penggantian rekursif. Masalahnya adalah, alih-alih hanya menghilangkan semua kejadian
()()
, kita perlu memastikan bahwa tidak ada yang lain di bungkus yang sama selain()()
(dengan kata lain, tidak ada()()()()
atau semacamnya). Kita dapat melakukan ini dengan rekursif mengganti(()())
dengan()
.Masalah baru adalah bahwa input itu sendiri tidak memiliki sepasang tanda kurung luar (karena itu akan membuatnya bukan string yang diimbangi dengan tanda kurung), memaksa kita untuk membungkusnya dalam pasangan ekstra untuk sepenuhnya menguranginya. Akhirnya, hasil akhir untuk string seimbang sekarang
()
bukan string kosong, jadi kami memeriksa kesetaraan daripada hanya mengambil BUKAN logis dari output.sumber
sed 4.2.2, 30
Cobalah online .
Ini mengembalikan kode keluar shell 1 untuk Benar dan 0 untuk Salah.
sumber
Perl 5 -lp,
2422 byteCobalah online! Tautan termasuk kasus uji. Sunting: Disimpan 2 byte berkat @ JoKing. Penjelasan: Hanya regex rekursif. Grup tangkapan luar mewakili string seimbang sebagai
<
diikuti oleh string seimbang opsional diikuti oleh>
, dua kali. Perhatikan bahwa sebagian besar jawaban lain dapat digunakan()
tetapi ini membutuhkan tambahan dua byte:Cobalah online! Tautan termasuk kasus uji.
sumber
<>
()
s jadi saya tidak berpikir itu adalah perbandingan yang adil, namun saya melihat @ ngn's APL juga menggunakan<>
s jadi saya sudah memperbarui yang ini.6502 rutin kode mesin , 48 byte
Mengharapkan pointer ke string di
$fb
/$fc
yang diharapkan hanya berisi(
dan)
. Hapus C (Carry) flag jika string "paranthesely balance", atur sebaliknya (yang merupakan idiom khas pada 6502, atur carry "on error"). Tidak ada yang masuk akal pada input yang tidak valid.Meskipun algoritma ini bersifat rekursif, ia tidak menyebut dirinya sendiri (yang akan membutuhkan lebih banyak byte dan membuat posisi kode bergantung) tetapi sebaliknya mempertahankan kedalaman rekursi itu sendiri dan menggunakan percabangan "sederhana".
Komentar pembongkaran
Contoh program assembler C64 menggunakan rutin:
Demo online
Kode dalam sintaksis ca65 :
sumber
V ,
21, 20 byteCobalah online! atau Verifikasi semua kasus uji!
Hexdump:
sumber
Brachylog , 28 byte
Cobalah online!
Penjelasan
sumber
C (gcc) , 113 byte
Cobalah online!
Penjelasan
Cobalah online!
sumber
MATL ,
2625 byteCobalah online!
Terima kasih atas jawaban @ETHProductions untuk ide "replace (() ()) dengan ()", dan komentar pertanyaan @JungHwan Min untuk gagasan melihat tanda kurung sebagai digit biner.
Output adalah array kosong untuk kebenaran, angka positif untuk falsey - yang saya pikir diizinkan oleh komentar OP: "Bisa jadi kategori. Yaitu nilai-nilai kebenaran untuk menandakan kebenaran dan nilai-nilai palsu untuk memberi sinyal sebaliknya." Jika tidak, kita dapat menambahkan
n
di akhir untuk +1 byte, untuk memiliki 0 sebagai output yang sebenarnya dan 1 sebagai output falsey.Dengan komentar:
sumber
C # (.NET Core) ,
7871 byteCobalah online!
sumber
Haskell ,
8259 byteCobalah online!
Saya menganggap itu bisa bermain golf lebih jauh karena ini pertama kalinya saya bermain golf di haskell, jadi semua trik atau komentar lebih dari diterima.
EDIT - Terima kasih @nimi karena telah menghemat 23 byte (lebih dari 28% dari pengiriman asli :)
sumber
()
sekitary+1
. Karena fungsi yang tidak disebutkan namanya diizinkan, Anda dapat menghapusf=
,r[0]
adalah fungsi yang tepat. Masukkan base caser b[]
di akhir dan beralih ke fungsi infix (katakanlah#
), maka Anda dapat menggunakannyab#_=
. Anda juga dapat mengubah algoritma Anda sedikit dengan membangun daftar untuk memeriksa0
dan2
s langkah demi langkah bukannya membawa sekitar panggilan darir
dalam akumulatorr(x:y:z) ... = x : r (...) a
dengan kasus dasarr b [] = b
. Lakukan pemeriksaan setelah panggilan awalr[0]
. Semuanya 73 bit.foldl
(59 byte): Coba online! .JavaScript (ES6), 63 byte
Mengambil input sebagai array karakter. Mengembalikan nilai false untuk parenthesly balance, true untuk tidak parenthesly balance.
Cobalah online!
Berkomentar
Rekursif, 54 byte
Namun, menggunakan penggantian rekursif (seperti dalam jawaban Japt produk ETH ) jauh lebih singkat.
Mengambil input sebagai string. Mengembalikan 1 untuk tanda kurung seimbang, 0 untuk tanda tanda kurung tidak seimbang.
Cobalah online!
Rekursif, 46 byte
Yang ini melempar kesalahan rekursi karena tidak diseimbangkan dengan parenthesly:
Cobalah online!
sumber
x[k]
pada awalnya tidak ditentukan danx[k]++
akan memberiNaN
, sedangkan-~undefined
memberi1
.a[k]
awalnya berisi karakter. Tetapi logika yang sama berlaku untuk string: menerapkan++
operator pada mereka menghasilkanNaN
, tetapi operator bitwise (seperti~
) memaksa mereka untuk dipaksa0
sebelumnya.Perl 6 ,
43 4137 byteMenguji
Menguji
Menguji
Diperluas:
sumber
R , 71 byte
Cobalah online!
Solusi lain - lebih lama - tetapi menarik untuk pendekatan yang berbeda
R , 85 byte
Cobalah online!
Penjelasan:
Ambil string input dan ganti:
kemudian mengevaluasi ekspresi yang dihasilkan. Jika sama dengan nol seimbang, sebaliknya tidak. Penggunaan
sum
hanya diperlukan untuk menangani kasus string kosong, karena evaluasinya kembaliNULL
.misalnya
sumber
f=function(s,r=sub('(()())','()',s,f=T))'if'(r==s,s==''|s=='()()',f(r))
Bahasa Wolfram (Mathematica) , 65 byte
Cobalah online!
sumber
05AB1E ,
181613 bytePelabuhan @ETHproductions 's Japt jawaban untuk memperbaiki kasus uji
()(()()(()())(()()))
.-2 byte terima kasih kepada @Adnan .
Berdasarkan komentar OP yang saya gunakan sekarang
()
nilai kebenaran, dan yang lainnya sebagai falsey. Jika kedua nilai perlu konsisten, bukan hanya satu, itu akan menjadi jawaban 16-byte lama sebagai gantinya (…(ÿ)…(()∞„()©:®Q
), kembali0
untuk1
kasus uji kebenaran dan falsey.Cobalah online atau verifikasi semua kasus uji .
Penjelasan
(Jawaban 18-byte lama yang gagal untuk kasus uji
()(()()(()())(()()))
..):Cobalah secara online atau verifikasi semua kasus uji .
sumber
„()∞õ:g_
.(()()()())
yang harus mengembalikan falsey. Setiap grup kurung harus berisi tepat 0 atau 2 grup batin.'(®')J
dengan…(ÿ)
.ÿ
ada, tetapi tidak pernah menggunakannya sebelumnya, jadi saya benar-benar lupa.APL (Dyalog Classic) , 27 byte
Cobalah online!
sumber
Prolog , 46 byte
Cobalah online! atau Verifikasi semua kasus uji!
Menggunakan daftar
l
danr
sebagai input, misalnya"()()"
diuji sebagaif([l,r,l,r]).
.Tiga baris pertama adalah tata bahasa string yang valid dalam sintaksis Tata Bahasa Prolog's Definite Clause .
a(A,B).
mengembalikantrue
kapanA
daftar yang mengikuti tata bahasa danB
kosong. Jadi fungsi utamaf
mengambil beberapaX
dan memeriksa apakaha(X,[])
tahan.sumber
Python 2 ,
7371 byteCobalah online!
sumber
brainfuck, 50 byte
Diformat:
Mengharapkan string dari
(
dan)
tanpa baris baru, dan output\x01
untuk benar dan\x00
salah. (Untuk keterbacaan, Anda dapat misalnya menambahkan 48+
detik sebelum final.
untuk membuatnya dicetak1
dan0
sebagai gantinya.)Cobalah online
Ini memelihara tumpukan dengan jumlah grup di setiap kedalaman, membedakan karakter berdasarkan paritas dan memeriksa apakah jumlah grup dalam {0, 2} setelah setiap kurung tutup; jika kondisi tidak terpenuhi, mengkonsumsi sisa input dan menetapkan bendera; kemudian periksa kembali kondisi di akhir program.
Jika kami diizinkan menghentikan aliran input dengan karakter aneh, kami dapat menghilangkan pemeriksaan akhir
<[--[>->]]
untuk menghemat 10 byte. (Jika\n
bahkan tidak merepotkan, saya mungkin telah mengusulkan varian ini sebagai jawaban utama.)(Kita juga bisa menyimpan beberapa byte dengan mengubah format output menjadi
\x00
true dan non-\x00
for false, yang tampaknya diizinkan (mungkin secara tidak sengaja) oleh pernyataan masalah seperti yang tertulis, tetapi bagaimanapun itu tidak akan sangat menarik, dan saya lebih suka bukan untuk membuat perubahan itu.)sumber
Python2,
9594 byteCobalah online!
f () mentransformasikan string menjadi tuple bersarang, yang diteruskan ke g ().
g () secara rekursif menavigasi tuple dan mengembalikan False jika elemen apa pun tidak memiliki 0 atau 2 anak.
Disimpan satu byte dengan menggunakan pemformatan string.
sumber
Stax ,
1311 byteJalankan dan debug itu
Saya menyimpan dua byte ketika saya menyadari input secara kebetulan bisa secara implisit disebut sebagai array literal. Dengan menghapus tanda kutip ganda, input disederhanakan.
Gagasan umum adalah untuk mengevaluasi input sebagai array literal, dan memetakan elemen secara rekursif untuk memeriksa keseimbangan parethesly. Jika pernyataan terakhir pernah gagal, maka akan ada pop berikutnya pada tumpukan kosong. Dalam keadaan stax, bermunculan dengan tumpukan kosong segera menghentikan program.
Dibongkar, tidak diserang, dan dikomentari, sepertinya ini.
Jalankan yang ini
sumber
Java 10,
99969583 bytePort jawaban 05AB1E saya (begitu juga kembali
()
sebagai kebenaran dan apa pun sebagai falsey).Cobalah online.
Penjelasan:
return s;
bisareturn"()".equals(s);
jika hasil boolean yang sebenarnya diperlukan.sumber
!s.contains("()()(")