Ihre Aufgabe ist es, ein nicht leeres Programm / eine nicht leere Funktion mit der Bytezahl L zu schreiben , die bei M- maliger Wiederholung prüft, ob eine gegebene positive ganze Zahl N gleich L × M ist .
Theoretisch sollten Sie eine beliebige Anzahl von Wiederholungen unterstützen (ein beliebiger positiver ganzzahliger Wert von M ), aber es ist in Ordnung, wenn es aufgrund von Spracheinschränkungen nicht über einen bestimmten Schwellenwert funktionieren kann. Das Lesen des Quellcodes Ihres Programms oder der Zugriff auf Informationen darüber ist strengstens untersagt .
Für die Ausgabe sollten Sie einen konsistenten Wert für einen der Zustände (entweder wahr oder falsch) auswählen und einen anderen (nicht unbedingt konsistenten) möglichen Wert für den anderen Zustand verwenden ( Diskussion ).
Ihre Antworten werden mit der Länge L (in Bytes) Ihres Anfangsprogramms bewertet, wobei weniger Bytes besser sind.
Beispiel
Nehmen wir an, Ihr (erstes) Programm ist ABCDE
. Dann:
ABCDE
(1 Wiederholung) sollte prüfen, ob der Eingang gleich 5 ist .ABCDEABCDE
(2 Wiederholungen) sollten prüfen, ob die Eingabe gleich 10 ist .ABCDEABCDEABCDE
(3 Wiederholungen) sollten prüfen, ob die Eingabe gleich 15 ist . Etc...
Die Bewertung dieses Beispielcodes wäre 5 , da die ursprüngliche Quelle 5 Byte lang ist.
quelle
L
verkettet nach sich selbst sollM
mal zurückliefern, ob seine EingabeN
gleich istL*M
?Antworten:
Gelee , 1 Byte
Die Ausgabe ist 0 für eine Übereinstimmung, ungleich Null für eine Nichtübereinstimmung.
Probieren Sie es online!
Wie es funktioniert
Dies macht sich das zu liberale Ausgabeformat zunutze. Das
’
M- fache Wiederholen dekrementiert einfach das M- fache der Eingabe , sodass das Ergebnis genau dann Null ist, wenn die Eingabe LM ist , wobei L = 1 ist .quelle
Haskell, 8 Bytes
Probieren Sie es online!
Wie bei vielen anderen Antworten wird 0 für Wahrheit und Nicht-0 für Falschheit zurückgegeben, indem die Länge des Codes wiederholt von der eingegebenen Zahl subtrahiert wird.
quelle
Netzhaut ,
21 bis20 BytesProbieren Sie es online! Wiederholen Sie einfach den Teil im Codefenster , um zu sehen, wie er mit den Vielfachen umgeht.
Gibt
0
für alles andere die richtigen multiplen und positiven ganzen Zahlen an.Erläuterung
Schauen wir uns zuerst das einzelne Programm an:
Dadurch wird eine Dezimalzahl in eine unäre Zahl umgewandelt (wobei
_
als unäre Ziffer verwendet wird).Wenn der String leer ist (was an dieser Stelle nicht passieren kann, da die Eingabe garantiert positiv ist), ersetzen wir ihn durch einen einzelnen
_
.Jetzt werden die ersten 20 Unterstriche entfernt. Wenn die Eingabe nicht erfolgreich war
20
, wird eine leere Zeichenfolge angezeigt.Und schließlich zählen wir die Anzahl der Unterstriche im Ergebnis, die Null ist, wenn die Eingabe war
20
.Was passiert nun, wenn wir den Quellcode wiederholen? Da wir beim Verbinden der Programme keinen Zeilenvorschub einfügen, wird die erste Zeile direkt am Ende der letzten Zeile eingefügt. Dies erhalten wir, wenn das Programm verdoppelt wird:
Anstatt nun die Unterstriche zu zählen, erhalten wir die folgende Stufe:
Diese Phase führt zu nichts, da sich zu diesem Zeitpunkt keine weiteren Ziffern in der Arbeitszeichenfolge befinden, sodass der reguläre Ausdruck nicht übereinstimmen kann.
Jetzt wird diese Phase relevant. Wenn die Eingabe ein kleineres Vielfaches von 20 war, wurde die Zeichenfolge durch die vorherige Kopie des Quellcodes geleert. In diesem Fall verwandeln wir es in einen einzelnen Unterstrich, von dem wir wissen, dass er von unserem Programm nie wieder in einen leeren String umgewandelt werden kann. Auf diese Weise stellen wir sicher, dass nur das M- te Vielfache akzeptiert wird (und nicht alle Vielfachen bis zum M- ten).
Wir entfernen die ersten 20 Unterstriche noch einmal. Daher werden bei M- Wiederholungen des Quellcodes nach Möglichkeit 20 Millionen Unterstriche aus dem String entfernt.
Und wenn wir am Ende des Programms angelangt sind, zählen wir immer noch Unterstriche, sodass gültige Eingaben Null ergeben.
quelle
x86 32-Bit-Maschinencodefragment, 1 Byte
Eingabe in EAX, Ausgabe in EAX: 0 für wahr, ungleich Null für falsch. (Lässt auch das ZF-Flag auf true gesetzt, nicht auf false gesetzt, damit Sie es tun können
je was_equal
). Als "Bonus" müssen Sie sich keine Sorgen um die Verpackung machen. 32-Bit x86 kann nur 4 GB Arbeitsspeicher adressieren, sodass Sie M nicht groß genug machen können, um den gesamten Weg zu umschließen und1 == 2**32 + 1
etwas zu finden oder so.Um eine aufrufbare Funktion zu erstellen, fügen Sie eine
0xC3
ret
Anweisung hinzu, nachdem Sie0x48
M-mal wiederholt haben. (Wird in der Gesamtzahl nicht mitgezählt, da viele Sprachen nur den Funktionskörper oder einen Ausdruck wiederholen müssen, um konkurrieren zu können.)Calleable aus GNU C mit dem Prototyp
__attribute__((regparm(1))) int checkeqM(int eax);
GNU C derregparm
x86 Funktionsattribut , wie-mregparm
verwendet EAX die erste Ganzzahl Arg- passieren.Dieses vollständige Programm nimmt beispielsweise 2 Argumente und JITs M Kopien der Anweisung + a
ret
in einen Puffer und ruft sie dann als Funktion auf. (Erfordert einen ausführbaren Heap; Kompilieren mitgcc -O3 -m32 -z execstack
)Nicht-PIE-ausführbare Dateien werden im virtuellen Speicher niedriger geladen. kann ein größeres zusammenhängendes malloc tun.
Beachten Sie, dass GNU C nicht unterstützen Objektgrößen größer als
ptrdiff_t
(32-Bit unterzeichnet), abermalloc
undmemset
immer noch arbeiten, so dass dieses Programm erfolgreich ist .ARM Thumb-Maschinencodefragment, 2 Bytes
Das erste Argument
r0
und der Rückgabewert inr0
sind die Standardkonventionen für ARM-Aufrufe. Dies setzt auch Flags (dass
Suffix). Lustige Tatsache; Die Version ohne Flagssub
ist eine 32-Bit-Anweisung.Die Rückgabeanweisung, die Sie anhängen müssen, lautet
bx lr
.AArch64-Maschinencodefragment, 4 Bytes
Funktioniert für 64-Bit-Ganzzahlen. Eingabe / Ausgabe in
x0
Übereinstimmung mit der Standardaufrufkonvention.int64_t foo(uint64_t);
AArch64 hat (noch) keinen Thumb-Modus, daher ist 1 Befehl das Beste, was wir tun können.
quelle
__builtin___clear_cache
ist nur erforderlich, weil Sie den Speicher ausführen, von dem Sie Daten erhalten habenmalloc
. Wenn Siemmap
stattdessen den Speicher abgerufen haben, findet die Optimierung nicht statt.V , 16 (oder 1) Bytes
Langweilige Antwort:
ein Byte.
Weniger langweilige Antwort:
Probieren Sie es online!
Hexdump:
Ich schrieb dies ungefähr 5 Minuten nachdem die Herausforderung herauskam. Ich brauchte 30 Minuten, um diesen schrecklichen Haufen Spaghetti-Code zu flicken, den ich eine Sprache nenne .
quelle
Perl 5
-p
, 6 BytesProbieren Sie es online!
verwendet
0
für gleichesquelle
-p
Lösung.Brachylog , 2 Bytes
Probieren Sie es online!
quelle
Python 3 , 27 Bytes
Probieren Sie es online!
Code zweimal wiederholt:
Probieren Sie es online!
quelle
Brain-Flak , 24 Bytes
Probieren Sie es online!
Gibt
0
für gleich und etwas anderes für nicht gleich zurück.Wie es funktioniert:
Diese Code-Laufzeiten
n
werdenn * 24
von der Eingabe abgezogen und geben nur dann 0, wenn die Eingabe =n*24
.quelle
Stax , 1 Byte
Probieren Sie es online!
quelle
TI-Basic (Serie 83), 4 Byte
Nimmt Eingaben auf
Ans
: Sie könnten beispielsweise eingeben17:prgmCODEGOLF
, um dies mit einer Eingabe von auszuführen17
. GibtAns
den Wert aus (und zurück ),0
wenn die Eingabe gleich L × M ist , andernfalls einen Wert ungleich Null.Beachten Sie, dass dies
:
Teil des Codes ist. Wenn Sie dies also in den Programmeditor eingeben, sollten Sie dies sehenwenn Sie es einmal eingeben und
wenn Sie es dreimal eingeben.
quelle
Haskell , 12 Bytes
Probieren Sie es online!
Ausgaben
0
für Wahrheiten und einige Ganzzahlen ungleich Null für Falsch.Alternative Lösung, 12 Byte
Probieren Sie es online!
quelle
Befunge-98 , 15 Bytes
Probieren Sie es online!
Probieren Sie es doppelt aus!
Verwendet 0 für gleich und alles andere für ungleich.
Erläuterung:
Dieser Code, der viele Male wiederholt wird, sieht ungefähr so aus:
]
Rechtskurve. Sendet die IP nach unten.>
bewege dich nach Osten. Sendet die IP richtig.f
Drücke eine 16.v
bewege dich nach Süden. Sendet die IP nach unten. Wenn dies das letzte Mal ist, fahren Sie mit Schritt 8 fort.]
Rechtskurve. Sendet die IP links.+
hinzufügen. Fügt die 16 oben im Stapel hinzu.v
bewege dich nach Süden. Sendet die IP nach unten. Weiter zu Schritt 2.<
bewege dich nach Westen. Sende die IP links.#
überspringen. überspringen]
und bis zum Ende umwickeln.+
hinzufügen. Fügt die 16 oben im Stapel hinzu.&
Eingang. Schieben Sie eine Nummer vom Benutzer.-
subtrahieren. Ermitteln Sie die Differenz aus der Summe, an der wir gearbeitet haben, und der Eingabe..
drucken. Drucken Sie das Ergebnis.@
Ende.quelle
Pure Bash , 15
Eingabe als Befehlszeilenparameter. Ausgabe als Shell-Exit-Code -
1
für TRUE und0
für FALSE.quelle
Kohle , 13 Bytes
Probieren Sie es online! Basierend auf meiner Antwort, dass ich die Quelle verdopple, verdoppeln Sie die Ausgabe! Erläuterung:
Verwaltet die Ausgabe
1
für wahr und0
falsch. Nachfolgende Wiederholungen vergleichen den Eingang vor13
,26
,39
,52
etc. , aber jedes Mal die Antwort überdruckt , so dass nur die endgültige Antwort ist zu sehen.quelle
JavaScript ES6, 32 Bytes
wenn wahr ist 0 und falsch wie andere, 31 Bytes
quelle
MIPS, 4 Bytes
Verwendet
$a0
als Argument und Rückgabewert.MIPS, 8 Bytes (unter Verwendung der MIPS-Aufrufkonvention)
x86, 5 Bytes
Dies ist meine erste x86-Antwort. Feedback ist also willkommen. Verwendet die _fastcall-Konvention mit ecx als erstes Argument.
Peter Cordes hat eine 1-Byte-Lösung in den Kommentaren.
Brainfuck-Kommentar : Der schwierige Teil ist, Brainfuck dazu zu bringen, einen einzelnen Wert zurückzugeben. Sonst wäre so etwas einfach.
quelle
sub $4, %al
/mov %al, %dl
. Oder kehren Sie immer noch in AL / EAX zurück und Sie erhalten Dennis 'Lösung mitdec %eax
(1 Byte im 32-Bit-Modus). Und ja, benutzerdefinierte Anrufkonventionen sind für asm in Ordnung. Es ist asm, nicht nur "asm, das von C aus einfach aufzurufen ist"; Realer Code, der in asm geschrieben wurde, verwendet benutzerdefinierte Aufrufkonventionen, wenn dies hilfreich ist. Dies ist also durchaus vertretbar.r0
wobei es sich auch um das Retval handelt. Thumbsub r0, #2
ist also 2 Byte.ret
am Ende des Wiederholungsblocks, bevor Sie sie aufrufen können. Normalerweise beziehe ich die Anzahl derret
in Bytes für meine x86-ASM-Antworten ein. Aber ich denke , die Regeln hier nur die Funktion Biegekörper Sinn macht, sonst viele Sprachen überhaupt nicht konkurrieren können.xchg %eax, %ecx
/sub $4, %al
/xchg %eax, %ecx
4 Bytes ist , und folgt die _fastcall Konvention. Bei der Verwendung von AL sind imm8- und xchg-with-eax-Kurzcodierungen häufig hilfreich für Code-Golf.objdump -drwC -Mintel
, um einen Hexdump der Maschinencode-Bytes zu erhalten.add r32, imm8
ist auch 3 Bytes: Opcode + ModR / M + imm8. Alle Befehle, die eine imm32 annehmen können, haben einen alternativen Opcode, der eine vorzeichenerweiterte imm8 annimmt. Siehe zum Beispiel felixcloutier.com/x86/ADD.html ; Alle "klassischen" ALU-Befehle (aber nicht MOV), die auf 8086 zurückgehen, haben all diese Codierungen, einschließlich der speziellen AL / AX / EAX-Befehle ohne Modr / M, nur op + imm8 / 16/32. Diese Antwort hat BeispieleOktave: 23 Bytes
Wenn N = L * M ist, gibt der Ausdruck
0+i
(dh eine rein imaginäre Zahl) zurück, andernfalls ergibt der Ausdruck eine komplexe Zahl mit einer reellen Komponente.Für ein etwas schöneres Ergebnis auf Kosten eines zusätzlichen Bytes:
Wenn N = L * M, wird der Ausdruck zurückgegeben
-1
, andernfalls eine positive Zahl.Demo:
PS, Sie können das gleiche Ergebnis mit bekommen,
+24;if N==ans;-1;end;ans
aber der bytecount ist der gleichequelle
Lua,
5646 BytesGibt eine 0 (ohne nachfolgende Zeile) aus, wenn sie gleich ist, und entweder nichts oder eine Reihe negativer Zahlen (in einigen Fällen mit vorangestellter Null), wenn sie nicht gleich sind.
Alleine: Online ausprobieren!
Ein paar Mal wiederholt: Probieren Sie es online!
Erläuterung
Bei der ersten Iteration (wenn
a
noch nicht definiert und daher festgelegtnil
) wirda
auf eine Zahl gesetzt, die der Eingabe entnommen wurde, andernfalls auf sich selbst. In beiden Fällen wird dann 46 abgezogena
.Dies wird nur gedruckt,
a
wenn es kleiner als (um Fälle zu berücksichtigen, in denen die Eingabe größer als die Gesamtlänge war) oder gleich Null ist, andernfalls die leere Zeichenfolge.-10 Bytes um sich daran zu erinnern, dass Lua automatisch Umrechnungen zwischen Zahlen und Strings vornimmt. Hoppla.
quelle
JavaScript (ES6), 47 Byte
Dies verwendet die gleiche Technik wie Benoit Esnard in dieser Antwort (von ich verdopple die Quelle, Sie verdoppeln die Ausgabe! ).
Gibt 0 aus, wenn n = 47 * M ist , oder andernfalls einen Wert ungleich Null.
Demo für M = 1
Demo für M = 2
quelle
Brain-Flak , 24 Bytes
Probieren Sie es online!
Subtrahiert einfach 24 von der Eingabe. Ausgänge
0
für wahr und alles andere für falsch.Brain-Flak , 68 Bytes
Probieren Sie es online!
Dieser ist komplexer und gibt
1
für wahr und0
falsch aus.quelle