CJam, 25 - 25 = 0 octet
q~1,*_@{[\{1$^}/_](;)\}/;
Ceci est juste un port CJam direct de la réponse GolfScript ci-dessous, car, après avoir lu la réponse de Martin Büttner , j'ai réalisé que je pouvais économiser un octet grâce à la gestion par CJam des types d'entiers et de caractères. (Fondamentalement, CJam n'a pas besoin de l' 1&utilisé pour forcer les caractères ASCII en bits dans le code GolfScript, mais nécessite un préfixe qpour lire l'entrée.) il vaut bien l'OMI.
Dans tous les cas, ce programme fonctionne exactement comme le programme GolfScript d'origine ci-dessous, veuillez donc vous référer à sa description et à ses instructions d'utilisation. Comme d'habitude, vous pouvez tester la version CJam à l'aide de cet interprète en ligne .
GolfScript, 26 - 25 = 1 octet
~1,*.@{[1&\{1$^}/.](;)\}/;
Cette solution n'itère la chaîne d'entrée qu'une seule fois, donc je pense qu'elle est admissible au bonus de -25 octets. Il fonctionne en maintenant en interne un tableau à k éléments qui stocke le bit actuel de chacun des k pré-itérations.
L'entrée doit être donnée via stdin, au format "1111111" 3, c'est-à-dire sous la forme d'une chaîne de caractères 0et de guillemets 1, suivie du nombre k . La sortie sera vers stdout, comme une chaîne de bits sans guillemets.
Testez ce code en ligne. (Si le programme arrive à expiration, essayez de le relancer; le serveur Web GolfScript est connu pour les délais d'expiration aléatoires.)
Voici une version étendue de ce programme, avec des commentaires:
~ # 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
Fondamentalement, comme la plupart des solutions itératives, ce code peut être compris comme appliquant la récurrence
b i , j : = b i , ( j -1) ⊕ b ( i -1), ( j -1) ,
où b 0, j est le j- ème bit d'entrée (pour j ≥ 1), b k , j est le j- ème bit de sortie, et b i , 0 = 0 par hypothèse. La différence est que, alors que les solutions itératives, en fait, calculent la récurrence "ligne par ligne" (c'est-à-dire d'abord b 1, j pour tout j , puis b 2, j , etc.), cette solution la calcule plutôt "colonne par colonne "(ou, plus précisément," diagonale par diagonale "), calculant d'abord b i , i pour 1 ≤ i≤ k , puis b i , i +1 , puis b i , i +2 , etc.
Un avantage (théorique) de cette approche est que, en principe, cette méthode peut traiter une chaîne d'entrée arbitrairement longue en utilisant uniquement le stockage O ( k ). Bien sûr, l'interpréteur GolfScript lit automatiquement toutes les entrées en mémoire avant d'exécuter le programme de toute façon, annulant principalement cet avantage.