Sei f
die Funktion, die ein Bitfeld ( {0 1}
) der Größe n+1
auf ein Bitfeld der Größe abbildet, n
indem sie XOR
auf das th- i
und i+1
th-Bit angewendet und das Ergebnis in das neue Bitfeld geschrieben wird.
Beispiel: f("0101") = "111"
Informelle Berechnung:
0 XOR 1 = 1
1 XOR 0 = 1
0 XOR 1 = 1
Sei f_inverse
die Umkehrfunktion von f
. Da die Inverse nicht eindeutig ist, wird f_inverse
eine gültige Lösung zurückgegeben.
Eingabe: Bitfeld als String (dh "0101111101011"
) und eine gegebene natürliche Zahlk
Output: Bitfeld als String, so dass die Saite des Ergebnisses enthält , wenn f_inverse
angewendet wird , k
mal mit dem Eingang Bitfeld. (ie f_inverse(f_inverse(f_inverse(input)))
)
Gewinnkriterien: Wenigste Charaktere
Bonus:
-25
Zeichen, wenn f_inverse
nicht rekursiv / iterativ angewendet, stattdessen wird die Ausgabezeichenfolge direkt berechnet
Testskript:
a = "011001"
k = 3
def f(a):
k = len(a)
r = ""
for i in xrange(k-1):
r += str(int(a[i]) ^ int(a[i+1]))
return r
def iterate_f(a, k):
print "Input ", a
for i in xrange(k):
a = f(a)
print "Step " + str(i+1), a
iterate_f(a, k)
Sie können es zum Beispiel hier einfügen und dann ausprobieren.
{0-1}
-Bitfields zu nennen? Auch verstehe ich die Definition nichtf
, woher kommti
das? Was ist das zweite Argument von XOR? wie kommen wir111
davon0101
?i
?"0 XOR 1" = 1 "1 XOR 0" = 1 "0 XOR 1" = 1
erklärt nichts: Ich weiß, wie XOR funktioniert, aber was genau machen wir XOR und wo speichern wir das Ergebnis?f([a,b,c,d]) = [a^b, b^c, c^d]
. Und er will die Inverse dieser Funktion, das heißtf'([x,y,z]) = [a,b,c,d]
, dassa^b=x
,b^c=y
,c^d=z
.Antworten:
Pyth,
3330 - 25 = 5 BytesFühren Sie es durch Eingabe von stdin wie (Online-Interpreter: https://pyth.herokuapp.com/ ):
und das Ergebnis wird nach stdout geschrieben.
Dies ist eine direkte Übersetzung von:
Python 2,
12711879 - 25 = 54 BytesNennen Sie es wie
i("111", 3)
, und das Ergebnis wird in stdout geschrieben.Beachten Sie, dass wir davon ausgehen, dass k nicht zu groß ist, da die innere Schleife für Code-Golfing-Zwecke O (2 k ) -mal ausgeführt wird.
Ich denke, wir nennen diese Operation normalerweise "xorshift" oder so. Wenn wir die Eingabe als Big-Endian-Ganzzahlen ausdrücken, lautet die Funktion f einfach:
Wenn wir gelten f zweimal werden wir erhalten:
Die dreimalige Anwendung hat jedoch ein anderes Muster:
Wenn Sie sich 4 Mal bewerben, kehren Sie zum Basisformular zurück:
Und so weiter:
Beachten Sie, dass, wenn wir 2 k groß genug wählen , (x ≫ 2 k ) = 0 ist, was f 2 k (x) = x bedeutet, und das Gegenteil ist trivial die Identitätsfunktion!
So ist die Strategie für die Suche nach f k (x) ohne Aufruf f -1 (x) überhaupt ist:
Finde K so, dass:
Express f k (x) = f -K + (Kk) (x) = f -K (f Kk (x)) = f Kk (x)
Das Ergebnis
f
heißt also Kk-mal25 Zeichen Gewinn: p
Update 1 : Verwendete eine Oktaldarstellung anstelle einer Binärdarstellung, sodass wir durch
%
Formatierung viele Bytes sparen konnten.Update 2 : Nutzen Sie die periodische Struktur von
f
. Die iterative Version wurde zurückgezogen, da die nicht iterative Version auch ohne den Bonus von -25 Byte kürzer ist.Update 3 : Reduziert 3 Bytes von Pyth, danke isaacg!
quelle
Jiz8K+lzQ%"%0*o",KuxG/G8rQ^2KJ
CJam,
15 bis14 BytesNimmt Eingaben wie
Teste es hier.
Erläuterung
Das Ergebnis wird am Ende des Programms automatisch ausgedruckt.
Ich sage "string / array", weil ich mit einem String beginne (das ist nur ein Array von Zeichen), aber ich nehme weiterhin XORs zwischen diesen und zwischen Zahlen.
Character Character ^
Gibt eine ganze Zahl (basierend auf dem XOR der Codepunkte)Character Integer ^
undInteger Character ^
ein Zeichen (basierend auf dem XOR der Zahl mit dem Codepunkt - interpretiert als Codepunkt). UndInteger Integer ^
natürlich gibt es nur eine ganze Zahl.Die Typen fliegen also überall herum, aber glücklicherweise ist es immer dann, wenn ich eine Ganzzahl habe, entweder
0
oder1
und wenn ich ein Zeichen habe, entweder'0
und'1
und das Ergebnis ist immer das gewünschte (in beiden Typen). Da Strings nur Arrays von Zeichen sind, ist das Mischen von Zeichen mit Zahlen überhaupt kein Problem. Und am Ende, wenn alles gedruckt ist, erhalten die Zeichen keine speziellen Begrenzer, sodass die Ausgabe nicht davon betroffen ist, welches Bit als Zahl oder Zeichen dargestellt wird.quelle
J, 17 Zeichen
Verwenden Sie immer 0 als führende Ziffer.
Beginnend mit dem 128 1-Status der obersten Zeile (links) und einem Zufallsstatus (rechts), werden die letzten 128 Ziffern der ersten 129 Iteration angezeigt.
quelle
APL 11
Erläuterung:
Versuchen Sie es auf tryapl.org
quelle
≠\
Würde aber nicht funktionieren statt2|+\
?((0,≠\)⍣⎕)⎕
erhalte ich ein ungültiges Token. Tryapl kann keine Eingaben verarbeiten?CJam, 25 - 25 = 0 Bytes
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 vorangestelltesq
Lesen 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
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ührungszeichen0
und1
Zeichen, 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:
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.
quelle
Python,
9478Wird mindestens einmal ausgeführt und ergibt somit das gleiche Ergebnis für
n=0
undn=1
Alte Version, die den String in ein numerisches Array konvertiert und Modulo 2 "integriert"
quelle
Python 2, 68
Eine absolut wiederverwendbare Lösung. Es ist einfacher zu verstehen, wenn es in zwei Funktionen unterteilt ist
Dabei werden
f
aufeinanderfolgende Differenzen berechnet und n-mal mit sich selbstg
komponiertf
.Die Funktion
f
berechnet die kumulativen XOR-Summen vonl
, was die inverse Operation zu aufeinanderfolgenden XOR-Differenzen ist. Da die Eingabe als Zeichenfolge angegeben wird, müssen wir sie extrahierenint(l[0])
, beim Zeichenfolgenvergleich jedoch kürzerl>='1'
.Python 2, 69
Eine iterative Lösung mit einer
exec
Schleife stellte sich als 1 Zeichen länger heraus.Vielleicht gibt es einen kürzeren Weg, mit der Saite umzugehen. Wenn es sich bei Ein- / Ausgängen um Zahlenlisten handeln könnte, würden 5 Zeichen gespart
quelle
Perl 5, 34
Auf der Standardeingabe angegebene Parameter, durch ein Leerzeichen getrennt.
quelle
Javascript ES6, 47 Zeichen
Übrigens gibt es keine Nebenwirkungen :)
quelle
C # -
178161115 ZeichenUngolfed mit Geschirr
quelle
CJam, 20 Bytes
Eingabe ist wie
"111" 3
Probieren Sie es hier online aus
quelle