Dies ist eine Herausforderung für Bullen und Räuber. Dies ist der Faden des Räubers. Der Thread des Polizisten ist hier .
Die Polizei wählt eine beliebige Sequenz aus dem OEIS aus und schreibt ein Programm p , das die erste Ganzzahl aus dieser Sequenz ausgibt. Sie werden auch einige String finden s . Wenn Sie s irgendwo in p einfügen , muss dieses Programm die zweite Ganzzahl aus der Sequenz ausgeben. Wenn Sie s + s an derselben Stelle in p einfügen , muss dieses Programm die dritte Ganzzahl aus der Sequenz ausgeben. s + s + s am selben Ort drucken das vierte und so weiter und so fort. Hier ist ein Beispiel:
Python 3, Sequenz A000027
print(1)
Die versteckte Zeichenfolge besteht aus zwei Bytes .
Die Zeichenfolge lautet +1
: Da das Programm print(1+1)
die zweite Ganzzahl in A000027 ausgibt, gibt das Programm print(1+1+1)
die dritte Ganzzahl usw. aus.
Cops müssen die Sequenz, das ursprüngliche Programm p und die Länge des versteckten Strings s enthüllen . Räuber knacken eine Einreichung, indem sie eine Zeichenfolge bis zu dieser Länge und den Ort finden, an dem sie eingefügt werden soll, um die Sequenz zu erstellen. Die Zeichenfolge muss weder mit der beabsichtigten Lösung übereinstimmen, um ein gültiger Riss zu sein, noch mit der Position, an der sie eingefügt wurde.
Wenn Sie eine der Antworten der Polizei knacken, veröffentlichen Sie Ihre Lösung (mit der verborgenen Zeichenfolge und dem verdeckten Ort) und einen Link zur Antwort. Dann kommentiere die Antwort der Polizei mit einem Link zu deinem Crack hier.
Regeln
Ihre Lösung muss für eine beliebige Zahl in der Sequenz funktionieren oder zumindest bis zu einer angemessenen Grenze, an der sie aufgrund von Speicherbeschränkungen, Ganzzahl- / Stapelüberlauf usw. fehlschlägt.
Der gewinnende Räuber ist der Benutzer, der die meisten Einreichungen knackt, wobei der Tiebreaker derjenige ist, der diese Anzahl von Rissen zuerst erreicht hat.
Der Sieger Cop ist der Cop mit dem kürzesten String s , die nicht geknackt wird. Tiebreaker ist der kürzeste p . Wenn es keine ungerissenen Vorlagen gibt, gewinnt der Cop, dessen Lösung für die längste Zeit ungerissen war.
Um als sicher eingestuft zu werden, muss Ihre Lösung 1 Woche lang ungerissen bleiben und dann die verborgene Zeichenfolge (und die Position, an der sie eingefügt werden soll) aufgedeckt werden.
s darf nicht verschachtelt sein, es muss Ende an Ende verkettet werden. Zum Beispiel, wenn s ist
10
, würde jede Iteration gehen ,10, 1010, 101010, 10101010...
anstatt10, 1100, 111000, 11110000...
Alle kryptografischen Lösungen (z. B. das Überprüfen des Hashs der Teilzeichenfolge) werden gesperrt.
Wenn s Nicht-ASCII-Zeichen enthält, müssen Sie auch die verwendete Codierung angeben.
quelle
%
Linksassoziierten berücksichtigt.Brain-Flak , A000984 von Nitrodon
Dies sind nur 30 Bytes, nicht sicher, was Nitrodon im Sinn hatte.
Probieren Sie es online!
Erläuterung
Ich habe viele Dinge ausprobiert, aber hier ist, was funktioniert hat. Die Terme von A000984 sind die zentralen Elemente von Pascals Dreieck.
Jetzt habe ich herausgefunden, dass ich sie erhalten kann, indem ich die Diagonalen über ihnen addiere:
Beispielsweise:
Und da die letzte Aktion in Nitrodons Programm darin besteht, alles zusammenzufassen, was diesen Anschein eines guten Kandidaten erweckt (eher, als hätte ich ein paar Dinge ausprobiert, aber dieses hat funktioniert).
Wir wollen also ein Programm, das eine Teilsumme nimmt und die nächste produziert. Zum Glück gibt es einen ziemlich guten Weg, um von einem zum nächsten zu gelangen. Jede Reihe ist das Delta der nächsten Reihe. Das ist dien - te Term in einer Reihe ist , die Differenz zwischen dem n - ten und n−1 - ten Terms in der nächsten Zeile.
Das einzige Problem ist, dass wir nicht genug von der letzten Zeile haben, um die gewünschte Zeile zu berechnen. Da jede Zeile eine Zeile länger als die letzte ist, können wir mit dieser Methode nicht das letzte Mitglied der nächsten Zeile abrufen. Hier haben wir jedoch einen anderen Trick: Das letzte Mitglied jeder Reihe ist gleich allen vorherigen Mitgliedern dieser Reihe!
Und wenn Sie mit Brain-Flak vertraut sind, sollte das für Sie als etwas herausstechen, das wirklich einfach zu bewerkstelligen ist.
Nun zum Code:
Zu Beginn führen wir die nächste Zeilenberechnung durch, bei der jedes neue Mitglied die Summe von zwei benachbarten alten Mitgliedern ist. Das geht mit:
Das verschiebt im Grunde ein Element und fügt hinzu (ohne zu löschen), was jemals zuvor oben drauf war. Dies kehrt jedoch alles um. Wenn wir das nächste Mal eine Zeile erhalten, müssen wir sie zurücksetzen.
Jetzt müssen wir das letzte Mitglied der Zeile berechnen. Wie gesagt das ist super einfach. Da wir eine Schleife über alle Elemente der Reihe hatten, können wir einfach diese Summe nehmen und sie pushen. Wir schieben es vor die zweite Schleife, damit es unten landet.
Und das ist es.
quelle
Brain-Flak, A000290 , von Sriotchilism O'Zaic
Original:
Gebrochen:
Probieren Sie es online!
Alternative:
Probieren Sie es online!
quelle
MATL , Sequenz A005206 von Luis Mendo
Original:
Probieren Sie es online!
Gebrochen:
Ich bin kein MATL-Experte, aber soweit ich weiß, erstellt das Original
voOdoO
zwei leere Arrays und ein Array[0]
auf dem Stapel. Dies[0]
wird ohne eckige Klammern als erstes Element der Sequenz gedruckt. Der Riss / die Lösung macht dann folgendes:d
Nimmt ein Element vom Stapel und verwandelt es (vorausgesetzt, es ist eine Zahl oder ein Array der Größe 1) in ein leeres Array. Diese leeren Arrays werden nicht gedruckt, tragen jedoch zur Stapelgröße beiNq
zählt die Größe des Stapels und subtrahiert einen. Dies ist dern+1
Begriff bei der Auswertung der Funktion (da sie bei 2 beginnt und sich bei jeder Iteration um eins erhöht, weild
dem Stapel unsichtbares Material hinzugefügt wird).17L
das ist die KonstantePhi = (1+sqrt(5))/2
/k
Diesfloor((n+1)/Phi)
ist eine der Formeln, die die Elemente der Sequenz berechnet. Diese Formel ist in OEIS aufgeführt,a(n) = floor(sigma*(n+1)) where sigma = (sqrt(5)-1)/2
sofern wir nicht die Identität verwenden(sqrt(5)-1)/2 = 1/Phi
quelle
\N17L/k&
(beachten Sie die zwei unterschiedlichen Verwendungen&
in der Mitte und am Ende des Codes), aber Ihre Lösung ist einfacher und eleganterPython 3 - A__
Probieren Sie es online!
100 Flaschen Bier hinzufügen
-1
, um die nächste Nummer zu erhalten99
, usw.quelle
-1
. Ich werde das deutlicher machen.Keg , Sequenz A000045 , von A__
Original:
Gebrochen:
Beachten Sie, dass die Herausforderung darin bestand, eine Teilzeichenfolge mit einer Länge <= 6 zu finden, die gefundene Zeichenfolge jedoch eine Länge von 5 hat.
Definition der Befehle für diejenigen, die zu faul sind, um die Keg-Spezifikation nachzuschlagen:
0
und1
die entsprechende Nummer auf den Stapel schieben;"
bewegt den Stapel nach oben zum Stapel nach unten (Rolle);&
Fügt den obersten Stapel in das Register ein, wenn er leer ist. Anderenfalls wird das Register auf den Stapel entleert.+
fügt die beiden obersten Stapelwerte hinzu.Die Initiale
1"
fügt einfach eine 1 am unteren Rand des Stapels ein. Diese wachsende Liste von 1en spielt nur eine Rolle in der ersten Iteration, wo es uns , die Stapel beginnen zu übernehmen kann und1 0
nicht nur0
. In der Tat, das Programm10:&+.
, wo die:&+
Teil wiederholt wird, genau das gleiche Verhalten wie die obige Lösung, mit der Ausnahme, dass die Liste der Einsen unten nicht wächst.Da
&
es im Wiederholungsteil nur einmal verwendet wird und abwechselndes Verhalten aufweist,1":&+
hängt das Verhalten von der Parität der Iteration ab.Dieses Programm gibt die Sequenz Fibonacci, die mit 0, 1 beginnt, nicht wirklich von Anfang an aus. es gibt tatsächlich die 1, 0-Fibonacci-Sequenz von der zweiten Stelle, dh von der 0, aus.
[a, b]
und endet wiea+b (&=b)
.[b] (&=a)
und endet wie[b, b+a]
.Dies berechnet tatsächlich die Sequenz nach Bedarf.
quelle
:
am Anfang der Zeichenfolge einen Befehl hinzugefügt habe .Java 8+, Sequenz A010686 von Benjamin Urquhart
quelle
Brain-Flak, A000578 von Sriotchilism O'Zaic
Original:
Probieren Sie es online!
Gebrochen:
Probieren Sie es online!
quelle
Pyret , Sequenz A083420 , von MLavrentyev
Sie können es hier ausführen, aber ich habe nicht herausgefunden, wie man einen Link zum Code erstellt. Sie müssen kopieren und einfügen.
Die bereitgestellte Funktion ignoriert das zweite Argument. Es verdoppelt seine erste und fügt eine hinzu, die die erforderliche
2^n - 1
Sequenz generiert. Ich muss ihr lediglich mitteilen, wie oft diese Operation durchgeführt werden soll, indem die Länge der gefalteten Liste geändert wird. Glücklicherweise beklagt sich Pyret nicht über dieses Komma.quelle
Python 3 , Sequenz A268575 von NieDzejkob
Original:
Gebrochen (100 Bytes):
Probieren Sie es online!
Soweit ich das beurteilen kann, werden im Originalcode Definitionen festgelegt, um die verborgene Zeichenfolge so kurz wie möglich zu halten, und anschließend das ursprüngliche Game of Life-Muster definiert. Die verborgene Zeichenfolge entspricht dann dem Schreiben einer Iteration von Conways Game of Life in 102 Byte.
Für die Zwecke dieses Risses
S
ist es eine Funktion, die die Elemente in ihren Argumenten (die iterable sind) summiert undF
eine Funktion anwendet, die für jedes Element einer Liste eine iterable zurückgibt und alle Ergebnisse zusammenfasst.;A=-1,1,0;
Beendet die vorangegangene Anweisung und kürzt das Tupel (-1,1,0) mit A ab, das verwendetproduct(A,A)
wird, um alle Nachbarn in Bezug auf eine gegebene Zelle sowie die Zelle selbst anzugeben .*X,=F(lambda a:(S(a,x)for x in product(A,A)),W);
Erstellt eine neue ListeX
mit allen Nachbarn von Zellen inW
und den Zellen in sichW
selbst, indem die relativen Positionen der Nachbarn zu jeder Zelle hinzugefügt und zu einer Liste zusammengefasst werden.W={p for p in X if 2<X.count(p)<4+({p}<W)}
Durchläuft diese ListeX
und bestimmt, ob jede ZelleX
in der nächsten Iteration zu der Gruppe von Zellen gehört. Dies wurde fast wörtlich von diesem Game of Life Golf übernommen .quelle
Haskell, A014675 von Khuldraeseth na'Barya
Originalcode
Mit Teilstring
Probieren Sie es online!
quelle
flip take[1,2]
anstelle dieses inneren Lambda. Ansonsten identisch.(`take`[2,1])
ist sogar ein Byte kürzer(`take`)
habe einen Kompilierungsfehler entdeckt, also habe ich mir das auch gedacht(`take`[2,1])
. :(Desktop - Rechner, A006125 , von A__
Original:
Gebrochen:
Probieren Sie es online!
Einfache Implementierung.
quelle
Sa2Lad1-*2/^
, falls mich jemand danach fragt.cQuents , Sequenz A003617 von Stephen
Probieren Sie es online!
Beginnen Sie mit der niedrigsten n + 1-stelligen Zahl, gefolgt von n Nullen. Das
#2
gibt an, dass nur der zweite Term der Sequenz gedruckt wird, bei dem es sich um die Sequenzdefinition handelt, die einmal auf den Startwert angewendet wurde. Diese Sequenzdefinition findet einfach die nächste Primzahl und gibt sie zurück.quelle
Python 3 - für immer
Probieren Sie es online!
quelle
MATL , Sequenz A000796 von Luis Mendo
Original:
Probieren Sie es online!
Gebrochen:
Der ursprüngliche Autor hat das Array im Handumdrehen erstellt
[-7:-1]
und dann das erste Element extrahiert und negiert, das abgerufen werden soll7
. Er benutzte das dann, um die gerundete 7. Ziffer von pi (was ist3
) zu erhalten und präsentierte es als die erste Ziffer von pi. Durch|SQ
das Hinzufügen wird das ursprüngliche Array positiv, sortiert und zu allem hinzugefügt. Dies bedeutet, dass nach allem, anstatt den Index7
abzurufen, der Index-2
nach einer Anwendung,-3
nach zwei Anwendungen usw. abgerufen wird. Das-
ist wichtig, weil es dieY$
Funktion anweist, die Ziffern nicht zu runden.quelle
Forth (gforth) , A000042 , von NieDzejkob
Probieren Sie es online!
Das triviale 1-Byte erweitert einfach das Literal. Das Problem ist, dass bereits ab der neunzehnten Stelle 64 Bit überlaufen. Einfache Lösung ist, die einzelne Ziffer wiederholt auszudrucken, oder? Ja, aber so einfach ist es nicht. Wenn Sie
1 .
am Ende anheften, werden zwar die zusätzlichen Ziffern gedruckt, die wir benötigen, sie werden jedoch durch Leerzeichen getrennt. Das wird nicht funktionieren.Laut Wikipedia ist "
.(
(Punkt-Paren) ein unmittelbares Wort, das eine durch Klammern getrennte Zeichenfolge analysiert und anzeigt." Glücklicherweise hat diese Anzeige keine anderen seltsamen Zeichen, daher.(
sollte es ausreichen, eine einzelne 1 zu drucken. Und das tut es auch. Nach dem Paren wird kein Leerzeichen benötigt, daher können diese fünf Zeichen (nach dem Paren ein Leerzeichen) nach Herzenslust wiederholt werden. Zur Veranschaulichung habe ich ein Beispiel in TIO aufgenommen, das ein 64-Bit-Int mehrmals überlaufen hätte. Klappt wunderbar.quelle
Unefunge-98 (PyFunge) , Sequenz A000108 , von NieDzejkob
Probieren Sie es online!
Sechsmal wiederholt
Zwei Bytes von den neunzehn sind erlaubt! Was als Leerzeichen erscheint, ist ein 0x01 Start Of Header-Zeichen.
Erläuterung:
Bei dieser Herausforderung geht es darum,
a(n)
ausa(n-1)
und vielleicht etwas zu generierenn
. OEIS bietet die explizite Formela(n) = (2n)!/(n!(n+1)!)
, in die leicht genug konvertiert werden kanna(n) = a(n-1) * (4n-6) / n
. Nun, um dies in Funge umzusetzen.Ich muss Code zwischen
1
und einfügen.
. Das ist schon die Hälfte des Puzzles. Was bleibt, ist welcher Code einzufügen? Es fehlt Funge vor allem an Werkzeugen zur Stapelbearbeitung, so dass der Boden des Stapels gesperrt ist. Ich muss beiden
und verfolgena(n)
ohne den Stapel zu vergrößern. Und wie geht das besser als mit Funge Space?Dieses 0x01-Zeichen ist mein Zähler
n
. Ich behaltea(n)
den Stack bei, da er sich auf dem Stack befinden muss, nachdem mein Bit ausgeführt wurde.quelle
Python 3 , A008574 von tsh
Probieren Sie es online!
quelle
V, A000290 , von DJMcMayhem
ergibt die Quadrate von 1.
Probieren Sie es online!
Die Basis
é*
fügt die Anzahl der Nicht-Newline-Zeichen in den gesamten Puffer ein*
undØ.
zählt sie. Die EinfügungÄ
dupliziert die oberste Zeile in eine eigene Zeile, in die die2é*
Einfügungen eingefügt werden**
. Verkettungen der Insertionen ergeben aufeinanderfolgende ungerade Zahlen, wobei die größten oben liegen. Das EndergebnisØ.
summiert die ersten n ungeraden Zahlen und ergibt so das n-te Quadrat.quelle
ÄÎé*<CR>
AsciiDots , Sequenz A019523 von Alion
Einmal!
Zweimal!
Zehn Mal!
Beim Versuch herauszufinden, wie der Code / die Sprache funktioniert, habe ich gelernt, dass die ersten beiden Zeilen des vorhandenen Codes die gesamte Arbeit der endlosen Ausgabe der Fibonacci-Sequenz erledigen. Der Code wird beendet, wenn ein Punkt auf den Code trifft.
&
Ich musste also lediglich eine weitere Verzögerung in die verbleibenden Zeilen einfügen , damit die entsprechende Anzahl von Einträgen ausgegeben werden kann.Nach einigen Versuchen, Fehlern und Beobachtungen stellte ich fest, dass das korrekte Verzögerungsintervall 16 Zeiteinheiten pro Zahl beträgt. Es schien nicht möglich, genügend Zeichen in eine einzelne Zeile einzufügen. Daher musste ich die Verzögerung in zwei Zeilen einteilen und 10 Zeichen für die tatsächliche Verzögerung belassen. Damit das Muster mit sich selbst übereinstimmt, mussten beide Zeilen 5 Zeichen haben, und da die mittleren drei Zeichen in einer Zeile zweimal durchlaufen werden können, ergeben sich je nach Wunsch 16 Zeiteinheiten.
Das Erfordernis, dies auf die
&
in der achten Spalte abzustimmen, schien dies unmöglich zu machen, bis mir klar wurde, dass ich mit einer neuen Zeile im Inneren der dritten Reihe beginnen konnte. Dadurch erhält die vorletzte Zeile die richtige Länge und das jetzt überflüssige Ende der dritten Zeile wird entfernt.quelle
\v
/v>-----)
Brachylog , Sequenz A114018 nach nicht verwandter
Ursprüngliches Programm:
String zum Einfügen:
Probieren Sie es online!
Erläuterung
Hier ist zunächst die Erklärung des ursprünglichen Programms (in Kenntnis der Tatsache, dass die verwendete Sequenz "Primzahl mit mindestens n Ziffern, deren Ziffernumkehr ebenfalls Primzahl ist").
Wie Sie sehen, ist das Programm ziemlich unkompliziert, abgesehen von einer Sache: Es gibt eine völlig unbrauchbare
b - behead
Prädikatenaufruf, der das erste Element der Umkehrung unserer Zahl entfernt, mit dem wir nichts anfangen.Dies ist ein eindeutiger Hinweis darauf, wie wir die Zeichenfolge finden können. Die Idee ist, dass wir, da wir die Länge der Zahl jedes Mal, wenn wir die Zeichenfolge hinzufügen, um eine Ziffer erhöhen möchten, eine Zeichenfolge benötigen, die die Länge dieser Zahl irgendwie "auswertet" und diese unbrauchbar macht
b
.Die Lösung besteht darin, Folgendes zu verwenden
ẹb
: Zuerstẹ - elements
wird die Zahl in eine Liste von Ziffern umgewandelt. Dannb - behead
wird das erste Element entfernt. Der Trick ist, dass diesb
fehlschlägt, wenn die Liste der Ziffern leer ist. Jedes Mal, wenn wir a anhängenb
, erhöhen wir die Länge der erforderlichen Zahl um 1 (da dies fehlschlägt, bis der zugewiesene Wert von?
hoch genug ist, um ausreichend viele Ziffern zu enthalten, so dass die letzteb
Ziffer auf eine Liste mit einer Ziffer angewendet wird).Eine erneute Zuordnung
ẹ
hat keine Auswirkung, da es sich bereits um eine Ziffernliste handelt . Wir brauchen es am Anfang nur einmal, denn wenn wir eine Zahl wie9001
anstelle der Liste ihrer Ziffern enthaupten , erhalten wir,001 = 1
was Informationen über die Anzahl der Ziffern verliert.quelle
9001b1
Problem gedacht . Es stellte sich heraus, dass das Problem zwarb
fehlschlägt, wenn die Liste der Ziffern leer ist, es jedoch nicht fehlschlägt, wenn Sie nie eine Liste haben, da einstellige Zahlen bis 0 abwerten, einschließlich 0 selbst .b
ist komischVDM-SL , A000312 , nach abgelaufenen Daten
Da VDM-SL-
let
Ausdrücke Variablen, die bereits in einem einschließenden Bereich gebunden sind, erneut bindenx**x
können , können sie in Bereichen, in denenx
einer mehr ist als im vorherigen Bereich, beliebig tief verschachtelt ausgewertet werden , während das Originalx
immer noch weniger als die Kardinalität von istm(1)
.quelle
If you insert s somewhere into p, this program must print the second integer from the sequence. If you insert s + s into the same location in p, this program must print the third integer from the sequence.
Beachten Sie das Verhalten des Beispielsprint(1)
.++
überschreiben zur KarteHaskell, A083318 von xnor
Probieren Sie es online!
quelle
show
.Haskell , A000045 (Fibonacci) , durch Rins Fourier-Transformation
Probieren Sie es online!
Genau 23 Bytes.
Dieser hat Spaß gemacht und war etwas knifflig. Die umgekehrte 0 und 1 warf mich ein wenig ab, bevor mir klar wurde, dass das kein Problem war. Der Mangel an
$
Originals ließ mich skizzenhafte Dinge wie$...$id
(ein Byte zu lang) ausprobieren, bevor mir klar wurde, dass ich alles in Klammern setzen konnte. Alles in allem ein schönes kleines Puzzle.H.PWiz weist darauf hin , dass Musterabgleich gespeichert mir mindestens fünf Bytes haben könnte:
$(\[x,y]->[y,x+y])
. Diese verdammt sinnlose Herausforderung lässt mich überall sinnlos denken.quelle