Ihre Aufgabe ist einfach: Schreiben Sie ein Programm, das eine Ganzzahl als Eingabe empfängt und diese ausgibt, wenn sie ungerade war, und nichts anderes tut (Anhalten ist nicht zulässig). Die Herausforderung besteht darin, dass Sie nur ungerade Bytes verwenden können.
Optional können Sie der Ausgabe eine nachgestellte Newline hinzufügen.
Dies ist Code-Golf, die kürzeste Antwort in (ungeraden) Bytes gewinnt.
Standardlücken sind verboten. Darüber hinaus können Sie keine Sprachversionen verwenden, die neuer sind als das Versenden dieser Herausforderung.
Beispiel Eingabe> Ausgabe:
13
> 13
42
>
code-golf
restricted-source
M.Herzkamp
quelle
quelle
does nothing otherwise
das? In Haskell gibt eine Funktion mit dem TypInt -> Int
entweder eine Ganzzahl zurück oder hält nicht an oder löst einen Fehler aus. Wenn die Eingabe gerade ist, sollte sie offensichtlich nicht zurückgegeben werden. Wäre es in diesem Fall nicht akzeptabel, einen Fehler anzuhalten oder auszulösen?alphabet=new Set(Array(256).fill(0).map((v,i)=>i).filter(v=>v%2).map(String.fromCharCode));
. Überprüfen Sie, ob Quelle gilt:[..."SOURCE CODE"].every(v=>alphabet.has(v))
. Siehe ungültige Zeichen in Quelle:[...new Set("SOURCE CODE")].filter(v=>!alphabet.has(v))
. Denken Sie daran, Ihre Anführungszeichen zu entkommen,"
=>\"
;)Antworten:
Japt
-f
, 1 Byteu
hat einen Zeichencode-Wert von117
.Versuch es
quelle
Sprache ,
645529908926937253684695788965635909332404360034079939415799150094049227072719076304944873511742697489376175615338418980647354995512293382937520069758100Das entspricht ungefähr 2 Duodezillionen Bytes.
Die Datei wird in das folgende Brainfuck-Programm übersetzt:
Nimmt Eingaben als ASCII-Code mit einem Maximalwert von 256 an. Verwendet Umbruch.
quelle
,[<<+>+>-]<[>>+<<-]+>>[-[->]<]<[<[<]>.<]
?,[[>]++[-<]<+>>]>[<<<.<]
nur 3452857532394791089951 Bytes?,-[-->++<]>+.
funktioniert dies auchx86-64-Maschinencode, 8 Byte
Inspiriert von Bruce Fortes Lösung , aber leicht unterdurchschnittlich. :-)
Ein einzelner ganzzahliger Parameter wird
EDI
gemäß der Aufrufkonvention von System V AMD64 in das Register aufgenommen.Eine Kopie dieses Wertes wird anfangs erstellt und dort abgelegt,
EAX
damit er gegebenenfalls zurückgegeben werden kann. (LEA
Wird anstelle des normalenMOV
Befehls verwendet, da ein Befehl mit ungeraden Bytes benötigt wird.)Dann wird der Wert in
EDI
um 1 nach rechts verschoben, wodurch das verschobene Bit in das Übertragsflag (CF) gesetzt wird. Dieses Bit ist 0, wenn die Zahl gerade war, oder 1, wenn sie ungerade war.Wir testen dann CF mit dem
JNC
Befehl, der nur verzweigt, wenn CF 0 ist (dh die Zahl war gerade). Dies bedeutet, dass wir für gerade Werte in eine Endlosschleife gehen. Bei ungeraden Werten fallen wir durch und der ursprüngliche Wert (inEAX
) wird zurückgegeben.Es gibt jedoch einen kleinen Trick mit der
JNC
Anweisung - sie hat einREP
Präfix! Normalerweise werdenREP
Präfixe nur mit Zeichenfolgenanweisungen verwendet. Da jedoch in den Handbüchern von Intel und AMD die beiden übereinstimmen, dass irrelevante / überflüssige / redundanteREP
Präfixe ignoriert werden, setzen wir hier einen in die Verzweigungsanweisung, um eine Länge von 3 Byte zu erzielen. Auf diese Weise ist auch der relative Versatz, der in der Sprunganweisung codiert wird, ungerade. (Und natürlichREP
ist es selbst ein Präfix für ungerade Bytes.)Gott
RET
sei Dank wird mit einem ungeraden Byte verschlüsselt!Probieren Sie es online!
Für den Fall, dass Sie nicht glauben, den Wert zurückzugeben, wenn er ungerade ist, oder in eine Endlosschleife zu gehen, wenn er gerade ist (so dass Sie nie zurückkehren), um die "Ausgabe" -Anforderungen der Herausforderung zu erfüllen, oder wenn Sie nur etwas Interessanteres wollen, hier eine Funktion das gibt den Wert an eine serielle Schnittstelle aus (aber natürlich nur, wenn es ungerade ist).
x86-64-Maschinencode (Ausgabe an serielle Schnittstelle), 17 Byte
Was dies ein bisschen interessanter macht, ist, dass der Code mehr kann , was bedeutet, dass es schwieriger war, alles mit Befehlen zu machen, die nur mit ungeraden Bytes codiert sind. Das bedeutet natürlich auch, dass es beim Codegolf versagt. Es ist also eine Art Kompromiss - möchten Sie interessant und herausfordernd sein, oder möchten Sie sich kurz fassen?
In jedem Fall wird der x86-
OUT
Befehl verwendet , um auf den E / A-Port 0x3F8 zu schreiben, der der standardmäßige serielle COM1-Port eines PCs ist. Der lustige Teil ist natürlich, dass alle Standard-E / A-Ports (seriell und parallel) gerade Adressen haben, sodass sie nicht einfach als Direktbefehle codiertOUT
oder direkt in ein Register verschoben werden können. Sie haben mit einer weniger als dem tatsächlichen Wert zu initialisieren, und dann erhöhen Sie den Wert in dem Register. Sie können auch nur bestimmte Register für die Manipulation verwenden, da Sie Register benötigen, die mit ungeraden Bytes in der Anweisung codiert sind, wenn sie als Operanden verwendet werden.Außerdem musste ich das
DX
Register (über dasCX
Register) oben in der Schleife initialisieren , obwohl dies nur erforderlich ist, wenn der Wert ungerade ist, um sicherzustellen, dass derJNC
Befehl einen ungeraden Versatz hat. Da wir jedoch denOUT
Befehl überspringen , führt dieser Code nur zu Verschwendung von Zyklen und Registern zum Löschen von Daten. es nicht wirklich Ausgabe nichts, so dass er die Regeln nicht brechen.Schließlich kehrt diese Funktion mit dem in belassenen Eingabewert zurück (nachdem die Ausgabe an die serielle Schnittstelle durchgeführt wurde oder nicht)
EAX
. Aber das verstößt eigentlich nicht gegen Regeln; Alle Funktionen in der Assemblersprache werden mit einem Wert in zurückgegeben. DieEAX
Frage ist nur, ob es sich um einen signifikanten Wert oder einen Garbage- Wert handelt.void
Dies wird durch die Dokumentation der Funktion bestimmt (gibt sie im Wesentlichen einen Wert zurück oder gibt sie einen Wert zurück ), und in diesem Fall dokumentiere ich, dass sie keinen Wert zurückgibt. :-)Keine TIO-Verbindung für diese, da keine Ausgabe an serielle Schnittstellen implementiert wird. Du brauchst echtes Eisen oder eine Fantasie.
quelle
MOV
Befehl handelt, müssen seine Operanden auch in den Bytes kodiert werden. In diesem Fall wären dies die Quell- und Zielregister (obwohl Operanden auch unmittelbare Werte sein können, die wie Konstanten aussehen). Verschiedene Register werden auf verschiedene Bytes abgebildet, und einige dieser Bytes sind gerade. Also, was ich zum Beispiel verwenden möchtemov eax, edi
, wäre , aber das ist89 F8
in Bytes. Siehe Art und Weise mehr , als Sie jemals auf Codierungen wissen wollte hier unter dem „Code“ Abschnitt . @ M.HerzkampGelee , 2 Bytes
Diese Zeichen entsprechen den Bytes 0xF7 und 0xBF in Jellys Codepage .
Probieren Sie es online!
quelle
05AB1E , 3 Bytes
Der Code entspricht den Bytewerten
C9,69,3D
oder201,105,61
sind alle ungerade.Probieren Sie es online!
Erläuterung
quelle
= # print without newline
das ist eigentlich mit newline ohne knallen druckenÉ×
D
vorne, aber das ist eben und nicht kürzer. Der Grund, warum es nicht funktioniert, ist, dass die wiederholte implizite Eingabe als zweites Argument verwendet wird.MATL , 3 Bytes
MATL verwendet ASCII - Zeichen, so
o?G
entspricht Bytes (dezimal)111
,63
,71
.Probieren Sie es online!
Erläuterung
quelle
Haskell ,
3633 BytesProbieren Sie es online!
Verbrauch:
o 7
yiedls7
,o 8
betritt eine Endlosschleife.Der eigentliche Algorithmus ist
Das erste Problem, mit dem ich konfrontiert war, war der Platzmangel und
(
weil eine Funktion,o
die ein Argument annimmt,m
normalerweise also m=...
oder definiert isto(m)=...
. Ich habe jedoch herausgefunden, dass ein Inline-Kommentar auch{- some comment -}
als Token-Trennzeichen fungiert, sodass eine Definitiono{--}m=...
unter den angegebenen Regeln möglich ist. Edit: Ørjan Johansen wies darauf hin, dass man anstelle eines Leerzeichens ein Tabulatorzeichen verwenden kann, wodurch drei Bytes eingespart werden:o m=...
Das zweite Problem war der rekursive Aufruf
o(m-2)
.-2
ist gerade-1-1
, aber hier funktioniert der Kommentar-Trick nicht, weil die Klammern erforderlich sind. Ich habe dies auf einer Singleton Liste , indem man die Funktion der Arbeit fixierte mit einer Zahl:o[m-2]
aber, wie dies der Bereitstellung Eingabe keine Standardmethode ist, dass ich die Berechnung auf eine Hilfsfunktion ausgelagert ,c
die auf Listen und Anruf arbeitetc
vono
denen hat das richtige Format .quelle
\t
statt{--}
.Python REPL, 38 Bytes
Übernimmt die Eingabe als Wert des vorherigen Ausdrucks mit
_
. Die Ausgabe erfolgt als Zeichenfolge (die Zeichenfolgendarstellung der Ganzzahl für ungerade oder die leere Zeichenfolge für gerade).Probieren Sie es online aus
Um es in einer tatsächlichen Shell auszuführen, können Sie es hier ausprobieren . Geben Sie die Eingabe ein und drücken Sie die Eingabetaste. Fügen Sie den Code ein und drücken Sie die Eingabetaste.
Erläuterung:
Es dauerte eine Weile, bis ich es herausgefunden hatte. Es gibt keine Multiplikation, keine Verzweigung, kein Schneiden, keine Kommas, keine Punkte, keine Importe, keine Klammern, keine
exec
, keineeval
, keineprint
und keine Funktionen. Ich habe eine Lösung gefunden, die diese Ausgabe mit stderr ausführt, aber dann wurde mir klar, dass wir die tatsächliche Ganzzahl ausgeben müssen, nicht nur einen Wahrheitswert.Ich verwende Klammern anstelle von Klammern mit
[expression][-1]
. Wenn Sie dies vereinfachen, wird der obige Code zu'%s'%(['']+[_])[_%(1+1)]
.Da es keine Kommas geben kann, habe ich list add zum erstellen verwendet
['',_]
. Bei Verwendung der Zeichenfolgenformatierung wird das gewünschte Ergebnis erzielt.quelle
None
dies noch besser passt als''
. Jedenfalls ist das immer noch 10000-mal besser als alles, was ich mir vorstellen könnte.False
. Idk, wie Sie bekommen könntenNone
, obwohl.CJam, 6 Bytes
113
95
105
89
37
37
Dieses Programm nimmt die Mod 2 der Eingabe (nennt sie r ) und druckt jedes r- te Zeichen in der Eingabezeichenfolge. Wenn die eingegebene Nummer ungerade ist, wird die gesamte Zeichenfolge gedruckt. Wenn Sie jedoch aufgefordert werden, jedes 0. Zeichen zu drucken, gibt das Programm einen Fehler aus.
Probieren Sie es hier aus
quelle
qi_Y%]W%{}/M?
und dann habe ich das gesehen.Cubix ,
231917 BytesVersuch es!
@
, die ein Cubix-Programm beendet, ist ascii 64, und so gelangt dieses Programm nach dem Testen auf Seltsamkeit leider nur in eine Endlosschleife. Keine TIO-Verbindung, da das Zeitlimit überschritten wird.=
(ascii 61) ist ein No-Op in Cubix.Dies ist eine geringfügige Änderung des vorherigen Algorithmus (gleiche Anzahl von Bytes), die tatsächlich für negative Ganzzahlen funktioniert.
Cube-Version:
Algorithmus:
I
(73)
: Eingabe als Nummer einlesen1
(49)
: 1 drücken)
(41)
: Zuwachs%
(37)
: nimm den mod/
(47)
: Biegen Sie links ab!
(33)
: Nächste Anweisung überspringen, wenn ungerade1;;/;
;
is(59)
: Bereitet den Stack für die Ausgabe vorO
(79)
: Ausgabe als Zahl.I
ein0
für das Ende der Eingabe gelesen , sodass die Eingabe des geraden Zweigs garantiert istu
(117)
: Kehrtwende rechts;;;!I
: Schleife, effektiv nichts zu tun.quelle
?
Kohle , 9 Bytes
Probieren Sie es online!
Grundsätzlich wird die Eingabe nach rechts gedruckt, wenn es sich nicht um ein Vielfaches von 10/5 handelt (das
²
Zeichen befindet sich sogar in der Charcoal-Codepage ). Die verwendeten Zeichen sind:¿
: CodeBF
.﹪
: CodeA5
.I
: CodeC9
.θ
: CodeF1
.÷
: CodeAF
.χ
: CodeE3
.⁵
: CodeB5
.→
: Code13
.Tatsächlich ist das
→
nahe Ende überflüssig, aber dann sah ich, dass die Antwort eine ungerade Länge haben musste ...Erläuterung:
quelle
→θ
.x86_64-Computercode (Linux),
12 bis11 ByteLeider
0x80
ist gerade, aber es hat trotzdem geklappt (vorausgesetzt, "tut nichts" bedeutet, nicht zurückzukehren):-1 Byte, danke @CodyGray!
Probieren Sie es online!
quelle
lea (%edi),%eax
ein Präfix (0x67
) zum Überschreiben der Adressgröße erforderlich, wenn es sich bei der Quelle um ein 32-Bit-Register handelt. Sie können das beseitigen, indem Sie tunlea (%rdi),%eax
. Das spart ein Byte und würde den Code ein wenig effizienter machen (Präfixe verlangsamen die Dekodierung und füllen den i-Cache). Es gibt einige andere Dinge, die Sie tun können, um dies noch weiter zu verkürzen, aber dies stellt im Wesentlichen eine vollständige Umschreibung dar, sodass ich meine eigene Antwort veröffentlichen werde. :-) Das habe ich natürlich auch positiv bewertet! (Oh, ich habe gerade bemerkt, dass Sie möglicherweise das Präfix verwendet haben, um den Sprungoffset ungerade zu machen. Nun, Sie brauchen mehr Magie.)F6
) für denJNE
Befehl, weil es einen geraden Versatz hat. Das habe ich mit der letzten Klammer gemeint, die ich in meinen ersten Kommentar eingefügt habe. Sie benötigen dieses Präfix tatsächlich , um eine ungerade Ausrichtung zu erstellen. Oder Sie müssen den Code auf eine andere Weise umschreiben. Ich habe mit verschiedenen Variationen gespielt. Ich habe mir diese letzte Nacht tatsächlich angesehen und versucht, einen guten Weg zu finden,OUT
um ungerade Werte auszugeben, aber mir sind wirklich keine guten Lösungen eingefallen. Die Einsicht hier ist für mich, in eine Endlosschleife für gerade Werte zu gehen.BT
Anweisungsfamilie ausprobiert , die niemand jemals benutzt hat (leider sind alle Registerkodierungen sogar Bytes). Ich dachte, es wäre interessanter , Code zu schreiben, der an eine serielle Schnittstelle ausgegeben wird, als nur einen Wert oder was auch immer zurückzugeben, aber das erhöht die Byte-Zählung (zumal die Adressen der seriellen Schnittstellen in hexadezimaler Schreibweise gerade sind!), Also ich gab es auf.Mathematica, 20 Bytes
Scheinen Sie die erste Lösung zu sein, wenn Sie nicht Golf spielen.
In
MacintoshChineseTraditional
Zeichenkodierung.\[Divides]
ist{161, 253}
(2 Bytes)Alternative Version (23 Bytes)
oder (in Unicode gezeigt)
in
Symbol
Zeichenkodierung. (Verwenden Sie nur 1-Byte-Zeichen.)Die Lösung definiert eine Funktion
g
(oderΓ
), die als Eingabe ausgewertet wird, wenn die Eingabe ungerade ist, und wörtlich "nichts tun" (nicht ausgewertet wird), wenn die Eingabe gerade ist.quelle
;
am Ende), wenn die Anzahl der Bytes gerade sein muss; und\[Divides]
haben auch ungerade Unicode-Codepunkt.I[1+1]
, Sie können nur verwenden{1+1}
. Haben Sie auch geprüft, ob die Bytes der Bodenklammern gültig sind? Wenn ja, können Sie erhalten2
aus\[LeftFloor]E\[RightFloor]
.Symbol
Boden gültig machen, aber es hat wederE
noch\[ExponentialE]
.D
.v
; nochd
, da sie einen geraden Byte-Wert haben .. :(\[Divides]
ist ein einzelnes Zeichen in Mathematica, das durch 2 Bytes dargestellt wird{161, 253}
.Perl, 54 Bytes
Benötigt
-E
.Ich habe diese Herausforderung wirklich sehr genossen, ich denke, ich würde gerne versuchen, diese Antwort zu verbessern, aber ich denke, das ist vielleicht die kürzeste, die ich jetzt machen kann. Ich spiele jetzt seit ein paar Tagen mit diesen Antworten, bin aber mit der 54-Byte-Lösung zufrieden!
Probieren Sie es online!
Erläuterung
Standardmäßig funktionieren die meisten String-Funktionen von Perl
$_
, die zu Beginn leer sind.Zuerst
s//A_=Y[;A_=A_%O?A_W''/
ersetzt die leere Zeichenkette in$_
mitA_=Y[;A_=A_%O?A_W''
, danny/#A-_/#-A/
Zeichen ersetzt , basierend auf der folgenden Liste (char oben wird char unten):welche updates
$_
enthalten sein sollen$_=<>;$_=$_%2?$_:''
. Als nächstes werdens/[#-}]+/uc/ee
alle Zeichen[#-}]+
durch ersetztuc
. Ohne das/ee
wäre dies nur der Stringuc
,/ee
wertet aber den Inhalt des Strings zweimal aus. Die erste Auswertung gibt das Ergebnis von zurückuc
, das eine Großbuchstabenversion von ist.$_
Da es jedoch$_
keine alphabetischen Zeichen enthält, wird nur die gesamte Zeichenfolge zurückgegeben. Die zweite/e
Auswertung wertet die Zeichenfolge erneut aus, wobei$_
entweder$_
(die Eingabenummer) oder''
abhängig davon, ob oder festgelegt wird Nicht die Zahl ist ungerade oder gerade.Schließlich, da
$_
jetzt enthält, was wir wollen, nennen wirsay
(was erfordert,-E
anstatt-e
), welche Drucke$_
gefolgt von einer neuen Zeile.Alternatives Perl, 93 Bytes
92 Bytes Code + 1 für
-p
, was meiner Meinung nach nicht konkurrierend machen würde.Enthält eine Registerkarte und eine vertikale Registerkarte in der
y///
als\x09
und gekennzeichneten\x0b
.Probieren Sie es online!
quelle
LOGO ,
390465250 BytesDies ist eine Vorlagenliste, die die Eingabe zurückgibt, wenn die Eingabe ungerade ist, und einen Fehler verursacht, wenn die Eingabe gerade ist.
Verwendung:
Ausgabe
da 5 ungerade ist, und
verursacht einen Fehler, weil 6 gerade ist.
quelle
TI-BASIC, 14 Bytes
Dadurch wird ein Domänenfehler (es wird nichts auf den Homescreen gedruckt) auf einer geraden Zahl ausgegeben.
quelle
Pyth ,
1411109 BytesTestsuite .
quelle
I%Qy1Q
auch funktionieren?y1
... Allerdings%
ist das leider nicht erlaubt.%
Hat den ASCII-Wert 37 und ist ungerade.Japt , 4 Bytes
Japt verwendet ISO / IEC 8859-1 , dies entspricht also (in Dezimalzahl)
117 41 231 85
.Online testen!
Erläuterung
Ich habe zuerst versucht Lösungen zu verwenden
p
, was im Grunde genommenç
mit umgekehrten Argumenten ist. Führt jedochp
eine Potenzierung durch, wenn das linke Argument eine Zahl ist, sodass wir es explizit in eine Zeichenfolge konvertieren müssen. Diese Lösung ist tatsächlich ein Byte kürzer und enthält keine ungeraden Bytes.quelle
Gleichstrom , 21 Bytes
Dezimal:
91 99 93 115 97 63 107 75 75 67 73 45 49 59 49 107 37 49 33 61 97
Gemäß dieser E / A-Standardeinstellung belässt dieses Programm die Eingabe auf dem Hauptstapel, wenn sie ungerade ist, und leert den Stapel ansonsten. Dies kann durch Hinzufügen des
f
Debug-Befehls am Ende des Programms bestätigt werden, wie dies auf der TIO-Seite der Fall ist.Probieren Sie es online!
Erläuterung
quelle
TI-Basic, 18 Bytes
2 Bytes dank Lirtosiast gespeichert
in Bytes (+2 Newlines = 3F)
Siehe http://tibasicdev.wikidot.com/one-byte-tokens
quelle
Input Q[newline]sinֿ¹(gcd(Q²,int(e[newline]Q
(14 Bytes). Darf ich als separate Antwort posten?MathGolf , 3 Bytes
Probieren Sie es online!
Die verwendeten Bytes sind
157, 123, 107
.Erläuterung
quelle
Bash , 31 Bytes
Probieren Sie es online!
Erläuterung:
quelle
rd $20|h
und newline.)