CJam, 25 - 25 = 0 Bytes
q~1,*_@{[\{1$^}/_](;)\}/;
Dies ist nur eine direkte CJam-Portierung der unten stehenden GolfScript-Antwort, da nach dem Lesen von Martin Büttners Antwort ich erkannte, dass ich ein Byte einsparen konnte, da CJam Integer- und Zeichentypen handhabte. (Grundsätzlich benötigt CJam 1&im GolfScript-Code keine ASCII-Zeichen, die zum Erzwingen von Bits verwendet werden, erfordert jedoch ein vorangestelltes qLesen der Eingabe.) Normalerweise würde ich einen solchen einfachen Port als billigen Trick betrachten, aber eine Null-Punktzahl erzielen es lohnt sich meiner Meinung nach.
In jedem Fall funktioniert dieses Programm genauso wie das Original-GolfScript-Programm unten. Lesen Sie daher die Beschreibung und die Gebrauchsanweisung. Mit diesem Online-Interpreter können Sie wie gewohnt die CJam-Version testen .
GolfScript, 26 - 25 = 1 Byte
~1,*.@{[1&\{1$^}/.](;)\}/;
Diese Lösung durchläuft die Eingabezeichenfolge nur einmal. Ich glaube, sie qualifiziert sich für den 25-Byte-Bonus. Es funktioniert, indem intern ein k- Element-Array verwaltet wird, das das aktuelle Bit von jedem der Elemente speichert k vorge iteriert.
Die Eingabe sollte über stdin erfolgen, und zwar im Format "1111111" 3, dh in Anführungszeichen 0und 1Zeichen, gefolgt von der Zahl k . Die Ausgabe erfolgt als Bitstring ohne Anführungszeichen auf stdout.
Testen Sie diesen Code online.(Wenn das Programm eine Zeitüberschreitung aufweist, versuchen Sie es erneut. Der Web GolfScript-Server ist für zufällige Zeitüberschreitungen bekannt.)
Hier ist eine erweiterte Version dieses Programms mit Kommentaren:
~ # 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
Grundsätzlich kann dieser Code wie die meisten iterativen Lösungen so verstanden werden, dass die Wiederholung angewendet wird
b i , j : = b i , ( j - 1) ≤ b ( i - 1), ( j -1) ,
wobei b 0, j das j- te Eingangsbit ist (für j ≥ 1), b k , j das j- te Ausgangsbit ist und b i , 0 = 0, vorausgesetzt. Der Unterschied besteht darin, dass die iterativen Lösungen tatsächlich die Wiederholung "zeilenweise" berechnen (dh zuerst b 1, j für alle j , dann b 2, j usw.), diese Lösung sie stattdessen "spaltenweise" berechnet Spalte "(oder genauer" Diagonale für Diagonale "), wobei zuerst b i , i für 1 ≤ berechnet wird b i , i +1 , dann b i≤ k , dann usw. i , i +2
Ein (theoretischer) Vorteil dieses Ansatzes besteht darin, dass dieses Verfahren im Prinzip eine beliebig lange Eingabezeichenfolge nur unter Verwendung von O ( k ) -Speicher verarbeiten kann. Natürlich liest der GolfScript-Interpreter automatisch alle Eingaben in den Speicher, bevor er das Programm trotzdem ausführt, was diesen Vorteil größtenteils zunichte macht.