CJam, 25 - 25 = 0 byte
q~1,*_@{[\{1$^}/_](;)\}/;
Questa è solo una porta CJam diretta della risposta GolfScript di seguito, poiché, dopo aver letto la risposta di Martin Büttner , mi sono reso conto che avrei potuto salvare un byte a causa della gestione da parte di CJam di numeri interi e tipi di caratteri. (Fondamentalmente, CJam non ha bisogno 1&dell'usato per forzare i caratteri ASCII in bit nel codice GolfScript, ma richiede un antepostoq per leggere l'input.) Di solito considererei una porta così banale un trucco economico, ma ottenendo un punteggio zero fatto ne vale la pena.
In ogni caso, questo programma funziona esattamente come il programma GolfScript originale di seguito, quindi fai riferimento alla sua descrizione e alle istruzioni d'uso. Come al solito, puoi provare la versione di CJam usando questo interprete online .
GolfScript, 26-25 = 1 byte
~1,*.@{[1&\{1$^}/.](;)\}/;
Questa soluzione scorre la stringa di input solo una volta, quindi credo che si qualifichi per il bonus di -25 byte. Funziona mantenendo internamente un array k -element che memorizza il bit corrente di ciascuno dei k pre-iterati.
L'immissione deve essere fornita tramite stdin, nel formato "1111111" 3, ovvero come una stringa tra virgolette di 0e 1caratteri, seguita dal numero k . L'output sarà stdout, come una stringa di bit senza virgolette.
Prova questo codice online. (Se il programma scade, prova a eseguirlo nuovamente; il server Web GolfScript è noto per i timeout casuali.)
Ecco una versione estesa di questo programma, con commenti:
~ # 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
Fondamentalmente, come la maggior parte delle soluzioni iterative, questo codice può essere inteso come applicazione della ricorrenza
b i , j : = b i , ( j −1) ⊕ b ( i −1), ( j −1) ,
dove b 0, j è il bit di ingresso j -esimo (per j ≥ 1), b k , j è il bit di uscita j -esimo e b i , 0 = 0 per ipotesi. La differenza è che, mentre le soluzioni iterative, in effetti, calcolano la ricorrenza "riga per riga" (cioè prima b 1, j per tutto j , poi b 2, j , ecc.), Questa soluzione invece la calcola "colonna per colonna "(o, più precisamente," diagonale per diagonale "), prima elaborazione b i , i per 1 ≤ i ≤ k, quindi b i , i +1 , quindi b i , i +2 , ecc.
Un vantaggio (teorico) di questo approccio è che, in linea di principio, questo metodo può elaborare una stringa di input arbitrariamente lunga usando solo la memoria O ( k ). Naturalmente, l'interprete GolfScript legge automaticamente tutti gli input in memoria prima di eseguire comunque il programma, annullando principalmente questo vantaggio.