Seu desafio é expandir alguns colchetes na entrada de um programa, como mostrado:
- Encontre uma string s entre dois colchetes correspondentes
[
e]
, com um único dígito n após o colchete de fechamento. - Retire os suportes.
- Substitua s por si mesmo repetido n vezes. (Se n for 0, basta remover s .)
- Vá para a etapa 1 até que não haja mais colchetes correspondentes na entrada.
Regras e esclarecimentos adicionais:
- Você receberá e dará saída por qualquer meio permitido.
- Uma nova linha à direita na saída é permitida.
- Você só precisa manipular ASCII imprimível na entrada.
- Você pode assumir que todos os colchetes correspondem, ou seja, você nunca receberá a entrada
[]]]]
ou[[[[]
. - Você pode supor que cada colchete de fechamento
]
tenha um dígito depois dele.
Casos de teste:
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
Como se trata de código-golfe , a resposta mais curta em cada idioma vence. Boa sorte!
code-golf
string
compression
decode
MD XF
fonte
fonte
s
nunca deve conter outros colchetes? Por exemplo, tentar resolver[Foo[Bar]3]2
expandindo a cadeiaFoo[Bar
de caracteres 3 vezes resultaria em um estado inválido.Foo[BarFoo[BarFoo[Bar]2
[a[b]2c[d]2e]2
? Você obtémabbcddeabbcdde
expandindob
ed
primeiro, masababcdbcdedbabcdbcdede
expandindoa[b
ed]2e
primeiro.Respostas:
Gema , 17 caracteres
Exemplo de execução:
fonte
Retina ,
242322 bytesExperimente online! Isso é praticamente um recurso interno da Retina 1. Editar: salvou 1 byte graças a @Kobi.
4745 bytes na Retina 0.8.2:Experimente online!
fonte
Haskell ,
10196 bytesExperimente online! Em vez de usar expressão regular como a maioria das outras respostas, isso implementa um analisador recursivo.
-5 bytes graças ao BMO !
fonte
(%)
você economiza 1 byte e['1'..d]
economiza outros 4, veja isso .Perl 5 ,
343329 + 1 (-p
) = 30 bytesExperimente online!
Reduza-o com a ajuda de @Shaggy e @TonHospel.
fonte
]
.perl -pe 's/.([^[]*?)](.)/$1x$2/e&&redo'
eperl -pe 's/.([^][]*)](.)/$1x$2/e&&redo'
Japonês v2 ,
212019 bytesGuardado 2 bytes graças a @Shaggy
Teste online!
e
é substituição recursiva, que faz uma substituição por vez até que não haja mais correspondências. Nesse caso, as correspondências da regex/\[([^[]*?)](\d)/g
são substituídas por <texto interno> repetidas vezes <dígito> até que não haja mais correspondências.De acordo com o que planejei ( aqui ), esse regex deve ser pelo menos
32 bytes mais curto:fonte
]
tem um dígito depois que " você deve ser capaz de substituir(\d
com(.
.\[
por.
JavaScript,
716766 bytesEu tinha uma solução de 54 bytes, mas ela foi atrapalhada pelo segundo caso de teste! :(
Casos de teste
fonte
Python 3 ,
1109392 bytesExperimente online!
-17 bytes graças a pizzapants184 -1 byte graças a Kevin Cruijssen
fonte
in
.(\d)
para(.)
, porque sabemos que um colchete]
é sempre seguido por um dígito.Scala , 173 bytes
Experimente online!
Expandido:
Solução antiga
Scala ,
219215213212199bytesExperimente online!
Expandido:
Onde l é a lista de strings que iremos processar.
Obrigado Kevin Cruijssen por -1 byte
Passou de 212 para 199 removendo um parâmetro não utilizado, não prestou atenção.
fonte
(\d)
para(.)
, porque sabemos que um colchete]
é sempre seguido por um dígito.Empilhados ,
3938 bytesEconomizou 1 byte graças a Shaggy, jogou golfe no regex!
Experimente online!
Simplesmente recursivamente substitui um regex
'\[([^[\]]+)](.)'
pela regra de repetição.fonte
]
.Python 3,
15514810197 bytesExperimente Online
Agradecimentos ao HyperNeutrino e Mego por -47 bytes e user202729 por -4 bytes.
fonte
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 bytesEdit: regex atualizado com a recomendação de Shaggy
Snippet:
Mostrar snippet de código
fonte
f=
!QuadR com o
≡
argumento,3028 bytesExperimente online!
\[[^[]+?].
substitua " caráter[
não[
material]
" por¯2↓⍵M
soltar os dois últimos caracteres do H atch ( "]
dígitos ')1↓
deixar cair o primeiro caracter ('[
")⊂
encerram a ser tratado como um todo(
...)⍴
r eshape de comprimento:⌽⍵M
inverter a M atch⊃
escolher o primeiro (o dígito)⍎
avaliar∊
ε nlist ( aplainar)≡
repita até que não ocorram mais alteraçõesA função Dyalog APL equivalente é de 47 bytes:
Experimente online!
fonte
Java 8,
250249241239 bytes-2 bytes graças a @JonathanFrech (o código contém dois caracteres ASCII não imprimíveis agora, que podem ser vistos no link TIO abaixo).
Suspiro ... Java com regex é tão limitado .. Vou apenas me citar de outra resposta aqui:
Explicação:
Experimente online.
fonte
Wolfram Language (Mathematica) , 86 bytes
Experimente online!
fonte
C,
407368 bytesObrigado a Jonathan Frech por salvar bytes.
golfed (arquivo bracket.c):
ungolfed com o programa:
Compilado com o gcc 5.4.1,
gcc bracket.c
fonte
malloc
erealloc
, inclusivestdlib.h
por conta própria.Vermelho , 147 bytes
Ungolfed:
Comecei a aprender o dialeto do Parse de Red apenas ontem, então tenho certeza de que meu código pode ser melhorado ainda mais. O Parse é incomparavelmente mais detalhado que o regex, mas é muito claro, flexível e legível e pode ser misturado livremente com o restante do idioma vermelho.
Experimente online!
fonte
Gelatina , 30 bytes
Experimente online!
Explicação.
fonte
C, 381 bytes
Versão compacta:
Versão completa:
fonte
Python, 80 bytes
Experimente online!
s("[Foo[Bar]3]2")
Converte[Foo[Bar]3]2
para''+('Foo'+('Bar')*3+'')*2+''
e avalia.Falha na entrada com aspas entre colchetes (por exemplo
[']3
)fonte