Ini adalah salah satu dari serangkaian tantangan menjelang ulang tahun Brain-Flak. Cari tahu lebih lanjut di sini .
Tantangan
Untuk tantangan ini, sasaran Anda adalah menemukan pasangan kurung yang paling cocok dalam serangkaian kurung yang sepenuhnya cocok ()[]{}<>
. Untuk meminjam definisi DJMcMayhem tentang string yang sepenuhnya cocok:
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.
[(){<><>[()]}<>()] <[{((()))}]>
Sebuah string dianggap "Sepenuhnya cocok" jika dan hanya jika masing-masing pasangan braket memiliki braket pembukaan dan penutupan yang benar dalam urutan yang benar.
Memasukkan
Input akan terdiri dari string nonempty tunggal atau array char yang hanya berisi karakter ()[]{}<>
, dan dijamin akan sepenuhnya cocok. Anda dapat mengambil input dengan cara apa pun yang sesuai dengan standar i / o kami .
Keluaran
Output dari program atau fungsi Anda akan menjadi indeks braket yang menutup yang pertama. Output harus salah 0
atau 1
diindeks. Sekali lagi, output mungkin dengan cara apa pun yang sesuai dengan standar i / o kami .
Uji Kasus
Input 0-indexed 1-indexed
() 1 2
(<>) 3 4
<[]{<>}> 7 8
{}{}{}{} 1 2
[[]<>[]] 7 8
Ini adalah kode-golf , byte terkecil menang!
Jawaban:
V , 4 byte
Cobalah online!
Ini, tidak seperti kebanyakan jawaban V, menggunakan pengindeksan 0. Saya sangat bangga dengan jawaban ini, dan seberapa jauh bahasa saya telah muncul. Penjelasan:
sumber
Brain-Flak ,
685, 155, 151, 137 byteCobalah online!
136 byte kode, ditambah satu byte untuk
-a
. Satu diindeks.530 bytes bermain golf! Itu mungkin golf terbesar yang pernah saya lakukan.
14 byte disimpan berkat Riley!
Ini menyalahgunakan formula kurung buka / tutup: jika Anda mengambil nilai ASCII, menambah satu per satu, dan mengambil modulo dari 4, pembuka (
({[<
) akan selalu mendapatkan0
atau1
, sedangkan penutup ()}]>
) akan selalu mendapatkan 2 atau 3.Penjelasan:
sumber
n-1&2
/n+1&2
/-n&2
ataun%7&2
untuk membedakan tanda kurung buka dan tutup ...&2
, tapi saya akan memeriksanya.0
/1
dan2
/3
... meskipun sekarang setelah saya melihatnya, Anda hanya mengurangi jika positif. Trik keren juga :-)(TOS+1)%4
bisa lebih pendek: Cobalah secara online!05AB1E ,
17 1610 byte-1 berkat carusocomputing
-6 terima kasih kepada Adnan untuk wawasannya yang luar biasa bahwa "setelah bertambah, bit terakhir kedua adalah 0 untuk braket pembuka dan 1 untuk braket penutupan"
Cobalah online!
sumber
žu
tampaknya bisa digunakan di sini.žu8ÝÈÏ
jadi, tidak, tidak terlalu lol. Paling-paling masih 5 byte. Saya berpikir untuk membagi kawat gigi menjadi dua, dan menghapus kawat gigi sampai hanya ada satu pasangan yang tersisa, penghitung kenaikan sebesar 2 untuk setiap pasangan yang dilepas. Saya tidak tahu kalau itu kurang. Mencoba itu atm.Ç>2&<.pO0k
.0
untuk braket pembuka dan1
untuk braket penutup.Vim, 23 byte
Cobalah online!
Saya sangat sedih dengan jawaban ini. Solusi ini sangat indah dan pendek, tetapi, secara default, vim tidak mempertimbangkan
<
dan>
cocok, jadi saya perlu 13 byte kode boilerplate. Kalau tidak, ini hanya akan menjadi 10 byte.Saya akan memposting jawaban V, tetapi itu hanya akan menjadi satu byte lebih pendek, yaitu berubah
Vr
menjadiÒ
, karenaVr
merupakan vim-idiom yang umum.Ini adalah 1-diindeks tetapi bisa diubah sepele menjadi 0-diindeks dengan mengubah
1
ke a0
.sumber
Jelly ,
11109 byteCobalah online!
Penjelasan
Idenya di sini adalah untuk menemukan "formula ajaib" yang dapat membedakan pembukaan dari kurung tutup. Saya awalnya menggunakan
O%7&2
(yaitu "mengambil kode ASCII, modulo 7, bitwise-and 2"), tetapi disarankan @ETHproductionsO’&2
(yang menggantikan modulo 7 dengan penurunan); keduanya mengembalikan 0 untuk satu jenis braket dan 2 untuk yang lain. Mengurangkan 1 (’
) akan menjadikan hasil ini menjadi -1 dan 1.Sisa kode tersebut adalah
+\
.+\
menghasilkan jumlah kumulatif. Jika satu set tanda kurung cocok dengan benar, itu akan berisi jumlah yang sama dari -1s dan 1s, yaitu jumlah kumulatifnya adalah 0. Maka kita hanya perlu mengembalikan indeks dari 0 pertama dalam daftar yang dihasilkan; kita bisa melakukannya dengani0
.sumber
b*2%7>3
Retina ,
2624 byteCobalah online!
Hasilnya berbasis 1.
Penjelasan
Solusi Retina yang sangat berbeda yang pada dasarnya didasarkan pada regex tunggal (dan sangat mudah dibaca ...). Ini menggunakan teknik baru yang saya temukan kemarin untuk mencocokkan string seimbang menggunakan kelompok balancing .
Temukan (
M
) dan kembalikan (!
) semua kecocokan regex^.(?<-1>([[({<])*.)*
. Regex itu melompati karakter pertama dari string dan kemudian menggunakan kelompok penyeimbang untuk melacak kedalaman sarang. Setiap[({<
penambahan kedalaman (dilacak oleh grup1
) dan karakter lain mana pun menurunkan kedalaman (pada prinsipnya,.
memungkinkan kedalaman untuk dikurangi dengan membuka tanda kurung juga, tetapi karena regex dicocokkan dengan rakus, backtracker tidak akan pernah mencoba yang ). Trik yang aneh adalah bahwa(?<-1>...)
kelompok melampirkan1
yang berfungsi karena muncul dari kelompok penyeimbang terjadi di akhir kelompok. Ini menghemat dua byte dari pendekatan standar dalam formulir((open)|(?<-2>close))*
. Kecocokan harus berhenti di braket yang menutup yang pertama, karena kami melewatkannya, sehingga tidak diperhitungkan dalam kedalaman tumpukan (dan kedalaman tumpukan tidak bisa negatif).Panjang pertandingan ini adalah indeks berdasarkan braket yang kami cari.
Cukup hitung jumlah kecocokan kosong dalam string ini. Regex kosong selalu cocok sekali lagi daripada ada karakter di string, jadi ini memberi kita indeks berbasis 1 dari braket yang kita cari.
sumber
Retina , 24 byte
Cobalah online!
Ini terinspirasi oleh solusi Martin Ender .
Penjelasan
Baris pertama adalah regex yang cocok dengan karakter diikuti oleh string yang seimbang sampai ke akhir string utama (untuk penjelasan rinci tentang bagaimana kelompok penyeimbang digunakan dalam regex ini lihat jawaban Martin). Karena regex mencari kecocokan dari kiri ke kanan, ini akan menemukan subfix tepat terpanjang seimbang, yaitu segalanya setelah braket yang menutup yang pertama, ditambah braket itu sendiri.
Baris berikut kosong, jadi kami mengganti kecocokan dengan string kosong, artinya sekarang kami hanya perlu menghitung karakter yang tersisa untuk mendapatkan hasil (diindeks 0) yang diinginkan.
Baris kosong terakhir menghitung jumlah kecocokan string kosong dalam string, yang merupakan satu lebih dari jumlah karakter dalam string, setara dengan hasil 1-diindeks.
sumber
Perl 5 , 28 byte
Disimpan 6 byte dengan menggunakan hanya
.
bukan[>})\]]
, dari Martin Ender ini Retina jawaban .27 byte kode +
-p
bendera.Cobalah online!
Regex rekursif, penemuan yang indah.
Regex mencari braket pembuka (
[<{([]
), diikuti dengan panggilan rekursif (?0
), diikuti oleh braket penutup (.
). Semua ini tidak rakus (+?
) sehingga cocok sesingkat mungkin dari awal. Indeks akhir pertandingan adalah jawabannya, dan ketika itu terjadi, dapat ditemukan di$+[0]
.sumber
JavaScript (ES6),
555352 byteDisimpan 1 byte berkat @Adnan
Untuk setiap braket pembuka, mengambil mod kode-nya 4 memberi kita 0 atau 3; untuk kurung penutup, memberi kita 1 atau 2. Oleh karena itu, kita dapat membedakan antara kurung buka dan tutup dengan meniadakan kode-braket braket (yang membalik bit dan mengurangi 1) dan mengambil bit paling tidak signifikan kedua; itu adalah
n&2
,.sumber
n-1&2
,-n&2
juga berfungsi?C,
757256555445 byteLihat itu berfungsi online .
Jika Anda ingin output diindeks 1 daripada diindeks 0, ganti yang terakhir
0
dengan1
.sumber
Python 2.7 + Numpy,
8579 byteUpaya pertama saya di kode golf:
sumber
Brain-Flak , 97 byte (96 untuk kode, 1 untuk bendera)
Jalankan dengan
-a
bendera.Cobalah online!
Penjelasan:
Itu hanya berfungsi, oke.
sumber
Retina , 34 byte
Cobalah online!
Hasilnya berbasis 0.
Penjelasan
Ganti karakter pertama dengan a
!
. Ini menyebabkan braket yang kami cari tidak tertandingi.Ubah tanda kurung, kurung siku dan kurung kurawal ke kurung siku. Karena string dijamin sepenuhnya cocok, kami sama sekali tidak peduli dengan tipe yang sebenarnya, dan ini menghemat beberapa byte pada langkah berikutnya.
Berulang-ulang (
+
) ganti setiap karakter di semua kecocokan<!*>
dengan!
s. Artinya, kami mencocokkan pasangan kurung yang tidak mengandung tanda kurung yang tidak diproses lebih lanjut dan mengubahnya menjadi tanda seru lebih lanjut. Ini akan mengubah seluruh string kecuali braket penutup yang tidak cocok menjadi tanda seru.Hitung jumlah tanda seru terdepan, yang sama dengan posisi berbasis 0 dari tanda non-seru pertama (yaitu braket yang tidak cocok). The
\G
jangkar setiap pertandingan dengan yang sebelumnya, yang mengapa ini tidak menghitung!
s setelah braket kata.sumber
(?!(2))
adil(?!2)
. Anda mungkin berarti(?(2)(?!))
atau(?2)!)
. Anda juga lupa untuk lolos]
dan final+
harus*
.PHP, 116 Bytes
Versi Online
sumber
<?php
?Python , 76 byte
Fungsi rekursif yang menggunakan LSB 2nd ordinal sebagai bendera untuk trik buka vs tutup yang digunakan oleh banyak ditemukan oleh Adnan (dan mungkin yang lain). Ekor hits ketika jumlah kumulatif
-1
untuk membuka dan1
menutup mencapai nol. Indeks disimpan dalam variabel karena byte-lebih murah daripada menggunakanlen(r)
, pengindeksan adalah berbasis 1.Cobalah online!
sumber
Ruby,
3534 byteBerdasarkan jawaban Dada's Perl5 . Output diindeks 1. Membutuhkan interpreter Ruby untuk dipanggil dengan
-n
opsi (while gets
loop implisit ).Sunting: Ini juga
3534 byte, tetapi merupakan titik awal lain yang mungkin untuk mengurangi jawaban ini lebih lanjut.Sunting2: Menghapus spasi yang tidak perlu setelah
p
.Sunting3: Sepasang lagi jawaban 34-byte.
sumber
Python 3 ,
59555049 byteOutput diindeks 0. Rumus untuk menentukan arah braket pertama kali ditemukan oleh @ETHProductions dan ditingkatkan oleh @Adnan.
Cobalah online!
sumber
Batch, 172 byte
1-diindeks.
<>
Tentu saja karakter khusus dalam Batch jadi saya tidak hanya harus mengutip seluruh tetapi saya bahkan tidak bisa melakukan trik seperti membuat merekagoto
label.sumber
R, 126 Bytes
sumber
C, 127 byte
Coba Online
Keluaran
sumber