Este desafío está inspirado libremente por el esolang Pada no implementado .
Considere una matriz de 8 bits, todos inicializados a cero. Introduciremos un conjunto de instrucciones muy minimalista para imprimir cadenas arbitrarias. Hay dos instrucciones, que toman un parámetro N
que es el índice de un bit:
t N
de t Oggle: Esto cambia el valor del bitN
.p N
for p rint: Esto interpreta los 8 bits como un byte, comenzando desde el bitN
y envolviendo el final . El carácter correspondiente a este byte se imprime en STDOUT.
Veamos un ejemplo. Queremos imprimir :=
. Ingenuamente lo logramos de la siguiente manera (índices de bits basados en 0):
t 2 [0 0 1 0 0 0 0 0]
t 3 [0 0 1 1 0 0 0 0]
t 4 [0 0 1 1 1 0 0 0]
t 6 [0 0 1 1 1 0 1 0]
p 0 [0 0 1 1 1 0 1 0] == 58 == ':'
t 5 [0 0 1 1 1 1 1 0]
t 6 [0 0 1 1 1 1 0 0]
t 7 [0 0 1 1 1 1 0 1]
p 0 [0 0 1 1 1 1 0 1] == 61 == '='
Pero en cambio, podemos hacer uso de la función cíclica p
y guardar dos instrucciones:
t 2 [0 0 1 0 0 0 0 0]
t 3 [0 0 1 1 0 0 0 0]
t 4 [0 0 1 1 1 0 0 0]
t 6 [0 0 1 1 1 0 1 0]
p 0 [0 0 1 1 1 0 1 0] == 58 == ':'
t 1 [0 1 1 1 1 0 1 0]
p 7 [0 1 1 1 1 0 1 0] == [0 0 1 1 1 1 0 1] == 61 == '='
^
Entonces, p 7
simplemente comienza a leer el valor de byte del último bit en lugar del primero.
El reto
Dada una cadena no vacía de caracteres ASCII imprimibles (0x20 a 0x7E, inclusive), produzca una lista óptima de instrucciones (una línea por instrucción) para imprimir esa cadena con el sistema anterior. Si hay varias soluciones óptimas (que casi siempre será el caso), genere solo una de ellas.
Puede elegir entre indexación basada en 0 y basada en 1 para los bits, pero indique su elección.
Puede escribir un programa o función, tomando la entrada a través de STDIN (o la alternativa más cercana), argumento de línea de comando o argumento de función y generando el resultado a través de STDOUT (o la alternativa más cercana), el valor de retorno de la función o el parámetro de función (out). Si no imprime el resultado en STDOUT, aún debería ser una sola cadena separada por una nueva línea.
Este es el código de golf, por lo que gana la respuesta más corta (en bytes).
Casos de prueba
Cada caso de prueba es una sola línea que contiene la cadena de entrada, seguida del número óptimo de instrucciones, seguido de una posible solución.
Usted debe no la salida del cómputo de instrucciones en su solución - esto es sólo incluye aquí para que pueda comprobar la exactitud de su código si se imprime una lista de instrucciones diferente.
?
7 instructions
t 2
t 3
t 4
t 5
t 6
t 7
p 0
:=
7 instructions
t 2
t 3
t 4
t 6
p 0
t 1
p 7
0123456789
26 instructions
t 2
t 3
p 0
t 7
p 0
t 6
t 7
p 0
t 7
p 0
t 5
t 6
t 7
p 0
t 7
p 0
t 6
t 7
p 0
t 7
p 0
t 2
t 3
p 3
t 2
p 3
9876543210
28 instructions
t 2
t 3
t 4
t 7
p 0
t 7
p 0
t 0
t 7
p 5
t 4
p 5
t 0
t 5
p 0
t 7
p 0
t 5
t 6
t 7
p 0
t 7
p 0
t 6
t 7
p 0
t 7
p 0
Hello, World!
39 instructions
t 1
t 4
p 0
t 3
t 7
p 2
t 1
t 6
p 2
p 2
t 0
t 1
p 2
t 0
t 1
t 3
p 2
t 6
t 7
p 2
t 0
t 2
t 6
t 7
p 1
t 0
t 1
t 5
p 0
t 2
t 7
p 3
t 2
t 6
p 0
t 4
p 0
t 1
p 3
The quick brown fox jumps over the lazy dog.
150 instructions
t 1
t 3
t 5
p 0
t 1
t 2
p 1
t 1
t 3
t 7
p 0
t 1
t 5
t 7
p 0
t 1
t 3
t 7
p 0
t 5
p 0
t 3
t 4
t 5
p 0
t 4
t 6
p 0
t 4
p 0
t 1
t 4
t 6
t 7
p 0
t 1
t 6
p 0
t 3
p 0
t 0
t 5
p 4
t 0
t 7
p 0
t 1
p 1
t 3
t 5
t 6
t 7
p 0
t 1
t 5
t 6
p 0
t 4
t 7
p 0
t 1
t 2
p 3
t 5
t 6
t 7
p 2
t 1
t 2
t 6
p 0
t 0
p 7
t 0
t 7
p 5
t 3
t 4
t 6
t 7
p 0
t 6
t 7
p 0
t 1
t 3
t 6
t 7
p 0
t 1
t 4
t 5
t 6
t 7
p 0
t 4
p 4
t 6
p 0
t 1
t 6
p 4
t 5
t 6
t 7
p 0
t 1
t 3
t 5
p 0
t 1
p 1
t 1
t 3
t 7
p 0
t 1
t 5
t 7
p 0
t 1
t 4
t 5
p 0
t 1
p 3
t 3
t 7
p 1
t 1
t 5
p 0
t 1
t 3
t 4
t 7
p 0
t 1
t 5
p 0
t 4
t 6
t 7
p 0
t 4
p 0
t 1
t 4
t 7
p 0
Los casos de prueba se generaron con esta implementación de referencia de CJam .