Tantangan Anda adalah untuk memperluas beberapa tanda kurung di input program seperti yang ditunjukkan:
- Temukan string di antara dua tanda kurung yang cocok
[
dan]
, dengan satu digit n setelah braket penutup. - Lepaskan kurung.
- Ganti s dengan dirinya sendiri berulang kali n . (Jika n adalah 0, cukup hapus s .)
- Lanjutkan ke langkah 1 hingga tidak ada lagi tanda kurung yang cocok di input.
Aturan dan klarifikasi tambahan:
- Anda akan mengambil input dan memberikan output melalui segala cara yang diizinkan.
- Baris baru yang tertinggal di output diizinkan.
- Anda hanya perlu menangani ASCII yang dapat dicetak dalam input.
- Anda dapat berasumsi bahwa semua tanda kurung cocok, artinya Anda tidak akan pernah menerima input
[]]]]
atau[[[[]
. - Anda dapat mengasumsikan bahwa setiap braket penutup
]
memiliki angka setelahnya.
Kasus uji:
Input -> Output
[Foo[Bar]3]2 -> FooBarBarBarFooBarBarBar
[one]1[two]2[three]3 -> onetwotwothreethreethree
[three[two[one]1]2]3 -> threetwoonetwoonethreetwoonetwoonethreetwoonetwoone
[!@#[$%^[&*(]2]2]2 -> !@#$%^&*(&*($%^&*(&*(!@#$%^&*(&*($%^&*(&*(
[[foo bar baz]1]1 -> foo bar baz
[only once]12 -> only once2
[only twice]23456789 -> only twiceonly twice3456789
[remove me!]0 ->
before [in ]2after -> before in in after
Karena ini adalah kode-golf , jawaban terpendek dalam setiap bahasa menang. Semoga berhasil!
code-golf
string
compression
decode
MD XF
sumber
sumber
s
tidak boleh mengandung tanda kurung lain? Misalnya, mencoba menyelesaikan[Foo[Bar]3]2
dengan memperluas stringFoo[Bar
3 kali akan menghasilkan keadaan yang tidak validFoo[BarFoo[BarFoo[Bar]2
[a[b]2c[d]2e]2
? Anda dapatkanabbcddeabbcdde
dengan memperluasb
dand
pertama, tetapiababcdbcdedbabcdbcdede
dengan memperluasa[b
dand]2e
pertama.Jawaban:
Gema , 17 karakter
Contoh dijalankan:
sumber
Retina ,
242322 byteCobalah online! Ini sebenarnya adalah builtin di Retina 1. Edit: Disimpan 1 byte berkat @Kobi.
4745 byte di Retina 0.8.2:Cobalah online!
sumber
Haskell ,
10196 byteCobalah online! Alih-alih menggunakan ekspresi reguler seperti sebagian besar jawaban lainnya, ini mengimplementasikan pengurai rekursif.
-5 byte terima kasih kepada BMO !
sumber
(%)
menghemat 1 byte dan['1'..d]
menghemat 4 byte lagi, lihat ini .Perl 5 ,
343329 + 1 (-p
) = 30 byteCobalah online!
Hentikan itu dengan bantuan dari @Shaggy dan @TonHospel.
sumber
]
.perl -pe 's/.([^[]*?)](.)/$1x$2/e&&redo'
danperl -pe 's/.([^][]*)](.)/$1x$2/e&&redo'
Japt v2 ,
212019 byteDisimpan 2 byte berkat @Shaggy
Uji secara online!
e
adalah penggantian rekursif, yang membuat penggantian satu per satu sampai tidak ada lagi yang cocok. Dalam hal ini, kecocokan dari regex/\[([^[]*?)](\d)/g
diganti dengan <teks dalam> diulangi <digit> sampai tidak ada lagi kecocokan.Menurut apa yang telah saya rencanakan (di sini ), regex ini pada akhirnya harus setidaknya
32 byte lebih pendek:sumber
]
memiliki angka setelahnya " Anda harus dapat menggantinya(\d
dengan(.
.\[
dengan.
JavaScript,
716766 byteSaya punya solusi 54 byte tetapi gagal oleh test case kedua! :(
Uji Kasus
sumber
Python 3 ,
1109392 byteCobalah online!
-17 byte terima kasih kepada pizzapants184 -1 byte terima kasih kepada Kevin Cruijssen
sumber
in
.(\d)
ke(.)
, karena kita tahu blok-braket]
selalu diikuti oleh angka.Scala , 173 byte
Cobalah online!
Diperluas:
Solusi lama
Scala ,
219215213212199byteCobalah online!
Diperluas:
Di mana l adalah daftar string yang akan kami proses.
Terima kasih Kevin Cruijssen untuk -1 byte
Pergi dari 212 hingga 199 dengan menghapus parameter yang tidak digunakan, tidak memperhatikan.
sumber
(\d)
ke(.)
, karena kita tahu blok-braket]
selalu diikuti oleh digit.Ditumpuk ,
3938 byteDisimpan 1 byte berkat Shaggy, golf regex!
Cobalah online!
Secara rekursif menggantikan regex
'\[([^[\]]+)](.)'
dengan aturan pengulangan.sumber
]
.Python 3,
15514810197 byteCobalah secara Online
Berkat HyperNeutrino dan Mego untuk -47 byte dan user202729 untuk -4 byte.
sumber
def f(x):a=x.rfind('[');b=x.find(']',a);return f(x[:a]+x[a+1:b]*int(x[b+1])+x[b+2:])if~a else x
JavaScript -
777572 byteSunting: regex yang diperbarui dengan rekomendasi Shaggy
Potongan:
Tampilkan cuplikan kode
sumber
f=
!QuadR dengan
≡
argumen,3028 byteCobalah online!
\[[^[]+?].
ganti " karakter[
non-[
barang]
" dengan¯2↓⍵M
menjatuhkan dua karakter terakhir dari M atch ( "]
digit ')1↓
menjatuhkan karakter pertama ('[
")⊂
melampirkan diperlakukan secara keseluruhan(
...)⍴
r eshape dengan panjang:⌽⍵M
membalikkan M atch⊃
memilih pertama (digit)⍎
mengevaluasi∊
ε nlist ( meratakan)≡
ulangi sampai tidak ada lagi perubahan yang terjadiFungsi Dyalog APL yang setara adalah 47 byte:
Cobalah online!
sumber
Java 8,
250249241239 byte-2 byte berkat @JonathanFrech (kode mengandung dua karakter ASCII yang tidak dapat dicetak sekarang, yang dapat dilihat pada tautan TIO di bawah).
Sigh ... Java dengan regex sangat terbatas .. Saya hanya akan mengutip sendiri dari jawaban lain di sini:
Penjelasan:
Cobalah online.
sumber
Bahasa Wolfram (Mathematica) , 86 byte
Cobalah online!
sumber
C,
407368 byteTerima kasih kepada Jonathan Frech untuk menghemat byte.
golf (braket file.c):
ungolfed dengan program:
Dikompilasi dengan gcc 5.4.1,
gcc bracket.c
sumber
malloc
danrealloc
, termasukstdlib.h
olehnya sendiri.Merah , 147 byte
Tidak Disatukan:
Saya mulai belajar dialek Red's Parse hanya kemarin, jadi saya yakin kode saya dapat ditingkatkan lebih lanjut. Parse jauh lebih verbose daripada regex, tetapi sangat jelas, fleksibel dan mudah dibaca dan dapat dicampur secara bebas dengan sisa bahasa Merah.
Cobalah online!
sumber
Jelly , 30 byte
Cobalah online!
Penjelasan.
sumber
C, 381 byte
Versi ringkas:
Versi lengkap:
sumber
Python, 80 byte
Cobalah online!
s("[Foo[Bar]3]2")
Konversi[Foo[Bar]3]2
ke''+('Foo'+('Bar')*3+'')*2+''
, dan mengevaluasi.Gagal untuk input dengan kutipan dalam tanda kurung (mis.
[']3
)sumber