Tengamos una función que toma una cadena y elimina todos los pares de caracteres idénticos adyacentes. Por ejemplo
Tenga en cuenta que cuando dos pares se superponen, solo eliminamos uno de ellos.
Llamaremos a una cadena perfectamente emparejada si la aplicación repetida finalmente produce la cadena vacía. Por ejemplo, la cadena de arriba de no está perfectamente emparejada porque si aplicamos nuevamente, todavía obtenemos . Sin embargo, una cadena como está perfectamente emparejada porque si aplicamos tres veces obtenemos la cadena vacía
Su tarea es escribir un código de computadora perfectamente emparejado que tome una cadena (de ASCII imprimible) y decida si está perfectamente emparejado. La cadena de bytes de su fuente debe ser una cadena perfectamente emparejada , aunque su código no necesariamente tiene que estar restringido a ASCII imprimible.
Puede generar dos valores distintos: uno para el caso en que la entrada está perfectamente emparejada y otro para los casos en que no lo está.
Esta es una pregunta de código de golf , por lo que las respuestas se puntuarán por el tamaño en bytes de su fuente con menos bytes mejor.
Casos de prueba
fuente
Respuestas:
Haskell,
146124bytesSin comentarios. Devuelve ya sea
True
oFalse
.Pruébalo en línea!
Editar: -22 bytes gracias a @Cat Wizard
fuente
Python 2 , 94 bytes
Pruébalo en línea!
Todo el paso de actualización se
ss=[cc+ss,ss[1:]][cc==ss[:1]]
cancela a solo=[+,[
.fuente
05AB1E ,
26 24 22 2018 bytes-2 bytes gracias a los ovs . Emite 0 si la cadena está perfectamente emparejada, 1 de lo contrario.
Pruébalo en línea!
Versión anterior
Éste se basa únicamente en un comportamiento indefinido (por lo que no hay un "código muerto"), y genera [['' 0 ']] para cadenas perfectamente emparejadas y [[' 1 ']] para cadenas no perfectamente combinadas:
Y la versión de 22 bytes, explicada, que es solo la anterior pero no abusa de UB, y arroja valores razonables .
fuente
Cubix , 54 bytes
No genera nada si la cadena está perfectamente emparejada y de lo
1
contrario.Pruébalo aquí
Cubified
Explicación
La mayoría de los caracteres son de relleno necesarios para emparejar perfectamente el código. Reemplazando aquellos con
.
(no-op), obtenemosEsto se puede dividir en tres pasos:
i
y la?
).fuente
V ,
20, 18 bytesPruébalo en línea!
Hexdump:
Salidas 0 para verdad, 1 para falsedad. Gracias a nmjcman101 por guardar indirectamente 2 bytes.
fuente
^$
con.
y devolver 0 para verdad, ¿algo más para falsedad? Estoy un poco confuso sobre las reglas después de no hacer esto por un tiempo.R ,
142126bytesUna lógica más estricta y algunos bytes de comentarios desarrollados por @Giuseppe
Pruébalo en línea!
Original:
Pruébalo en línea!
Función de detector recursivo seguido de comentario con todos los caracteres de la función en orden inverso.
fuente
APL (Dyalog) , 38 bytes
Pruébalo en línea!
fuente
Retina ,
2826 bytesPruébalo en línea!
Salidas
`C1\).(`+0`C1\).(`+
para casos falsos y`C1\).(`+1`C1\).(`+
verdaderos.fuente
Brain-Flak ,
228200 bytesPruébalo en línea!
Esta es una prueba de concepto. Probablemente podría ser más corto. Sin embargo, no utiliza ningún comentario.
Emite
0,0
si la entrada está perfectamente emparejada y0,1
si la entrada no lo está.fuente
sed 4.2.2 , 34 bytes
Pruébalo en línea!
Las cadenas emparejadas dan salida vacía, las no emparejadas dan
ct:
La versión palindrómica trivial está en 32
:;ss(.)\1ss;t;/./cc/./;t;1\).(;:
. La solución anterior fue:;ss((..??\??))\1ss1;t;;/./cc/./t:
(cambiada porque la actual abusóc
menos, editar: sí, ahora solo hay 1 carácter después dec
: D)(tenga en cuenta que
;
es el separador de declaraciones):
declara una etiqueta vacía:t
declara la etiquetat
ss((..??\??))\1ss1
es una sustitución, en sed puedes cambiar el delimitador a una sustitución, y esto es lo que hice al cambiarlos
, por lo que lo que hace es sustituir el primero (como se indica1
al final)partido de
((..??\??))\1
.
cualquier personaje.??
seguido de un carácter opcional opcional\??
y un opcional?
sin nada
Ahora esta sustitución está emparejada consigo misma, por lo que el
;
s antes y después de que se cancele tambiént
y volver a la etiqueta hasta que no haya más sustituciones exitosas/..?/
if.
(comodín) seguido de.?
un carácter opcional coincidecc
cambiar el búfer ac
fuente
Brain-Flak ,
112 110108 bytesPruébalo en línea!
Esto se basa en mi respuesta de ¿Se corresponden los corchetes? .
Intenté no usar comentarios, pero me quedé atrapado tratando de hacer que el pop nilads (
{}
) se empareje . El problema radica en que la forma más fácil de emparejar un par de corchetes es rodearlo en otro par del mismo tipo. Si bien esto es fácil para otras nilas, la{...}
mónada crea bucles. Para salir del bucle, debe presionar un 0, pero una vez que haya salido del bucle, debe hacer estallar el 0, lo que agrava el problema.La solución preparada de 66 bytes es:
Pruébalo en línea!
Salidas
1
o1,0
si la entrada es un emparejamiento perfecto,0,0
si no.Versión sin comentarios, 156 bytes
Pruébalo en línea!
Como señaló Cat Wizard, la primera respuesta no funciona para todos los intérpretes, ya que no todos manejan los
#
comentarios. Esta versión no contiene comentarios.fuente
Japt,
2422 bytesSalidas
false
para la verdad ytrue
para falsey.Intentalo
fuente
«e"(.)%1
?«
.Brain-Flak , 96 bytes
Pruébalo en línea!
No genera nada si la entrada está perfectamente emparejada, y de lo
0
contrario.Versión no perfectamente emparejada (original):
Pruébalo en línea!
fuente
Haskell , 66 bytes
Pruébalo en línea!
Cat Wizard ahorró 6 bytes.
fuente
Agregar ++ , 146 bytes
Pruébalo en línea!
Dato curioso: esto fue 272 bytes mucho antes de que se iniciara la explicación, ahora supera a Java.
Salidas
True
para cuerdas perfectamente equilibradas, y de loFalse
contrarioPara mi gran satisfacción, esto supera la aburrida versión de palindromize en 2 bytes, para evitar que el resultado se imprima dos veces. También he tratado de tener el menor código muerto posible, sin embargo, todavía hay algunas secciones comentadas, y el código sale con un código de error de 1 , después de imprimir el valor correcto.
NB : Se solucionó un error con los
BF
comandos mientras esta respuesta estaba en desarrollo.Cómo funciona
*
BF
^
D,ff,@^^,
;;
€
{...}
{...}
que es 4 bytes más largo.
`
xx:?
aa:1
Luego ingresamos a nuestro ciclo while:
Un ciclo while es una construcción en Add ++: opera directamente en código, en lugar de variables. Las construcciones toman una serie de sentencias de código, separadas con
,
las que operan. Las sentencias while y if también toman una condición directamente anterior a la primera,,
que consiste en una única declaración válida, como un comando infijo con variables. Una cosa a tener en cuenta: la variable activa no se puede omitir de la condición.aa*bb
Uno de los mayores inconvenientes de Add ++ es la falta de declaraciones compuestas, lo que requiere tener una segunda variable de bucle. Asignamos nuestras dos variables:
Con el código
|
B
xx:yy
Luego llegamos a nuestra declaración final:
fuente
JavaScript (ES6), 76 bytes
Devuelve un booleano.
Pruébalo en línea!
Sugerido por @Shaggy: 58 bytes devolviendo una cadena vacía para emparejar perfectamente o arrojando un error de lo contrario.
fuente
Wolfram Language (Mathematica) ,
7064 bytesPruébalo en línea!
Sin comentarios, 92 bytes
Pruébalo en línea!
fuente
Lua , 178 bytes
Pruébalo en línea!
Si bien es una solución terriblemente larga, esto hace bastante uso de las peculiaridades específicas de Lua. Esto es en realidad un algoritmo de pila de fuerza bruta minimizado. El programa se complica por el hecho de que los patrones de Lua no permiten reemplazar pares y la expresión regular no está integrada.
Explicación:
fuente
Gol> <> , 30 bytes
Pruébalo en línea!
Todo después del primero
B
es un código en exceso y no se ejecuta. Una función que devuelve la parte superior de la pila como1
si la entrada fuera un emparejamiento perfecto, de lo0
contrario.Explicación:
fuente
Cubix , 30 bytes
Pruébalo en línea!
Salidas
1
si la cadena está perfectamente emparejada y nada más.Cubified
Simplificado
La lógica y la estructura general son las mismas que en la respuesta de Mnemonic, pero sin una comprobación explícita de la cadena vacía.
fuente
Haskell , 92 bytes
Pruébalo en línea!
La respuesta de @ nimi es genial, no utiliza ningún comentario. Este es más corto pero usa un comentario.
La respuesta de @ xnor también es genial, usa comentarios y es más corta que esta.
fuente
Python 2 , 114 bytes
Pruébalo en línea!
Devoluciones
True
para cadenas perfectamente emparejadas, de loFalse
contrario.(¡Realmente no se verifica a sí mismo, porque
(.)
no coincidirá con las nuevas líneas en el código! Pero @Cat Wizard dijo que está bien, porque las nuevas líneas no son caracteres ASCII imprimibles, por lo que mi programa no necesita manejarlos).Esta es una versión perfectamente emparejada de:
para lo cual una perfeccionización "más perezosa"
code + '##' + f(code[::-1])
daría 120 bytes. (Es decir, cambiar el nombre de las variables, etc. para introducir más pares contraídos dentro del comentario, la mitad del código guardó 6 bytes).fuente
Jalea ,
26 2422 bytesPruébalo en línea!
Extrañamente parece funcionar sin mover el código hacia atrás a un enlace no utilizado.
Devuelve 0 si la entrada está perfectamente emparejada, 1 de lo contrario.
Codigo activo:
fuente
Adjunto , 82 bytes
Pruébalo en línea!
Nada increible aqui.
Fixpoint
Una función que elimina pares consecutivos.fuente
Java 8,
158156154 bytesDevuelve un booleano (
true
/false
).-2 bytes gracias a @raznagul .
Pruébalo en línea.
Explicación:
fuente
s
an
y la adición de un segundo espacio quereturn s.isEmpty
se puede extraers n
de la observación, el ahorro de 2 bytes en total.