CJam, 25-25 = 0 bytes
q~1,*_@{[\{1$^}/_](;)\}/;
Este es solo un puerto directo de CJam de la respuesta de GolfScript a continuación, ya que, después de leer la respuesta de Martin Büttner , me di cuenta de que podía guardar un byte debido al manejo de CJam de tipos enteros y de caracteres. (Básicamente, CJam no necesita el 1&
usado para forzar caracteres ASCII en bits en el código GolfScript, pero requiere un antecedenteq
para leer la entrada). Normalmente consideraría que un puerto tan trivial es un truco barato, pero lograr un puntaje cero hizo OMI vale la pena.
En cualquier caso, este programa funciona exactamente como el programa GolfScript original a continuación, por lo tanto, consulte su descripción y las instrucciones de uso. Como de costumbre, puede probar la versión de CJam utilizando este intérprete en línea .
GolfScript, 26-25 = 1 byte
~1,*.@{[1&\{1$^}/.](;)\}/;
Esta solución itera sobre la cadena de entrada solo una vez, por lo que creo que califica para la bonificación de −25 bytes. Funciona manteniendo internamente una matriz de elementos k que almacena el bit actual de cada una de las k iteraciones previas.
La entrada debe darse a través de stdin, en el formato "1111111" 3
, es decir, como una cadena entre comillas 0
y 1
caracteres, seguida del número k . La salida será stdout, como una cadena de bits sin comillas.
Prueba este código en línea. (Si el programa se agota, intente volver a ejecutarlo; el servidor Web GolfScript es conocido por los tiempos de espera aleatorios).
Aquí hay una versión ampliada de este programa, con comentarios:
~ # eval the input, leaving a string and the number k on the stack
1,* # turn the number k into an array of k zeros ("the state array")
. # make a copy of the array; it will be left on the stack, making up the
# first k bits of the output (which are always zeros)
@ # move the input string to the top of the stack, to be iterated over
{
[ # place a start-of-array marker on the stack, for later use
1& # zero out all but the lowest bit of this input byte
\ # move the state array to the top of the stack, to be iterated over
{ 1$^ } / # iterate over each element of the state array, XORing each
# element with the previous value on the stack, and leave
# the results on the stack
. # duplicate the last value on the stack (which is the output bit we want)
] # collect all values put on the stack since the last [ into an array
(; # remove the first element of the array (the input bit)
) # pop the last element (the duplicated output bit) off the array
\ # move the popped bit below the new state array on the stack
}
/ # iterate the preceding code block over the bytes in the input string
; # discard the state array, leaving just the output bits on the stack
Básicamente, como la mayoría de las soluciones iterativas, se puede entender que este código aplica la recurrencia
b i , j : = b i , ( j −1) ⊕ b ( i −1), ( j −1) ,
donde b 0, j es el j -ésimo bit de entrada (para j ≥ 1), b k , j es el j -ésimo bit de salida, y b i , 0 = 0 por supuesto. La diferencia es que, mientras que las soluciones iterativas, en efecto, calculan la recurrencia "fila por fila" (es decir, primero b 1, j para todo j , luego b 2, j , etc.), esta solución en cambio la calcula "columna por columna "(o, más exactamente," diagonal por diagonal "), primero computando b i , i para 1 ≤ i≤ k , luego b i , i +1 , luego b i , i +2 , etc.
Una ventaja (teórica) de este enfoque es que, en principio, este método puede procesar una cadena de entrada arbitrariamente larga utilizando solo almacenamiento O ( k ). Por supuesto, el intérprete de GolfScript lee automáticamente todas las entradas en la memoria antes de ejecutar el programa de todos modos, sobre todo negando esta ventaja.