Tulis program atau fungsi yang menggunakan string delapan byte yang berisi salah satu dari masing-masing karakter yang ()[]{}<>
disusun sedemikian rupa sehingga empat jenis braket yang cocok. Misalnya, ]<([){}>
input tidak valid karena tanda kurung tidak cocok (meskipun semua yang lain).
Cetak atau kembalikan integer dari 0
ke 6
yang menunjukkan berapa banyak dari enam pasangan yang mungkin dari keempat jenis braket yang saling terkait. Pasangan jenis braket dianggap saling terkait jika tepat satu braket dari satu jenis terjadi di antara braket dari jenis lainnya. Jadi ([)]
dan [(])
yang saling bertautan tetapi ()[]
, []()
, ([])
, dan [()]
tidak.
Kode terpendek dalam byte menang.
Contoh Input / Output
()[]{}<> : 0
([{<>}]) : 0
<>{[]}() : 0
{<>([])} : 0
<(>)[{}] : 1
<[({)}]> : 1
[{<}]>() : 2
{<>([}]) : 2
<{(>})[] : 3
[(]<){>} : 3
<([>{)}] : 4
(<{[>})] : 4
(<[{)>}] : 5
<{[(>})] : 5
[{<(]}>) : 6
(<{[)>}] : 6
sumber
7~f&
? Saya sudah menyukai jawaban ini, dan saya bahkan belum membaca sisanya.Python 2, 163 byte
Ini terlihat pada hal-hal di antara masing-masing pasangan kurung yang cocok dan menghitung jumlah kurung kiri atau kanan yang ada. Jumlah ini dibagi dua adalah output.
Saya yakin itu bisa lebih banyak golf dengan pegolf yang lebih baik dari saya.
sumber
GNU sed -r, 147
Keluaran tidak sesuai dengan meta-jawaban ini .
Catatan: Ganti
\t
dengan tabkarakter aktual untuk mendapatkan skor yang benar. Namun, program ini akan bekerja baik dengan GNU sed.Cobalah online .
sumber
Perl, 77 byte
76 kode + 1 sakelar
Mengambil input dari STDIN dan program harus dimulai baru untuk setiap input.
Penjelasan
y/.../.../
).for$x...
), tambahkan penghitung untuk karakter ($h{$x}++
).length $1
) dan hapus kedua kejadian karakter ini dari string. Misalnya, jika string itu([{([{<<
, ada dua karakter[
dan di{
antara keduanya(
. Setelah(
s diproses, string menjadi[{[{<<
dan kami menambahkan 2 ke jumlah total ($z
) tanda kurung yang saling terkait.$z
($_=$z
)sumber
Pyth, 20 byte
Suite uji
JmC/CdTz
: Pertama, ini mengonversi setiap pasangan simbol ke satu karakter dengan memetakan setiap karakter input ke kode karakternya (Cd
) dibagi 10 (/ T
), yang sama untuk setiap pasangan tetapi berbeda di antara semua pasangan. Angka yang dihasilkan dikonversi kembali menjadi karakter untuk tujuan yang akan diungkapkan kemudian (C
). Daftar karakter yang dihasilkan disimpan keJ
.lsm@FPcsJd{J
: Sekarang, kami memetakan karakter unik diJ
({J
). Kita mulai dengan memotong string yang dibentuk dengan menggabungkanJ
menggunakan karakter saat ini sebagai delimeter (csJd
). Sepasang kurung tumpang tindih dengan pasangan saat ini jika muncul di grup kedua dan grup pertama atau ketiga. Untuk menghindari penghitungan ganda, kami hanya akan menghitung case grup pertama dan kedua. Jadi, kami menghapus grup ketiga (P
) dan mengambil persimpangan grup yang tersisa (@F
). Akhirnya, kami menggabungkan karakter yang tumpang tindih (s
) dan mencetak panjang resut (l
).sumber
Python 3, 107
Secara longgar didasarkan pada solusi CJam saya.
sumber
Retina ,
128108646255 byteDimana
<empty>
mewakili garis trailing kosong. Untuk tujuan penghitungan, letakkan setiap baris dalam file terpisah, dan ganti\n
dengan karakter linefeed yang sebenarnya. Untuk kenyamanan, Anda dapat menggunakan kode setara ini dengan-s
tanda dari satu file:Outputnya unary .
Penjelasan
Yang pertama
(
memberitahu Retina untuk mengeksekusi seluruh kode dalam satu lingkaran sampai iterasi berhenti mengubah string. Dalam hal ini, itu akan selalu diulang empat kali, satu kali untuk setiap jenis braket.Ini hanya mengubah setiap braket penutup menjadi braket pembuka yang sesuai, sehingga kita dapat mencocokkan braket yang sesuai dengan referensi balik sederhana nanti. (Tahap ini menjadi no-op setelah iterasi pertama. Ini hanya termasuk dalam loop, karena
T
sudah memerlukan backtick, jadi menambahkan(
biaya hanya satu, bukan dua byte.)Ini menggantikan pasangan kurung paling kiri dengan baris baru. Kita gunakan
\D
untuk membedakan tanda kurung dari tanda kurung yang1
kita tambahkan nanti dalam loop untuk penghitungan. The(.*)
di akhir memastikan bahwa hanya satu pasangan yang diganti (karena pertandingan tidak dapat tumpang tindih).Seluruh regex berada dalam lookahead, jadi ini cocok dengan posisi . Lebih khusus itu cocok dengan satu posisi untuk setiap pasangan tanda kurung yang telah dipisahkan oleh tanda kurung lain kami baru saja berubah menjadi baris baru. SEBUAH
1
dimasukkan ke dalam masing-masing posisi ini. Kita bisa membiarkan saja1
di sana, karena mereka tidak mempengaruhi regex yang lain (karena dia\D
memastikan bahwa kita tidak cocok dengan mereka secara tidak sengaja).Akhirnya, kami menghapus baris baru (yaitu placeholder untuk jenis kurung saat ini) - ini berarti bahwa kami telah mengurangi masalah yang tersisa menjadi string dengan panjang 6 yang hanya berisi 3 jenis tanda kurung, tetapi jika tidak, kerjanya sama persis.
Pada akhirnya, hanya huruf
1
s yang kami masukkan akan ditinggalkan, dan jumlahnya sesuai dengan jumlah tanda kurung yang saling terkait.sumber
JavaScript (ES7),
121117 byteWow. Itu tadi menyenangkan. Saya membuat sketsa ide jawaban ketika tantangan ini pertama kali keluar, tetapi panjangnya lebih dari 150 byte dan saya tidak ingin melakukan upaya untuk golf itu. Saya menemukan ide ini di notebook saya kemarin dan memutuskan saya tidak akan berhenti memikirkannya sampai saya benar-benar bermain golf. Saya akhirnya menulis dua algoritma yang sama sekali baru, yang pertama berakhir dengan beberapa byte lebih pendek setelah bermain golf sekitar 25 byte dengan banyak bit-hacking.
Bagaimana itu bekerja
Pertama kita atur variabel
a
danb
ke0
.a
adalah array biner 4-bit di mana pasangan braket saat ini kita berada di dalam, danb
merupakan array biner 16-bit di mana pasangan braket dihubungkan bersama.Selanjutnya, kita mengulang setiap karakter
c
dix
, dan setiap karakterd
di'0123'
. Pertama kita menentukan jenis bracketc
adalah dengane=c.charCodeAt()/26-1|0
. Kode karakter desimal masing-masing jenis braket adalah sebagai berikut:Dengan membaginya dengan 26, mengurangi 1, dan lantai, kami memetakan ini masing-masing menjadi 0, 1, 2, dan 3.
Selanjutnya kita periksa apakah angka ini sama dengan nilai saat ini
d
. Jika ya, kita baik masuk atau keluard
th jenis bracket, jadi kami membalikd
bit th dia
dengana^=1<<d
. Jika tidak, tetapi kita berada di dalamd
tipe braket th, kita perlu membalike
bitd
ke-4 di bagian 4-bitb
. Ini dilakukan seperti ini:(a>>d&1)
Mengembalikand
bit ke dalama
. Jika kita berada di dalamd
tipe braket th, ini mengembalikan 1; jika tidak, ia mengembalikan 0. Selanjutnya, kita menggeser ini ditinggalkan olehd*4+e
bit, dan XORb
oleh hasilnya. Jika kita berada di dalamd
tipe braket th, ini XORd*4+e
bit thb
; jika tidak, ia tidak melakukan apa-apa.Di akhir semua perulangan,
b
akan berisi sejumlah 1-bit sama dengan dua kali nilai pengembalian yang diinginkan. Tetapi kita masih perlu mencari tahu berapa banyak bit ini. Di situlah sub-fungsif
masuk:Jika
y
0, ini hanya mengembalikan 0. Jika tidak, dibutuhkan bit terakhiry
dengany%2
, lalu menambahkan hasil menjalankan semua kecuali bit terakhiry
melalui fungsi lagi. Sebagai contoh:Kami menjalankan
b
melalui fungsi ini dan membagi hasilnya dengan 2, dan ada jawaban kami.sumber
Oracle SQL 11.2, 206 byte
Tidak golf:
sumber