Nesse desafio, sua tarefa é decifrar uma string. Felizmente, o algoritmo é bastante simples: lendo da esquerda para a direita, cada dígito encontrado N (0 a 9) deve ser substituído pelo caractere que está nas posições N + 1 antes dele.
Exemplo
A string de entrada "Prog2am0in6"
seria decodificada da seguinte maneira:
Portanto, a saída esperada é "Programming"
.
Esclarecimentos e regras
- A sequência de entrada conterá caracteres ASCII exclusivamente no intervalo 32 - 126. Você pode assumir que nunca estará vazio.
- A sequência decifrada original é garantida para não conter nenhum dígito.
- Uma vez decodificado, um caractere pode ser referenciado por um dígito subsequente. Por exemplo,
"alp2c1"
deve ser decodificado como"alpaca"
. - As referências nunca serão agrupadas em torno da string: somente caracteres anteriores podem ser referenciados.
- Você pode gravar um programa completo ou uma função que imprima ou produz o resultado.
- Isso é código de golfe, então a resposta mais curta em bytes vence.
- As brechas padrão são proibidas.
Casos de teste
Input : abcd
Output: abcd
Input : a000
Output: aaaa
Input : ban111
Output: banana
Input : Hel0o W2r5d!
Output: Hello World!
Input : this 222a19e52
Output: this is a test
Input : golfin5 3s24o0d4f3r3y3u
Output: golfing is good for you
Input : Prog2am0in6 Puz0les7&1Cod74G4lf
Output: Programming Puzzles & Code Golf
Input : Replicants 4re3lik448ny3oth8r5mac6in8.8T64y'r371it9376a1b5n1fit7or2a1h2z17d.
Output: Replicants are like any other machine. They're either a benefit or a hazard.
1bbab
uma entrada válida (com saída esperada deabbab
)? Em outras palavras, as referências podem envolver a string?1bbab
não é válido. Eu adicionei um esclarecimento sobre isso.Respostas:
Geléia ,
97 bytesExperimente online!
Como funciona
fonte
Java 7,
8180 bytesExperimente online!
Guardou 1 byte graças a Anders Tornblad . O primeiro caractere não pode ser um dígito, portanto, não precisa ser verificado, o que significa que podemos pré-incrementar antes de verificar nossa condição de término.
fonte
for(int i=0;++i<a.length;){
salvando um caractere.Haskell, 55 bytes
Exemplo de uso:
reverse.foldl(#)[] $ "Prog2am0in6 Puz0les7&1Cod74G4lf"
->"Programming Puzzles & Code Golf"
. Experimente online!Reduza a sequência para uma cópia reversa de si mesma com os números substituídos pelos caracteres correspondentes. "reverse", porque dessa maneira temos fácil acesso à string até o momento ao indexar os números. Inverta novamente.
fonte
C, 46 bytes
Experimente online!
C,
524948 bytesObrigado a @ l4m2 por salvar um byte!
Edita a sequência de entrada diretamente.
Experimente online!
Versão alternativa de 50 bytes:
Versão recursiva, 48 bytes:
fonte
05AB1E , 11 bytes
Experimente online!
Explicação
fonte
JavaScript (ES6),
5953 bytesEconomizou 7 bytes graças a fəˈnɛtɪk.
fonte
o-m-1
pode ser substituído poro+~m
.f=
parte, por isso esta é 54 bytes, e não 52.Retina , 37 bytes
A contagem de bytes assume a codificação ISO 8859-1.
Experimente online!
Explicação
Substitua cada dígito d por d
«
s, seguido por um»
. Precisamos que o último a) seja capaz de reconhecer posições onde d = 0 eb) como um separador entre dígitos adjacentes.Faça corresponder repetidamente (
+
) a regex na primeira linha da direita para a esquerda (r
) e substitua a correspondência mais à esquerda (1
) pela substituição na segunda linha.A regex em si corresponde a um de nossos dígitos agora unários e conta o número de
«
s no grupo 2. O lookbehind combina os caracteres d com(?<-2>.)*
antes de capturar o caractere referido no grupo 1. A sequência de«
s e»
é substituída pelo caractere capturado .fonte
MATL ,
21191716 bytesExperimente no MATL Online!
Explicação
fonte
$y
na nova versão!U
funcionasse apenas com dígitos. Infelizmente'e'U
produzexp(1)
senão eu poderia ter se livrado do4Y2
materialJavaScript (ES6), 51 bytes
a
é usado para armazenar os dígitos substituídos para lidar com dígitos referentes a outros dígitos.fonte
Perl 5 , 34 bytes
33 bytes de código +
-p
sinalizador.Experimente online!
s/\d/.../e
substitua o primeiro dígito por...
avaliado como código Perl. (...
sendosubstr$_,-$&-1+pos,1
nesse caso.substr$_,-$&-1+pos,1
retorna a substring of$_
of length1
no índice-$&-1+pos
, onde$&
é o número que acabou de corresponder epos
é o índice do início da partida. Só precisamos saberredo
se a substituição foi bem-sucedida para substituir todos os dígitos. (e o resultado é impresso implicitamente graças à-p
bandeira).Abordagem antiga, 47 bytes:
44 bytes de código +
-F
sinalizador.Experimente online!
Muito simples, na verdade.
-F
flag divide as entradas em cada caractere@F
.map{...}@F
itera através@F
(ou seja, todos os caracteres da entrada). Se o caractere for um dígito (/\d/
), então o substituiremos pelo caractere no índice$i-$_-1
. A$i
é a variável de índice atual (que mantemos incrementando a cada caractere visto).fonte
JavaScript ES6,
6159 bytesObrigado @Luke por jogar fora 8 bytes
Experimente online!
fonte
x.split``
Também poderia ser[...x]
,[0-9]
poderia ser\d
, em conjunto poupança 6Bx=>[...x].map((p,i,a)=>+p+1?a[i-1-p]:p).join``
para 46 bytesx=>[...x].map((p,i,a)=>a[i]=1+p>9?a[i-1-p]:p).join``
05AB1E ,
2717 bytesExperimente online!
fonte
CJam, 13 bytes
Demonstração online.
Esta solução usa o operador "copiar n- ésimo item na pilha" do CJam
$
para implementar a decodificação. Começa lendo a entrada (comq
) e, em seguida, fazendo um loop sobre os caracteres da sequência de entrada e os colocando na pilha (com{}/
). No entanto, dentro do corpo do loop, ele também duplica cada caractere depois de ter sido colocado na pilha (com_
) e verifica se é um dígito procurando sua posição#
na string"0123456789"
, convenientemente representada comoA,s
.O resultado dessa pesquisa é o valor numérico do dígito ou, se o caractere não for um dígito, -1. O
)
operador então incrementa esse valor em um e o$
substitui pelo caractere atual em várias posições abaixo da parte superior da pilha. Finalmente,\;
apenas remove a cópia do caractere de entrada atual que criamos_
da pilha, pois não é mais necessário.fonte
Befunge-98 ,
4543 bytesExperimente online!
A ideia:
Não consegui obter esta versão mais curta, mas esta tem 44 bytes:
Pensei que eu iria compartilhar por causa do truque,
s
mas armazenar o contador na pilha leva a uma melhoria de 1 caracterfonte
Python 2 , 59 bytes
Experimente online!
fonte
Python 2,
7571 bytesExperimente Online!
Editar: corrigido para valores ascii entre 32 e 47 ; Corrigido para decodificação dupla (por exemplo, "alp2c1" para "alpaca")
fonte
'Prog2am0in6 Puz0les7&1Cod74G4lf'
seu programa imprimeProgramming Puzzles &7Code1Golf
! Eu tentei com os dois links TIO compartilhados!PHP 7.1
6759 bytesRecebe entrada do STDIN; execute como pipe
-nR
ou experimente online ._&$c=$s[$i++]
loop pela string (_&$c
resultará em algo que não é"0"
; portanto, o único caractere que pode interromper o loop é a string vazia = final da entrada)$c^"0"
alternar os bits 5 e 6 no código ascii<"\n"
verifique se o resultado é <chr (10)Obrigado @Christoph por economizar 12%
fonte
$s=$argn
...?)for(;_&$c=$argn[$i++];)$t.=($c^"0")<"\n"?$t[~+$c]:$c;echo$t;
Macro / pressionamentos de tecla do Vim, 49 bytes
^M
representa o caractere de retorno (0x0A, 1 byte).Explicação
fonte
APL (Dyalog Classic) ,
2523 bytes-2 bytes graças a @FrownyFrog
Experimente online!
usa
⎕io←1
(
⍵
abaixo significa um valor intermediário na avaliação)⎕d
é a string'0123456789'
⎕d⍳⍵
localiza os índices (baseados neste caso) em 1⍵
dos caracteres de⎕d
; para um não dígito, o índice é 1111|⍵
é módulo - os 11s se tornam 0s≢⍵
é o comprimento de⍵
⍳≢⍵
é1 2 ...
até≢⍵
assim,
(⍳≢⍵)-11|⎕d⍳⍵
nos fornece um vetor i dos índices onde devemos procurar para obter os caracteres resultantes; no entanto, alguns desses índices podem ser redirecionados para outros ainda (menores). Para calcular o fechamento transitivo (ou seja, os índices efetivos), indexamos o vetor em si mesmo (⊂⌷⊢
um trem equivalente a(⊂i)⌷i
oui[i]
) e repetimos isso até que ele se estabilize (⍣≡
conhecido como operador de ponto fixo ).finalmente indexamos na string original:
(...)⊃¨⊂
fonte
Python 2 ,
8380 bytesExperimente online!
fonte
Japt , 24 bytes
Experimente online!
Explicação:
fonte
Ruby,
5646 bytesExperimente online!
fonte
Python 2 , 58 bytes
Esta é essencialmente uma porta da minha resposta Jelly, mais a verificação de dígitos da resposta Python do @ xnor.
Experimente online!
fonte
Röda , 51 bytes
Experimente online!
fonte
JavaScript ES6, 54 bytes
fonte
f=
.> <> (Peixe), 108 bytes (= grade 9 x 12)
Experimente aqui para ver os peixes nadando ao redor.
fonte
Código de máquina 8086, 35 bytes
fonte
OK, 39 bytes
Experimente online!
fonte
Japt v2.0a0, 16 bytes
Tente
Explicação
fonte
J , 20 bytes
Experimente online
Crédito para ngn pela inspiração.
22 bytes
Esta é uma porta da resposta Jelly.
Nas duas soluções, a versão usada pelo TIO interpreta um único
.
como o número 0, portanto, o último teste falha. As versões mais antigas (≤7) parecem funcionar corretamente.Experimente online!
fonte