Después de pasar un tiempo en este sitio, he llegado a disfrutar de que las cosas sean lo más cortas posible. Esa puede ser la razón por la que recientemente me ofenden las cadenas que contienen los mismos caracteres más de una vez. Su trabajo es escribir una función o programa que condense una cadena dada de acuerdo con las siguientes reglas:
Comience con una condensación 0 , es decir, busque el primer par (más a la izquierda) de los mismos caracteres con otros 0 caracteres entre ellos. Si se encuentra dicho par, elimine uno de los dos caracteres y reinicie el algoritmo realizando otra condensación 0 . Si no se encuentra dicho par, continúe con el siguiente paso. Ejemplos:
programming
-C0->programing
aabbcc
-C0->abbcc
test
-C0->test
Luego realice una 1 condensación , es decir, busque el primer par de mismos caracteres con 1 otro personaje entre ellos. Si se encuentra dicho par, elimine uno de ellos y todos los caracteres entre ellos y reinicie con una condensación 0 . Si no se encuentra dicho par, continúe con el siguiente paso. Ejemplos:
abacac
-C1->acac
java
-C1->ja
Continúe con una 2-condensación y así sucesivamente hasta una n-condensación con n siendo la longitud de la cadena original, reiniciando cada vez después de que una condensación elimine algunas letras. Ejemplos:
programing
-C2->praming
abcdafg
-C3->afg
La cadena resultante se llama condensada y contiene cada carácter como máximo una vez.
Entrada:
Una cadena en minúscula de caracteres ascii imprimibles.
Salida:
La cadena condensada de acuerdo con las reglas anteriores.
Ejemplos:
examples -> es
programming -> praming
puzzles -> puzles
codegolf -> colf
andromeda -> a
abcbaccbabcb -> acb
if(x==1):x++ -> if(x+
fnabnfun -> fun
abcdefae -> abcde
Ejemplos detallados para aclarar cómo funciona el algoritmo:
fnabnfun -C0-> fnabnfun -C1-> fnabnfun -C2-> fnfun -C0-> fnfun -C1-> fun -C0-> fun
-C1-> fun -C2-> ... -C8-> fun
abcbaccbabcb -C0-> abcbacbabcb -C0-> abcbacbabcb -C1-> abacbabcb -C0-> abacbabcb
-C1-> acbabcb -C0-> acbabcb -C1-> acbcb -C0-> acbcb -C1-> acb -C0-> acb
-C1-> ... -C12-> acb
Su enfoque no tiene que implementar el algoritmo desde arriba siempre que su solución y el algoritmo devuelvan la misma salida para todas las entradas permitidas. Este es un desafío de código de golf .
¡Gracias a @Linus por los útiles comentarios de sandbox!
Respuestas:
JavaScript (ES6), 74 bytes
fuente
Perl,
38313029 bytesEsto debería dejar atrás los idiomas ajenos al golf ...
-1 por
$-[0]
gracias a Riley-1 por
@{-}
gracias a DadaIncluye +1 para
-p
Dar entrada sobre STDIN
condense.pl
:Esta versión de 27 bytes debería funcionar, pero no porque Perl no se interpola
@-
en una expresión regular (consulte /programming/39521060/why-are-etc-not-interpolated-in-strings )fuente
@{\@-}
pieza? Pensé que@-
tenía los índices de cada partido, entonces, ¿cómo se "cuenta" en cada iteración? Además, si imprime@{\@-}
antes y después de cada sustitución, solo imprime 1 o 2././g
progreso progresa en 1 en la cadena cada vez, excepto cuando la cadena cambia, luego se restablece a 0. Si imprime@-
después/./g
pero antes des///
que lo vea subir (use una prueba donde la cadena restante es lo suficientemente grande)$-[0]
da los números que esperaría. ¿@{\@-}
Actúa como$-[0]
debido al contexto de expresiones regulares pero no cuando imprime por alguna razón?$-[0]
es un byte más corto que@{\@-}
si son iguales."@{\@-}"
no es lo mismo que@{\@-}
(sin"
)."@{\@-}"
es lo mismo que"@-"
. Y esto también debería ser cierto para una sustitución de expresiones regulares, pero no lo es. Simularmente$-[0]
debería funcionar pero no lo hace. PD: Probablemente de alguna manera te aplicaste el contexto escalar@-
cuandoCJam , 35 bytes
Pruébalo en línea!
Puede ver las condensaciones individuales insertando
ed
fuente
Python 2,
117104101 bytesRecursivamente hacer los reemplazos necesarios. Construyo la expresión regular dinámicamente.
Pruébalo en línea
fuente
return i>len(t) and t or s!=t and f(t) or f(t,i+1)
una red de -4 bytesreturn t if i>len(t)else s!=t and f(t)or f(t,i+1))
e=s==t;return i>len(t)and t or f(t,i*e+e)
y luego puede eliminar eli=0
en la definición de la función, pero tendrá que llamar con 0 inicio.Perl
5352Incluye +1 para -p
Pruébalo con ideone .
fuente
Mathematica, 101 bytes
Debería haber una manera de hacer esto más corto ...
fuente
PHP, 90 bytes
o 92 bytes
fuente
+$i
lugar de$i+=0
(-2). 2) elfor
bucle en lugar dewhile
puede guardar dos bytes y permitir eliminar los rizos (-4). 3) en$i=++$i*!$c
lugar de$i=$c?0:$i+1
(-1). 4)\\2
no es necesario, elimine los paréntesis (-2). 5) Puede permitir el límite en9
lugar de la1
velocidad (+0)+$i
no funciona en todos los casos. Tratarhammer
. PHP no se queja de las llaves vacías en la expresión regular; pero no coincide con lo deseado. Por cierto: cuento 91, no 90. Pero prueba el nuevo 1)for($s=$argv[$c=1];$s[$i=++$i*!$c];)
$i+=0
y probaré tu propuesta más tarde. ¿Qué significa con martillo?puzzle
algo más,(.)//1
pero está de acuerdo con su propuesta o con el$i´=0
Ruby,
756457 bytes(56 bytes de código +
p
opción de línea de comando).Usar interpolación de cadenas dentro de una expresión regular para controlar la longitud de las coincidencias que se reemplazan
Prueba:
fuente
Haskell ,
9788 bytesPruébalo en línea!
Versión antigua de 97 bytes:
Pruébalo con ideone .
Explicación:
La
(!)
función realiza una n-condensación cuando se le da una cadena una vez completa y una vez con los primeros n caracteres eliminados, por ejemplo,abcdbe
ycdbe
para una 2-condensación, comparando recursivamente los dos caracteres iniciales.fuente