Su desafío es minimizar el código Brainfuck , de acuerdo con estas reglas:
- Elimina todo lo que no sea uno de
+-><[].,
. - Para cualquier grupo de consecutiva
+
o-
caracteres, si la cantidad de+
s y-
s es la misma, eliminarlos. - Haga lo mismo que arriba, pero con
>
y<
. - Elimina las secuencias de los
+-><
personajes si no hacen nada. Por ejemplo, debes eliminar+>-<->+<
. (Este puede ser el más complicado y difícil de implementar). Asegúrese de no obtener ningún falso positivo, como+>-<+>-<
, que no debe eliminarse.
Casos de prueba:
Entrada
++++++[->++++++<]>. prints a $
[-]< resets tape
>,[>,]<[.<] reverses NUL terminated input string
++-->><< does nothing
Salida
++++++[->++++++<]>.[-],[>,]<[.<]
Entrada
Should disappear: ++>>+<+++<->-->-<<->-<
Should disappear: +++>-<--->+<
Should stay: +++>-<+>---<
Salida
+++>-<+>---<
Puede aceptar la entrada y salida de la manera que desee: stdin / stdout, una función, etc., pero la entrada puede no estar codificada.
Este es el código de golf , por lo que el código más corto en el recuento de personajes ganará.
++>>++<<--
debería salir>>++<<
, y eso no estaba cubierto. Por favor agregue más casos de prueba.+++>-<+>---<
? Se puede acortar para evitar movimientos innecesarios del puntero, pero el resultado esperado lo deja sin cambios. Mi comprensión basada en mirar tanto la pregunta como las respuestas es que Doorknob es genial con la especificación tomada libremente; debemos eliminar cualquier+-><
secuencia contigua no operativa como se indica explícitamente, y más allá de eso, es permisible hacer minificaciones adicionales como en su ejemplo++>>++<<--
, y también podemos hacer reorganizaciones siempre que no cambien la funcionalidad del código, por ejemplo,>+<+
en+>+<
.+>-<->+<
. (Este puede ser el más complicado y difícil de implementar). Asegúrate de no obtener ningún falso positivo, como+>-<+>-<
, que no debe eliminarse ". - esto es un poco vagoRespuestas:
REBELDE - 104
Uso:
Entrada: Lee una línea de stdin.
Salida: Imprime una línea en stdout.
Anomalías *:
_
se lee y usa otra línea, en lugar de no mostrar nada.++++>----<
lugar de+++>-<+>---<
. Pero eso está bien, ¿verdad? ;)>-<+
etc.son reemplazados por+>-<
etc.Spoiler
* ¡No es un error, es una característica!
fuente
Brainfuck, 579 bytes
Con formato y algunos comentarios:
Utiliza el mismo enfoque que la solución de Keith Randall, minimizando todas las secuencias contiguas de
+-<>
manera óptima mediante simulación. Por ejemplo, se+++>-<+>---<
vuelve++++>----<
y se>+<+<<+>+<->>>>
vuelve+<+>>+>
.Pruébalo en línea. (Si el valor absoluto de una celda simulada se acerca a 256, habrá problemas de desbordamiento).
La estructura general es
La cinta se divide en nodos de 7 celdas; al comienzo del bucle interno, el diseño de la memoria es
0 s 0 c 0 a b
donde
s
es un indicador booleano para la celda de inicio,c
es el carácter actual,a
es la parte negativa del valor de la celda simulada (más uno) yb
es la parte positiva del valor de la celda simulada.Cuando se imprime la secuencia minimizada, el diseño de la memoria es
d n e 0 0 a b
donde
d
es una bandera booleana para la dirección,a
yb
son como antes (pero se convierten en uno / cero cuando se imprimen),n
y noe
son cero para el nodo final;n
está relacionado con cuántas veces se ha visto el nodo ye
es el valor del carácter que detuvo el bucle interno (más uno).Originalmente consideré realizar un seguimiento de más información por nodo: nodo más a la izquierda y más a la derecha como banderas booleanas, y la posición del nodo en relación con los nodos de inicio y fin. Pero podemos evitar eso mirando las celdas vecinas cuando sea necesario, y haciendo escaneos izquierdo y derecho para encontrar el nodo de inicio.
Al imprimir la secuencia minimizada y decidir cómo mover el puntero simulado, podemos adoptar un enfoque general: comience alejándose del nodo final (en una dirección arbitraria si los nodos de inicio y final son los mismos), gire a la izquierda y a la derecha nodos, y se detiene en función del número de veces que se ha visto el nodo final: 3 veces si los nodos de inicio y final son iguales, de lo contrario 2.
fuente
Python, 404 caracteres
Este código hace una optimización perfecta de todas las subsecuencias de
+-<>
. Un poco más de lo que pediste, pero ahí lo tienes.Funciona simulando las
+-<>
operaciones en la cintat
.s
es la posición inicial en la cinta yp
es la posición actual. Después de la simulación, calcula la extensión[a,b]
que debe operarse y realiza todos los +/- en una pasada óptima.fuente
CoffeeScript -
403397Manifestación (por favor, perdone el uso de bit.ly aquí, toda la URL rompería el descuento)
Versión sin comprimir (con código de depuración):
fuente
>+.-<
producir la cadena vacía en lugar de dejarla sin cambios.