Diberikan string yang dikurung dengan benar sebagai input, mengeluarkan daftar semua substring kosong dalam tanda kurung yang cocok (atau di luar semua tanda kurung), dengan tanda kurung bersarang dihapus. Setiap substring harus urutan karakter dalam tanda kurung yang sama persis. Substring harus terdaftar dalam urutan kedalaman, dan substring dengan kedalaman yang sama harus terdaftar dalam urutan mereka terjadi dalam string. Asumsikan input selalu dengan tanda kurung benar.
Anda dapat berasumsi bahwa input hanya berisi huruf ASCII dan tanda kurung kecil.
Jawaban Anda harus berupa fungsi yang, ketika diberikan string, mengembalikan daftar string.
Contoh:
'a(b)c(d)e' -> ['ace', 'b', 'd']
'a(b(c)d)e' -> ['ae', 'bd', 'c']
'a((((b))))' -> ['a', 'b']
'a()b' -> ['ab']
'' -> []
'a' -> ['a']
'(((a(b)c(d)e)f)g)h' -> ['h', 'g', 'f', 'ace', 'b', 'd']
'ab(c(((d)ef()g)h()(i)j)kl)()' -> ['ab', 'ckl', 'hj', 'efg', 'i', 'd']
Bytes paling sedikit menang.
code-golf
string
parsing
balanced-string
redstonerodent
sumber
sumber
'i'
dan'd'
dalam urutan yang benar dalam test case terakhir?i
kurang bersarang dibandingkand
.Jawaban:
JavaScript ES6, 91
93 104 133 148Sunting2 2 byte disimpan thx user81655
Edit Menggunakan lebih banyak string dan lebih sedikit array
Tes menjalankan cuplikan di bawah ini di peramban yang mendukung EcmaScript 6
sumber
c=>l+=c<')'||-(o[l]=(o[l]||'')+c,c<'a'),
.Julia,
1178683 byteIni solusi regex.
Tidak Disatukan:
r"(\(((?>\w|(?1))*)\))(.*)"
adalah(?1)
regex rekursif ( grup rekursi 1) yang akan cocok dengan kurung seimbang terluar pertama (yang tidak mengandung kurung tidak seimbang / terbalik), dengan grup kedua berisi segala sesuatu di dalam kurung (tidak termasuk kurung itu sendiri) dan grup ketiga yang mengandung semuanya setelah tanda kurung (sampai akhir string).replace(v,r"...",s"\g<3> \g<2>")
kemudian akan memindahkan grup kedua ke akhir string (setelah spasi, untuk bertindak sebagai pembatas), dengan tanda kurung yang relevan dihapus. Dengan mengulangi hingga v == w, dipastikan bahwa penggantian diulang sampai tidak ada tanda kurung yang tersisa. Karena kecocokan dipindahkan ke akhir, dan kemudian kecocokan berikutnya berlaku untuk tanda kurung pertama, hasilnya adalah string yang dipecah dalam urutan kedalaman.Kemudian
split
mengembalikan semua komponen non-spasi spasi dari string dalam bentuk array string (yang tidak memiliki spasi putih).Catatan yang
w=""
digunakan dalam kode ungolfed untuk memastikan bahwa loop sementara berjalan setidaknya sekali (kecuali jika string input kosong, tentu saja), dan tidak diperlukan dalam bentuk golf.Terima kasih kepada Martin Büttner untuk bantuan dengan menghemat 3 byte.
sumber
\w
alih-alih[^()]
.Python, 147 byte
Tes unit:
Saya suka teka-teki ini; ini sangat lucu!
sumber
Pyth, 32 byte
Suite uji
Berbasis longgar dari pendekatan @ Quuxplusone. Buat daftar karakter yang dipisahkan oleh spasi di setiap kedalaman, lalu pisahkan dan saring kelompok yang kosong. Daftar kerja diputar untuk menjaga daftar kedalaman saat ini di depan setiap saat.
sumber
Retina ,
4441 byteJalankan dengan
-s
bendera. Perhatikan spasi di akhir baris terakhir.Saya datang dengan solusi ini secara independen dari Glen O tetapi ternyata identik. Idenya adalah untuk mencocokkan pasangan kurung pertama, menghapusnya, dan menyisipkan isinya di akhir output (berulang kali). Karena kurangnya rekursi .NET di regex, saya harus menggunakan grup penyeimbang yang empat byte lebih lama.
Jika Anda tidak memahami regex pertama, izinkan saya merujuk Anda ke jawaban SO saya tentang menyeimbangkan grup . Karena input dijamin dengan tanda kurung yang benar, kita dapat menyimpan dua byte dengan mencocokkan
)
dengan.
alih - alih\)
. Maka kita cukup mencocokkan sisa string dengan(.*)
.$4 $1
pertama menulis kembali kata sisa string (menghilangkan kedua kurung dan isinya), dan kemudian isi kurung setelah spasi. The+`
memberitahu Retina untuk mengulangi langkah ini sampai string berhenti berubah (yang hanya terjadi setelah semua tanda kurung telah dihapus).Tanda kurung kosong akan menghasilkan dua spasi berturut-turut, jadi akhirnya kami membagi seluruh string pada spasi (
S`
mengaktifkan mode split dan regex adalah spasi tunggal). The_
pilihan memberitahu Retina ke bagian kosong omit dari perpecahan, jadi kami tidak termasuk hasil kosong dalam output.sumber
Common Lisp, 160
Ini bisa menjadi empat byte lebih sedikit jika konversi case tidak diperlukan. Idenya adalah menambahkan tanda kurung kiri dan kanan ke setiap sisi dari string input, memperlakukannya sebagai daftar, menulis elemen tingkat atas daftar ke string, dan kemudian memproses sublists dengan cara yang sama.
sumber
Haskell,
114112111 byteContoh penggunaan:
g "ab(c(((d)ef()g)h()(i)j)kl)()"
->["ab","ckl","hj","efg","i","d"]
.Saya akan mundur melalui string input. Struktur data antara adalah daftar daftar string. Daftar luar adalah per level dan daftar dalam adalah per grup di dalam level, misalnya
[["ab"],["ckl"],["hj"],["efg","i"],["d"]]
(catatan: daftar sebenarnya memiliki banyak string kosong di antaranya). Semuanya dimulai dengan sejumlah string kosong yang sama dengan panjang input - lebih dari cukup, tetapi daftar kosong tetap disaring. Daftar luar berputar pada(
/)
atau menambahkan karakter ke elemen depan.)
juga memulai grup baru.Sunting: @Zgarb telah menemukan byte untuk disimpan.
sumber
Sed, 90 byte
Menggunakan regex yang diperluas (
-r
bendera), dihitung dengan +1 byte. Juga, ini menggunakan Ekstensi GNU (M
bendera padas
perintah).Penggunaan sampel:
Penjelasan: Karena sed tidak mendukung hal-hal seperti regex rekursif, pekerjaan manual diperlukan. Ekspresi dibagi menjadi beberapa garis, masing-masing mewakili tingkat kedalaman bersarang. Ekspresi individu pada kedalaman yang sama (dan karenanya pada baris yang sama) dipisahkan oleh a
_
. Script bekerja melalui string input braket satu per satu Input yang tersisa selalu disimpan di ujung jalur yang sesuai dengan level peneluran saat ini.sumber
Python, 161 byte
Inilah yang saya buat, solusi python fungsional satu baris:
Tantangan ini terinspirasi oleh https://github.com/samcoppini/Definition-book , yang menghasilkan string panjang dengan kata yang didefinisikan dalam tanda kurung. Saya ingin menulis kode yang akan memberi saya setiap kalimat, dengan kurung dihapus. Solusi fungsional terlalu lambat untuk menjadi efektif pada string panjang, tetapi solusi imperatif (seperti solusi @ Quuxplusone) jauh lebih cepat.
sumber