Esta es la inversa de Hagamos algo de "deciph4r4ng"
En este desafío, su tarea es cifrar una cadena. Afortunadamente, el algoritmo es bastante simple: leyendo de izquierda a derecha, cada carácter de escritura típico (rango ASCII 32-126) debe ser reemplazado por un número N (0-9) para indicar que es el mismo que el carácter N + 1 posiciones delante de él. La excepción es cuando el carácter no aparece dentro de las 10 posiciones anteriores en la cadena original. En ese caso, simplemente debe imprimir el personaje nuevamente. Efectivamente, debería ser capaz de revertir la operación desde el desafío original.
Ejemplo
La cadena de entrada "Programming"
se codificaría de esta manera:
Por lo tanto, la salida esperada es "Prog2am0in6"
.
Aclaraciones y reglas.
- La cadena de entrada contendrá caracteres ASCII en el rango 32 - 126 exclusivamente. Puede suponer que nunca estará vacío.
- Se garantiza que la cadena original no contendrá ningún dígito.
- Una vez que un carácter ha sido codificado, a su vez puede ser referenciado por un dígito posterior. Por ejemplo,
"alpaca"
debe codificarse como"alp2c1"
. - Las referencias nunca se ajustarán a la cadena: solo se puede hacer referencia a los caracteres anteriores.
- Puede escribir un programa completo o una función, que imprime o genera el resultado.
- Este es el código de golf, por lo que gana la respuesta más corta en bytes.
- Las lagunas estándar están prohibidas.
Casos de prueba
Input : abcd
Output: abcd
Input : aaaa
Output: a000
Input : banana
Output: ban111
Input : Hello World!
Output: Hel0o W2r5d!
Input : this is a test
Output: this 222a19e52
Input : golfing is good for you
Output: golfin5 3s24o0d4f3r3y3u
Input : Programming Puzzles & Code Golf
Output: Prog2am0in6 Puz0les7&1Cod74G4lf
Input : Replicants are like any other machine. They're either a benefit or a hazard.
Output: Replicants 4re3lik448ny3oth8r5mac6in8.8T64y'r371it9376a1b5n1fit7or2a1h2z17d.
Respuestas:
05AB1E ,
20 1918 bytes-2 Gracias a Emigna
Pruébalo en línea!
fuente
)¹vDyåiDykëy}?y¸ìT£
funciona.õIvDyåiDykëy}?yìT£
por 18 :)Retina ,
2423 bytesPruébalo en línea!
Una sustitución de expresiones regulares bastante simple. Emparejamos cada personaje e intentamos encontrar una copia de él de 0 a 9 caracteres antes. Si lo encontramos, reemplazamos el carácter con el número de caracteres que tuvimos que unir para llegar a la copia.
Los resultados no coinciden con los casos de prueba, porque este usa el dígito más grande posible en lugar del más pequeño posible.
fuente
JavaScript (ES6),
745754 bytesAhorró 3 bytes gracias a ETHproductions con el brillante en
p=/./g
lugar dep={}
(inspirado en Neil)Casos de prueba
Mostrar fragmento de código
fuente
s
lugar dep
?find
versión original usandolastIndexOf
, lo cual es un poco sorprendente dado que tiene 11 letras de largo ...)s=>s.replace(p=/./g,(c,i)=>(i=p[c]-(p[c]=i))>-10?~i:c)
para guardar 3 bytes.Haskell ,
7266 bytes¡Gracias a Laikoni por jugar al golf 6 bytes!
Pruébalo en línea!
La función
%
mantiene la cadena parcialmente procesada en reversa en su segundo argumento, por lo que puede buscar en los primeros 10 elementos de esta cadena las ocurrencias del carácter que está examinando. El envío consiste en la función sin nombre(%"")
que llama a la función anterior con la cadena vacía como segundo argumento.fuente
f(a:s)=f s++(last$[a]:[show n|(n,b)<-zip[0..9]s,b==a])
Guarda dos bytes.f(a:s)=f s++[last$a:[n|(n,b)<-zip['0'..'9']s,b==a]]
ahorra aún más.reverse
guarda un byte adicional: ¡ Pruébelo en línea!Python 2 , 64 bytes
Pruébalo en línea!
fuente
~10
no puedes usar-11
?Perl 5 , 36 bytes
35 bytes de código +
-p
bandera.Pruébalo en línea!
Algunas explicaciones:
El objetivo es reemplazar un carácter que no sea un dígito (
\D
pero corresponde a la referencia inversa\1
en mi expresión regular) precedido por menos de 10 caracteres (.{0,9}
) y el mismo carácter ((\D)
...\1
) por la longitud del.{0,9}
grupo (length$2
) Yredo
mientras los personajes son reemplazados.fuente
.*
no es obligatorio, cualquier carácter válido en el rango antes del dígito reemplazado está bien.Python 2,
8984 bytesPruébalo en línea!
Itera a través de la cadena en reversa y construye una nueva cadena con los números correctos insertados.
fuente
Japt , 18 bytes
Pruébalo en línea!
Explicación
fuente
JavaScript,
10080 bytesPruébalo en línea!
fuente
05AB1E , 20 bytes
Pruébalo en línea!
Explicación
fuente
Python 3,
125118 bytesPruébalo en línea!
fuente
C (tcc) , 113 bytes
Como la función crea una copia de una cadena de entrada, el tamaño máximo de entrada es de 98 caracteres (más que suficiente para ajustarse a la entrada de prueba más larga). Por supuesto, esto se puede cambiar a cualquier otro valor.
Pruébalo en línea!
Editar
-15 bytes. Gracias Johan du Toit .
fuente
i,j;f(char*s){char n[99];strcpy(n,s);for(i=1;s[i];i++)for(j=i-1;j>-1&&i-j<11;j--)if(n[i]==n[j])s[i]=47+i-j,j=-1;}
Java 7,
102101bytesPruébalo en línea!
-1 byte gracias a Kevin Cruijssen . Siempre disfruto de una excusa para usar el operador de referencia.
fuente
--c>=0
? Puede reemplazarloc-->0
para guardar un byte.MATL,
3130 bytes¡Pruébalo en MATL Online!
Explicación
fuente
this is a test
rinde enthis 222a1te52
lugar dethis 222a19e52
. El segundot
no se convierte a9
.PHP, 104 bytes
solución directa
Soluciones al revés
Versiones en linea
PHP, 111 bytes
PHP, 112 bytes
Versión en línea
fuente
REXX,
124125bytesfuente
s<9
lugar des<10
os<=9
. La entradathis is a test
rinde enthis 222a1te52
lugar dethis 222a19e52
. El segundot
no se convierte a9
. Pruébelo en líneaC (gcc) ,
117103bytesPruébalo en línea!
103 bytes sin importación string.h, funciona con advertencia. Si esto va en contra de las reglas, lo tiraré
Pretty Code:
Ediciones:
fuente
(i=strlen(s);s[--i];)
lugar de(i=strlen(s)-1;s[i];i--)