Recentemente, tenho me entregado a alguma nostalgia na forma de Bookworm Deluxe:
Caso você nunca tenha visto isso antes, é um jogo de palavras em que o objetivo é conectar peças adjacentes para formar palavras. Para determinar se uma string é uma palavra válida, ela é comparada com seu dicionário interno, que é armazenado em um formato compactado com a seguinte aparência:
aa
2h
3ed
ing
s
2l
3iis
s
2rdvark
8s
4wolf
7ves
As regras para descompactar o dicionário são simples:
Leia o número no início da linha e copie esses caracteres desde o início da palavra anterior. (Se não houver número, copie o número de caracteres que você fez da última vez.)
Acrescente as seguintes letras à palavra.
Portanto, nossa primeira palavra é aa
, seguida por 2h
, que significa "copiar as duas primeiras letras de aa
e acrescentar h
", formando aah
. Então 3ed
se torna aahed
e, como a próxima linha não tem um número, copiamos três caracteres novamente para formar aahing
. Esse processo continua no restante do dicionário. As palavras resultantes da pequena entrada de amostra são:
aa
aah
aahed
aahing
aahs
aal
aaliis
aals
aardvark
aardvarks
aardwolf
aardwolves
Seu desafio é realizar essa descompactação no menor número de bytes possível.
Cada linha de entrada conterá zero ou mais dígitos 0-9
seguidos por uma ou mais letras minúsculas a-z
. Você pode receber e fornecer saída como uma lista de cadeias ou como uma única cadeia com palavras separadas por qualquer caractere que não seja 0-9
/ a-z
.
Aqui está outro pequeno caso de teste com alguns casos extremos não abordados no exemplo:
abc cba 1de fg hi 0jkl mno abcdefghijk 10l
=> abc cba cde cfg chi jkl mno abcdefghijk abcdefghijl
Você também pode testar seu código no dicionário completo: entrada , saída .
0
, terá0
s iniciais ?locate
programa usa esse tipo de codificação em nomes de caminho.Respostas:
Vim, 57 bytes
Experimente online!
fonte
<H<G
vez da última substituição funcionaria?<
solução desanime o tempo suficiente.:%s/ *
vez da última substituição para salvar dois bytes.JavaScript (ES6),
66 6261 bytesExperimente online!
Comentado
fonte
Perl 6 ,
50bytes-2 bytes graças a nwellnhof
Experimente online!
Um porto da solução de Arnauld . Cara, esse
R||
truque foi uma montanha-russa de 'Eu acho que isso é possível', 'nah, é impossível', 'meio que talvez seja possível' e finalmente 'aha!'Explicação:
A
$l [R||]=~$/
parte é traduzida aproximadamente para$l= ~$/||+$l
mas ... tem a mesma quantidade de bytes:(
. Originalmente, ele salvava bytes usando uma variável anônima, paramy$l
que omap
código desaparecesse, mas isso não funciona, já que o escopo agora é a substituição, não o codeblock. Ah bem. De qualquer forma,R
é o metaoperador reverso, portanto, inverte os argumentos de||
, portanto, a$l
variável acaba sendo atribuída ao novo número (~$/
) se existir, caso contrário, ela mesma novamente.Pode ter 47 bytes se o Perl 6 não gerar um erro de compilador meio redundante
=~
.fonte
Ruby ,
494543 bytesExperimente online!
Explicação
fonte
C,
65bytes 57Experimente online!
Explicação:
fonte
brainfuck , 201 bytes
Experimente online!
Requer uma nova linha à direita no final da entrada. Uma versão sem esse requisito tem 6 bytes a mais:
brainfuck , 207 bytes
Experimente online!
Ambas as versões assumem que todos os números são estritamente menores que 255.
Explicação
A fita é apresentada da seguinte forma:
A célula "número" é igual a 0 se nenhum dígito for inserido e n + 1 se o número n for inserido. A entrada é obtida na célula marcada com "85".
fonte
Python 3.6+,
172195156123122121104 bytesExperimente online!
Explicação
Eu cedi e usei expressões regulares. Isso salvou pelo menos 17 bytes. :
Quando a string não começa com um dígito, o comprimento dessa string será
0
. Isso significa que:será
n
set
estiver vazio eint(t)
caso contrário.remove o número do qual a expressão regular encontrada
s
(se não houver um número encontrado, ele remove0
caracteres, deixando sems
truncamento) e substitui todos, exceto os primeirosn
caracteres da palavra anterior, pelo fragmento de palavra atual; e:gera a palavra atual.
fonte
Haskell,
8281 bytesPega e retorna uma lista de strings.
Experimente online!
Edit: -1 byte graças a @Nitrodon.
fonte
Japt,
191817 bytesInspirado inicialmente pela solução JS da Arnauld .
Tente
fonte
Gelatina , 16 bytes
Experimente online!
Como funciona
fonte
Python 2 , 118 bytes
Experimente online!
fonte
Retina 0.8.2 , 69 bytes
Experimente online! O link inclui casos de teste mais difíceis. Explicação:
Para todas as linhas que começam com letras, copie o número da linha anterior, fazendo um loop até que todas as linhas comecem com um número.
Converta o número para unário.
Use grupos de balanceamento para substituir todos os
1
s pela letra correspondente da linha anterior. (Isso acaba sendo um pouco mais desafiador do que substituir todas as séries de1
s.)fonte
Vermelho , 143 bytes
Experimente online!
fonte
Java (JDK) , 150 bytes
Experimente online!
fonte
Groovy , 74 bytes
Experimente online!
Explicação:
fonte
Gelatina , 27 bytes
Experimente online!
fonte
Perl 5
-p
,4541 bytesExperimente online!
Explicação:
fonte
Groovy ,
10399 bytesExperimente online!
fonte
05AB1E ,
201917 bytesExperimente online ou verifique todos os casos de teste .
Explicação:
fonte
Lisp comum, 181 bytes
Experimente online!
Ungolfed:
Como de costume, os longos identificadores do Common Lisp o tornam não particularmente adequado para o PPCG.
fonte
Python 2 ,
10110099 bytesExperimente online!
fonte
C # (compilador interativo do Visual C #) , 134 bytes
Experimente online!
-9 bytes graças a @ASCIIOnly!
Menos golfe ...
fonte
l=n>0?n:l
paral=m>0?n:l
porque não estava pegando o caso quando uma linha começou com zero (0jkl
). Obrigado pela dica!Scala ,
226129102 bytesObrigado @ ASCII-only por seu trabalho aqui (e pela resposta do Groovy).
Experimente online!
fonte