Existe la codificación y decodificación de longitud de ejecución clásica.
input output
a3b2c5 aaabbccccc
Y eso es bastante sencillo y hecho antes.
El desafío es también tener en cuenta un comportamiento no estándar cuando varios caracteres preceden a la longitud de la ejecución (un solo dígito de 0-9). Cada carácter antes del dígito de longitud de ejecución (el último dígito antes de un no dígito o final de la cadena) tiene ese valor aplicado individualmente e impreso en orden.
Algunas pruebas de entrada y salida, incluidos algunos casos extremos:
input output
ab3c5 aaabbbccccc
a0b3 bbb
13b1 111b
a13b1 aaa111b
a123b1 aaa111222b
aa2a1b1 aaaaab
- Una secuencia de caracteres (
[a-zA-Z0-9]+
) debe ser seguida por su longitud de ejecución length ([0-9]
) - Solo se debe considerar la entrada válida (
([a-zA-Z0-9]+[0-9])*
)- Sí, la cadena vacía es una entrada válida.
- La entrada es a través de la entrada estándar, la salida a través de la salida estándar
Este es el código de golf, el número de bytes determina el ganador.
Respuestas:
Pip, 22 + 1 = 23 bytes
Usa
-r
bandera. Tenga en cuenta que esto requiere que 1) ingrese un EOF después de la entrada (Ctrl-D en Linux, Ctrl-Z en Windows) o 2) canalice la entrada desde otro lugar.Explicación:
El resultado de la operación de mapeo es en realidad una lista de listas, pero por defecto las listas simplemente se concatenan juntas cuando se imprimen, por lo que no es necesaria la conversión manual a cadena.
Ejemplo, con entrada
a13b1
:Pip tiene soporte básico de expresiones regulares a partir de ... Hace 2 días . Gran momento!
fuente
-r
bandera. (La pregunta especifica que la entrada tiene que venir de STDIN.)q
lugar dea
sin banderas adicionales, pero parece haber un error y está pidiendo la entrada dos veces.Perl / Bash
5440 + 1 = 41 bytesBásicamente es una expresión regular dentro de una expresión regular. Y un poco de magia.
Explicación
La expresión regular externa
/(\D*\d*)(\d)/g
extrae cada grupo codificado de longitud de ejecución. Capturamos las cosas para repetir$1
y la cantidad de repeticiones$2
. Ahora sustituimos cada grupo con la expansión de ese grupo. Para eso, evaluamos el código"\$1=~s/./\$&x$2/egr"
dos veces (como por la/ee
bandera en la sustitución externa).La primera evaluación solo interpolará el número de repeticiones en la cadena; las otras variables están protegidas por una barra diagonal inversa. Asumiendo la entrada
a14
, ahora tendríamos el código$1=~s/./$&x4/egr
, que será evaluado nuevamente.Esto aplicará la sustitución al contenido de
$1
(las cosas para repetira1
). La sustitución coincide con cada personaje.
. La$&
variable contiene toda la coincidencia, que repetimosx4
veces. Hacemos esto/g
lobalmente para cada coincidencia y/r
grabamos la cadena sustituida en lugar de modificar la$1
variable (que es de solo lectura). Entonces el resultado de la sustitución interna esaaaa1111
.El
-p
indicador aplica la sustitución a cada línea de entrada e imprime el resultado.fuente
-p
modificador. Cuento 45 bytes. Además, debería poder usar en\D
lugar de[a-z]
, lo que también eliminó la necesidad de hacerloi
.CJam,
33 3127 bytesUghh, la falta de expresiones regulares hace que esto sea bastante largo ...
Cómo funciona
Recorremos todos los caracteres de la cadena de entrada y, en cada iteración, hacemos un seguimiento del último carácter encontrado (comenzando con un carácter vacío por primera vez). Luego verificamos si el carácter actual no es numérico y el último carácter es numérico. Si es así, repetimos cada carácter anterior (que no se ha repetido ya), el número veces.
(Expansión de código un poco desactualizada)
Pruébalo en línea aquí
fuente
rs ,
4371 caracteresBueno, esto se volvió largo rápidamente. Estúpidos números ...
Pruébalo aquí!
Versión original (no funcionó con entrada como
123
):Explicación
La primera línea coloca espacios entre carreras que contienen números, por ejemplo, convirtiéndose
a313
ena3 13
.La segunda línea se expande continuamente las codificaciones comprimidas como
aa5
paraa5a5
.La tercera línea convierte cada instancia de
a5
enaaaaa
el uso de la operador de repetición .La última línea elimina los espacios.
fuente
a123b1
?Javascript ( ES6 ),
8683 bytesComentado:
fuente
alert(prompt().replace(/(.+?)(\d)(?!\d)/g,(a,b,c)=>Array(c+1).join(b)))
harás lo mismo? Tiene solo 71 bytes de longitud.Array(6).join('12')
y volverá'1212121212'
.alert(prompt().replace(/(.+?)(\d)(?!\d)/g,(a,b,c)=>Array(-~c).join(b)))
(el mismo de 71 bytes de longitud, probado en es6fiddle.net/ia7gocwg )CJam,
2725 bytesPruébelo en línea en el intérprete de CJam .
Cómo funciona
fuente
Pyth,
333228 bytesPruébelo en línea: demostración o prueba de arnés
Explicación
Explicaré el código usando la entrada de ejemplo
aa1a23b2
. Esperemos que esto sea un poco más fácil de seguir que sin él.fuente
Rubí 73
Pruebas: http://ideone.com/L1fssb
fuente
JavaScript 112
fuente
Python 2.7, 98 bytes
Esto solo hace una simple búsqueda de expresiones regulares para los dígitos que no son seguidos por un dígito, y luego realiza la aritmética de cadenas en cada grupo y los une nuevamente.
fuente
raw_input
convierte en paréntesisinput
peroprint
necesita.Julia,
105999587 bytesEsto crea una función sin nombre que toma una cadena como entrada y devuelve una cadena. Para llamarlo, dale un nombre, por ejemplo
f=s->...
.Aquí se utilizan dos comprensiones de matrices, una anidada dentro de la otra. La comprensión externa actúa sobre cada coincidencia de la cadena de entrada contra la expresión regular.
\D*\d*\d
. La comprensión interna repite cada carácter del partido de acuerdo con el dígito final. Los elementos de la matriz interna se unen en una cadena, por lo que la matriz externa es una matriz de cadenas. Estos se unen y se devuelven.En Julia, las cadenas se pueden tratar como matrices de caracteres. Sin embargo, tenga en cuenta que los tipos
Char
yString
en Julia no tienen los mismos métodos definidos; en particular, no existe un método para repetir utilizando^
caracteres. Esto utiliza una solución complicada:chop()
.string()
.int('4')
no devuelve 4. Más bien, devuelve el punto de código, que en este caso es 52. Por lo tanto, podemos restar 48 para recuperar el entero real.string(b)
acuerdo aint(p[end]) - 48
.Ejemplos:
fuente
Pitón 3,
148144136135 BytesGracias a Pietu1998 y mbomb007 por las sugerencias.
Python 2,
161151147139138 BytesTal vez hoy haya sido un largo día en el trabajo, pero no puedo por mi vida descubrir cómo jugar golf ...
fuente
raw_
fuera, paréntesis enprint
).len(d)>0
puede ser reemplazado pord
ya que una lista vacía es falsa y una lista no vacía es verdadera.list(...)
puede ir directamente a lafor
. Los corchetes now([...])
son necesarios ya que es el único argumento. Puedes eliminar el espacio en) for
. Esas son todas las cosas menores que se me ocurrieron hasta ahora.list()
ya que las cadenas son iterables. Puedes usarw=r=''
. Si estás dispuesto a cambiarlo mucho, mira mi solución. :)if c.isdigit()
puede llegar a serif'/'<c<':'
, si no me equivoco.Java 7, 175 bytes
El desafío es más difícil de lo que parece, en verdad ...
Ungolfed y código de prueba:
Pruébalo aquí
Salida:
fuente