Twoim wyzwaniem jest rozszerzenie niektórych nawiasów w danych wejściowych programu, jak pokazano:
- Znajdź ciąg s między dwoma pasującymi nawiasami
[
i]
za pomocą jednej cyfry n po nawiasie zamykającym. - Usuń wsporniki.
- Zamień s na siebie powtórzone n razy. (Jeśli n wynosi 0, po prostu usuń s .)
- Przejdź do kroku 1, aż na wejściu nie będzie pasujących nawiasów.
Dodatkowe zasady i wyjaśnienia:
- Przyjmiesz dane wejściowe i wydasz dane wyjściowe dowolnymi dozwolonymi środkami.
- Końcowy znak nowej linii w danych wyjściowych jest dozwolony.
- Musisz tylko obsługiwać ASCII do wydruku na wejściu.
- Możesz założyć, że wszystkie nawiasy pasują do siebie, tzn. Nigdy nie otrzymasz danych wejściowych
[]]]]
lub[[[[]
. - Możesz założyć, że po każdym nawiasie zamykającym
]
jest cyfra.
Przypadki testowe:
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
Ponieważ jest to gra w golfa , wygrywa najkrótsza odpowiedź w każdym języku. Powodzenia!
code-golf
string
compression
decode
MD XF
źródło
źródło
s
nie powinien nigdy zawierać innych nawiasów? Na przykład próba rozwiązania[Foo[Bar]3]2
przezFoo[Bar
3-krotne rozwinięcie łańcucha spowoduje niepoprawny stanFoo[BarFoo[BarFoo[Bar]2
[a[b]2c[d]2e]2
? Dostajeszabbcddeabbcdde
, rozwijając sięb
id
pierwszy, aleababcdbcdedbabcdbcdede
rozwijając sięa[b
id]2e
pierwszy.Odpowiedzi:
Gema , 17 znaków
Przykładowy przebieg:
źródło
Retina ,
242322 bajtówWypróbuj online! Jest to praktycznie wbudowane w Retina 1. Edycja: Zapisano 1 bajt dzięki @Kobi.
4745 bajtów w Retina 0.8.2:Wypróbuj online!
źródło
Haskell ,
10196 bajtówWypróbuj online! Zamiast używać wyrażeń regularnych, jak większość innych odpowiedzi, implementuje to parser rekurencyjny.
-5 bajtów dzięki BMO !
źródło
(%)
oszczędza 1 bajt i['1'..d]
oszczędza kolejne 4, zobacz to .Perl 5 ,
343329 + 1 (-p
) = 30 bajtówWypróbuj online!
Ogranicz to przy pomocy @Shaggy i @TonHospel.
źródło
]
.perl -pe 's/.([^[]*?)](.)/$1x$2/e&&redo'
iperl -pe 's/.([^][]*)](.)/$1x$2/e&&redo'
Japt v2 ,
212019 bajtówZaoszczędzono 2 bajty dzięki @Shaggy
Przetestuj online!
e
jest zastępowaniem rekurencyjnym, co powoduje jedną zamianę na raz, dopóki nie będzie więcej dopasowań. W takim przypadku dopasowania wyrażenia regularnego/\[([^[]*?)](\d)/g
są zamieniane na <tekst wewnętrzny> powtarzane <cyfra> razy, aż nie będzie już żadnych dopasowań.Zgodnie z tym, co zaplanowałem ( tutaj ), wyrażenie regularne powinno ostatecznie być co najmniej
32 bajty krótsze:źródło
]
ma cyfrę po ” powinien być w stanie wymienić(\d
z(.
.\[
z.
JavaScript,
716766 bajtówI miał rozwiązanie 54 bajtów, ale został wkręcony przez drugi przypadek testowy! :(
Przypadki testowe
źródło
Python 3 ,
1109392 bajtyWypróbuj online!
-17 bajtów dzięki pizzapantom 184 bajty -1 dzięki Kevinowi Cruijssenowi
źródło
in
.(\d)
na(.)
, ponieważ wiemy, że po nawiasie blokowym]
zawsze występuje cyfra.Scala , 173 bajtów
Wypróbuj online!
Rozszerzony:
Stare rozwiązanie
Scala ,
219215213212199bajtówWypróbuj online!
Rozszerzony:
Gdzie l jest listą łańcuchów, które będziemy przetwarzać.
Dzięki Kevin Cruijssen za -1 bajt
Przeszedł z 212 do 199, usuwając nieużywany parametr, nie zwracał uwagi.
źródło
(\d)
na(.)
, ponieważ wiemy, że po nawiasie blokowym]
zawsze występuje cyfra.Skumulowane ,
3938 bajtówZaoszczędził 1 bajt dzięki Kudłatemu, zagrał w regex!
Wypróbuj online!
Po prostu rekurencyjnie zastępuje wyrażenie regularne
'\[([^[\]]+)](.)'
regułą powtarzania.źródło
]
.Python 3,
15514810197 bajtówWypróbuj online
Dzięki HyperNeutrino i Mego za -47 bajtów i user202729 za -4 bajty.
źródło
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 bajtówEdycja: zaktualizowano wyrażenie regularne z zaleceniem Kudłaty
Skrawek:
Pokaż fragment kodu
źródło
f=
!QuadR z
≡
argumentem,3028 bajtówWypróbuj online!
\[[^[]+?].
zamień „[
non-[
stuff]
character” na¯2↓⍵M
upuść dwa ostatnie znaki z M Atch ( „]
cyfrowy«)1↓
spadnie pierwszy znak (»[
”),⊂
załączyć należy traktować jako całość(
...)⍴
r eshape do długości:⌽⍵M
odwrotnej M Atch⊃
wybrać pierwszą (cyfrę)⍎
ocenia∊
ε nlist ( spłaszczyć)≡
powtarzaj, aż nie będą już więcej zmianRównoważna funkcja Dyalog APL ma 47 bajtów:
Wypróbuj online!
źródło
Java 8,
250249241239 bajtów-2 bajty dzięki @JonathanFrech (kod zawiera teraz dwa niedrukowalne znaki ASCII, które można zobaczyć w łączu TIO poniżej).
Westchnienie ... Java z regexem jest tak cholernie ograniczona .. Po prostu zacytuję się z innej odpowiedzi tutaj:
Wyjaśnienie:
Wypróbuj online.
źródło
Wolfram Language (Mathematica) , 86 bajtów
Wypróbuj online!
źródło
DO,
407368 bajtówPodziękowania dla Jonathana Frecha za oszczędność bajtów.
golfed (file brack.c):
bez udziału programu:
Skompilowany z gcc 5.4.1,
gcc bracket.c
źródło
malloc
irealloc
, w tymstdlib.h
samodzielnie.Czerwony , 147 bajtów
Nie golfowany:
Zacząłem uczyć się dialektu Red's Parse dopiero wczoraj, więc jestem pewien, że mój kod można jeszcze ulepszyć. Parsowanie jest nieporównanie bardziej szczegółowe niż wyrażenie regularne, ale jest bardzo jasne, elastyczne i czytelne i można je dowolnie mieszać z resztą języka czerwonego.
Wypróbuj online!
źródło
Galaretka , 30 bajtów
Wypróbuj online!
Wyjaśnienie.
źródło
C, 381 bajtów
Wersja kompaktowa:
Pełna wersja:
źródło
Python, 80 bajtów
Wypróbuj online!
s("[Foo[Bar]3]2")
Konwertuje[Foo[Bar]3]2
na''+('Foo'+('Bar')*3+'')*2+''
i ocenia.Nie można wprowadzić danych z cudzysłowami w nawiasach (np.
[']3
)źródło