Hinweis: Diese Challenge erlaubt nur Antworten in kompilierten Sprachen
Aufgabe
Ihre Aufgabe ist ziemlich einfach: Erstellen Sie zwei verschiedene Programme, die beim Kompilieren zur gleichen Ausgabe führen.
Wertung
Hier kommt der Spaß ins Spiel. Ihre Punktzahl ist die Anzahl der eindeutigen Bytes, die in genau einem Programm vorhanden sind. Zum Beispiel, wenn Ihre beiden Programme (in IBM Codepage 437 codiert ) sind
☻☻Program A
und
☺Program B
Die Zeichen, die sich in genau einem Programm befinden, sind
☻☺AB
Somit ist die Punktzahl 4. Beachten Sie, dass es ☻
im ersten Programm zweimal vorkommt, aber nur einmal gezählt wird.
Ihr Ziel ist es, die höchste Punktzahl zu erreichen, die höchstmögliche Punktzahl ist 256.
Hier ist ein Bewertungsprogramm, das für ASCII-codierte Programme funktioniert.
Bestimmungen
Jedes Byte in beiden Programmen sollte durch ein anderes Byte ersetzt werden können, wodurch das Programm entweder zu einem anderen Ergebnis kompiliert wird oder nicht alle zusammen kompiliert werden können. Das Entfernen eines Bytes sollte dasselbe tun.
Sie können alle Kompilierungsflags verwenden, solange beide Programme mit denselben Flags ausgeführt werden.
Die resultierende Kompilierung sollte statisch sein (dh nicht von Lauf zu Lauf variieren), wenn die Ergebnisse von Maschine zu Maschine variieren und angeben, auf welcher Maschine sie ausgeführt werden soll.
Die Ausgabe der Kompilierung sollte Byte für Byte identisch sein, nicht "äquivalent" oder "ähnlich genug".
Die Ausgabe der Zusammenstellung sollte nicht leer sein
Warnungen / Fehler müssen zwischen den Kompilierungen nicht identisch sein
Wenn die Programme oder die Kompilierung nicht druckbare Zeichen enthalten, muss ein Hexdump enthalten sein. Obwohl es technisch nicht erforderlich ist.
quelle
abcdefghijqlmnop...
20 eindeutige Zeichen zu verwenden. Ist das erlaubt?Code-Bowling
Frage!Antworten:
Perl, Score 254 + 2 = 256
Hier ist ein Hex-Dump eines Programms:
und hier ist das andere Programm:
Perl wird normalerweise nicht für eine kompilierte Sprache gehalten, aber es ist so. Es wird zuerst zu Bytecode kompiliert und dann wird der Bytecode ausgeführt. Sie können einen Filter auf den Bytecode anwenden (z. B. um ihn zu sichern, anstatt das Programm auszuführen), indem Sie die
-MO
Option verwenden. Beide Programme kompilieren in den folgenden Bytecode (disassembliert mit-MO=Terse
):Erläuterung
Perl ersetzt alle Anweisungen ohne Auswirkung (z. B. Zeichenfolgenliterale allein) durch eine fest codierte Anweisung "Anweisung ohne Auswirkung" im resultierenden Bytecode, sodass beide Programme auf dieselbe Weise kompilieren. In Bezug auf das Ersetzen von Zeichen führt das Ersetzen der meisten Zeichen aus Programm 1 durch Apostrophe dazu, dass das Kompilieren fehlschlägt (oder das Ersetzen der Apostrophe durch
0
). Wenn Sie in Programm 2 ein beliebiges Zeichen durch ein beliebiges Zeichen ersetzen, kannc
das Programm nicht kompiliert werden (es\c
wird ein Argument verwendet).In Bezug auf das Löschen von Zeichen ging die erste Version dieser Antwort der "Strahlenschutzregel" voraus (das Löschen eines Zeichens muss das Verhalten des Programms ändern). Diese aktualisierte, strahlungsgehärtete Version arbeitet mit einer Prüfsumme. Wenn das Löschen eines Zeichens nicht sofort zu einem Syntaxfehler führt, wird der Code zu einem Aufruf der nicht vorhandenen Funktion kompiliert
x
. Der Perl-Compiler optimiert den Aufruf nicht, wenn er ausgeführt wird (und scheint im Allgemeinen nicht zu wissen, dass die Funktion nicht vorhanden ist), und daher ist die Ausgabe unterschiedlich. Perls konstanter Ordner kann jedoch erkennen, dass das nicht mutierte Programm eine einzelne Anweisung ohne Auswirkung ist, und optimiert daher das Ganze wie zuvor in einer einzigen Anweisung.Ursprünglich habe ich die Frage falsch verstanden, weil ich nur eindeutige Zeichen aus einem Programm gezählt habe, und ich habe versucht, sie zu optimieren. Es ist klar, dass Programm 2 mindestens ein Zeichen enthalten muss, um den Opcode "Anweisung ohne Wirkung" zu generieren, was bedeutet, dass die bestmögliche Punktzahl in einem Programm 255 ist. Ich habe noch keine Möglichkeit gefunden, einen Backslash in das Programm aufzunehmen 1 in der Weise, dass das unmittelbar darauf folgende Zeichen nicht so ersetzt werden kann, dass das Programm unterbrochen wird, aber es würde mich nicht wundern, wenn dies möglich wäre (was zu einer Punktzahl von 255 + 1 = 256 führt ).
quelle
C 231
Programm A
Viele Unbedruckbare oben. Hier ist der xxd Hexdump:
Programm B
Diese kompilieren sich zu genau demselben Objektcode. Da GCC den Dateinamen in den Objektcode einbettet, müssen Sie den Dateien den gleichen Namen geben (in verschiedenen Verzeichnissen).
Ich war besorgt, dass die Tatsache, dass es keine Referenzen gibt,
i
den Compiler dazu veranlassen könnte, diese Variable vollständig zu optimieren, aber ich denke, dass das Erstellen einer globalen Variable garantiert, dass sie im Objekt vorhanden sein wird. Dies kann durch Inspektion der erzeugten Baugruppe überprüft werden:Beachten Sie, dass in Programm B (die meisten) Zeichenwerte in Oktal angegeben sind. Sie hätten auch dezimal angegeben werden können, aber durch die Verwendung von Oktal erhalten wir ein paar zusätzliche Zeichen -
8
und9
- in der Differenzmenge.GCC scheint CR-, LF- und (aus offensichtlichen Gründen) NUL-Zeichen in einfachen Anführungszeichen nicht zu mögen
''
.Online ausprobieren und punkten .
quelle
char
implizit deklariert werdenint
, was sich nachteilig auf die Bewertung auswirkt .Python, Punktzahl
16262728Einzigartige Charaktere:
-+;132547698<ACBEDFOXabopsx|
Berechnen Sie die Punktzahl
Programm 1:
In Programm 1 befinden sich 5 Leerzeichen in der scheinbar leeren Zeile.
Programm 2:
Mit dem Quellcode des Gucklochoptimierers wurde eine gewisse Hilfe gefunden .
Getestet mit diesem Hilfsskript: Probieren Sie es online aus!
quelle
Python 3.6,
2 3 56Programm 1:
Programm 2:
Python wird normalerweise nicht kompiliert, aber es kompiliert seinen Quellcode in Pyc-Dateien. Ausschlaggebend für diese Kompilierung ist ein Optimierungsdurchlauf, der "1111 + 4168" in "5279" ändert. Die Unterstriche dienen zwei Zwecken: Einer ist das Hinzufügen eines zum Score und der andere ist das Beibehalten der Länge, die im PyC gespeichert ist Header das gleiche. Alle Variablenzuweisungen außer 'x' sollen
co_consts
die richtige Reihenfolge beibehalten. Dasx*x
am Ende dient dazu,co_stacksize
das Gleiche zu halten .quelle
compile
hinzu gelten nur für den Headeros.utime
FunktionFASM, 254
nein 0x00 und 0x1A, weil fasm die beiden Symbole nicht unterstützt
quelle