Ich habe nicht einmal ... ich habe nur ungerade!


36

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 >


10
Ich habe diese Herausforderung abgelehnt, weil es sich um eine "Do X without Y" -Herausforderung handelt.
Undichte Nonne

4
Was genau bedeutet does nothing otherwisedas? In Haskell gibt eine Funktion mit dem Typ Int -> 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?
Laikoni

2
Wenn Sie wissen möchten, ob Sie Ihren Quellcode verwenden können, probieren Sie diese Skripte in Ihrer Browserkonsole aus. Erstellen gültig charset: 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, "=> \";)
kamoroso94

14
@LeakyNun "mache X ohne Y" bezieht sich nicht auf allgemeine Probleme mit eingeschränkten Quellen , sondern auf Probleme, die es dir verbieten, bestimmte Funktionen einer Sprache zu verwenden. Diese Herausforderung ist nicht so und es gibt auch keine der Probleme, die tatsächliche "X ohne Y" -Herausforderungen problematisch machen.
Martin Ender

1
@Laikoni Da es bereits einige Antworten gibt, die in eine Endlosschleife geraten, würde ich sagen, dass es in Ordnung ist, ein solches Verhalten zu zeigen. Nicht zurückkehren kann als Nichtstun interpretiert werden.
M.Herzkamp

Antworten:



67

Sprache , 645529908926937253684695788965635909332404360034079 9394157991500940492270727190763049448735 1174269748937617561533841898064735499551 2293382937520069758100

Das 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.


@Okx Mein Fehler. Aber warum benutzt du nicht einfach ,[<<+>+>-]<[>>+<<-]+>>[-[->]<]<[<[<]>.<]?
user202729

1
Wie wäre es mit ,[[>]++[-<]<+>>]>[<<<.<]nur 3452857532394791089951 Bytes?
Jo King

Da Endlosschleifen erlaubt sind, ,-[-->++<]>+.funktioniert dies auch
Jo King,

20

x86-64-Maschinencode, 8 Byte

Inspiriert von Bruce Fortes Lösung , aber leicht unterdurchschnittlich. :-)

8D 07          lea      eax, [rdi]    ; put copy of input parameter in EAX
D1 EF          shr      edi, 1        ; shift LSB into CF
             InfiniteLoop:
F3 73 FD       rep jnc  InfiniteLoop  ; test CF; infinite loop back here if input was even
C3             ret                    ; return with original input in EAX if it was odd

Ein einzelner ganzzahliger Parameter wird EDIgemäß der Aufrufkonvention von System V AMD64 in das Register aufgenommen.

Eine Kopie dieses Wertes wird anfangs erstellt und dort abgelegt, EAXdamit er gegebenenfalls zurückgegeben werden kann. ( LEAWird anstelle des normalen MOVBefehls verwendet, da ein Befehl mit ungeraden Bytes benötigt wird.)

Dann wird der Wert in EDIum 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 JNCBefehl, 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 (in EAX) wird zurückgegeben.

Es gibt jedoch einen kleinen Trick mit der JNCAnweisung - sie hat ein REPPräfix! Normalerweise werden REPPräfixe nur mit Zeichenfolgenanweisungen verwendet. Da jedoch in den Handbüchern von Intel und AMD die beiden übereinstimmen, dass irrelevante / überflüssige / redundante REPPrä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ürlich REPist es selbst ein Präfix für ungerade Bytes.)

Gott RETsei 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

8D 07         lea   eax, [rdi]   ; put copy of input parameter (EDI) in EAX

B1 F7         mov   cl, 0xf7     ; put 0xF7 into low-order bits of CX
B5 03         mov   ch, 0x03     ; put 0x03 into high-order bits of CX
FE C1         inc   cl           ; increment low-order bits of CX to 0xF8 (so all together it's now 0x3F8)
0F B7 D1      movzx edx, cx      ; move CX to DX ("MOV DX, CX" would have a 16-bit prefix of 0x66)

D1 EF         shr   edi, 1       ; shift LSB of input parameter into CF
73 01         jnc   IsEven       ; test CF: branch if 0 (even), fall through if 1 (odd)
EF            out   dx, eax      ; output EAX (original input) to I/O port 0x3F8 (in DX)
            IsEven:
C3            ret                ; return

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- OUTBefehl 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 codiert OUToder 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 DXRegister (über das CXRegister) oben in der Schleife initialisieren , obwohl dies nur erforderlich ist, wenn der Wert ungerade ist, um sicherzustellen, dass der JNCBefehl einen ungeraden Versatz hat. Da wir jedoch den OUTBefehl ü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. Die EAXFrage ist nur, ob es sich um einen signifikanten Wert oder einen Garbage- Wert handelt. voidDies 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.


+1 für die Erklärung! Warum können Sie mov in der zweiten Zeile verwenden, aber nicht in der ersten?
M.Herzkamp

Zusätzlich zur Kodierung, dass es sich um einen MOVBefehl 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öchte mov eax, edi, wäre , aber das ist 89 F8in Bytes. Siehe Art und Weise mehr , als Sie jemals auf Codierungen wissen wollte hier unter dem „Code“ Abschnitt . @ M.Herzkamp
Cody Grey


9

05AB1E , 3 Bytes

Éi=

Der Code entspricht den Bytewerten C9,69,3Doder 201,105,61sind alle ungerade.

Probieren Sie es online!

Erläuterung

É     # input % 2 == 1
 i    # if true
  =   # print without popping

= # print without newlinedas ist eigentlich mit newline ohne knallen drucken
Erik the Outgolfer

@EriktheOutgolfer: Stimmt. Ich werde die Erklärung reparieren.
Emigna

É×
Scheint

@kalsowerus: Ja, das habe ich auch bemerkt. Funktioniert korrekt mit einem Dvorne, 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.
Emigna

@Emigna, aber das Seltsame ist, die beiden obersten Werte auf dem Stapel zweimal
auszutauschen

5

MATL , 3 Bytes

o?G

MATL verwendet ASCII - Zeichen, so o?Gentspricht Bytes (dezimal) 111, 63, 71.

Probieren Sie es online!

Erläuterung

o     % Push (implicit) input modulo 2
?     % If nonzero
  G   %   Push input
      % End (implicit)
      % Display stack contents (implicit)

5

Haskell , 36 33 Bytes

c[1]=1;c[m]=1+1+c[m-1-1];o	m=c[m]

Probieren Sie es online!

Verbrauch: o 7yiedls 7, o 8betritt eine Endlosschleife.

Der eigentliche Algorithmus ist

o 1 = 1
o m = 2 + o(m-2)

Das erste Problem, mit dem ich konfrontiert war, war der Platzmangel und (weil eine Funktion, odie ein Argument annimmt, mnormalerweise als o m=...oder definiert ist o(m)=.... Ich habe jedoch herausgefunden, dass ein Inline-Kommentar auch {- some comment -}als Token-Trennzeichen fungiert, sodass eine Definition o{--}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). -2ist 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 , cdie auf Listen und Anruf arbeitet cvon odenen hat das richtige Format .


Sie können einen Tabulator anstelle eines Leerzeichens verwenden.
Ørjan Johansen

@ ØrjanJohansen Ich kann bestätigen , dass es mit arbeitet \tstatt {--}.
Esolanging Fruit

@ ØrjanJohansen Danke, das ist gut zu wissen.
Laikoni

5

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).

'%s'%[['']+[_]][-1][[_%[1+1][-1]][-1]]

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, keine eval, keine printund 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.


Ein dickes Lob. Als Bonus funktioniert es auch für Ruby IRB :) Nitpick: Ist es in Ordnung, eine Zeichenfolge für ungerade Zahlen zurückzugeben, ist es in Ordnung, eine leere Zeichenfolge für gerade Zahlen zurückzugeben?
Eric Duminil

Ich denke, nichts zu tun und nichts zu drucken oder zurückzugeben ist dasselbe. In gewisser Weise ist leere Zeichenfolge nichts.
mbomb007

Ja, ich war wirklich pingelig. Es wird immer noch eine Zeichenfolge anstelle von nichts zurückgegeben. In Python REPL würde ich sagen, dass Nonedies noch besser passt als ''. Jedenfalls ist das immer noch 10000-mal besser als alles, was ich mir vorstellen könnte.
Eric Duminil

@EricDuminil Ich könnte zurückkehren False. Idk, wie Sie bekommen könnten None, obwohl.
mbomb007

4

CJam, 6 Bytes

q_iY%%

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


Nett! Ich wollte posten qi_Y%]W%{}/M?und dann habe ich das gesehen.
Esolanging Fruit

4

Cubix , 23 19 17 Bytes

;;u!I1)%/;O=!;;/;

Versuch 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:

    ; ;
    u !
I 1 ) % / ; O =
! ; ; / ; . . .
    . .
    . .

Algorithmus:

  • I (73) : Eingabe als Nummer einlesen
  • 1 (49) : 1 drücken
  • ) (41) : Zuwachs
  • % (37) : nimm den mod
  • / (47) : Biegen Sie links ab
  • ! (33) : Nächste Anweisung überspringen, wenn ungerade
    • 1;;/; ;is (59): Bereitet den Stack für die Ausgabe vor
    • O (79) : Ausgabe als Zahl.
    • Anschließend wird der Algorithmus erneut eingegeben, es wird jedoch Iein 0für das Ende der Eingabe gelesen , sodass die Eingabe des geraden Zweigs garantiert ist
  • u (117) : Kehrtwende rechts
  • ;;;!I : Schleife, effektiv nichts zu tun.

@ MickyT, das für negative Eingabe fehlschlägt, weshalb ich vermieden habe?
Giuseppe

Entschuldigung, ich habe es nicht richtig überprüft
MickyT

3

Kohle , 9 Bytes

¿﹪Iθ÷χ⁵→θ

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:

  • ¿: Code BF.
  • : Code A5.
  • : Code C9.
  • θ: Code F1.
  • ÷: Code AF.
  • χ: Code E3.
  • : Code B5.
  • : Code 13.

Tatsächlich ist das nahe Ende überflüssig, aber dann sah ich, dass die Antwort eine ungerade Länge haben musste ...

Erläuterung:

¿      if (
 ﹪      Modulo (
  Iθ      the input as number,
  ÷χ⁵      χ (predefined value: 10) divided by 5 = 2 ) [is 1])
 →θ      then print rightwards the input as string

Sie drucken und bewegen sich dann nach rechts. Druck nach rechts wäre eigentlich →θ.
Neil

@Neil oops, behoben. Zumindest hat das meine Antwort nicht ungültig gemacht ... :-D
Charlie

3

x86_64-Computercode (Linux), 12 bis 11 Byte

Leider 0x80ist gerade, aber es hat trotzdem geklappt (vorausgesetzt, "tut nichts" bedeutet, nicht zurückzukehren):

0000000000000000 <odd>:
   0:   8d 07                   lea  (%rdi), %eax
   2:   83 e7 01                and    $0x1, %edi
   5:   83 ff 01                cmp    $0x1, %edi
   8:   75 fb                   jne       5  <odd+0x5>
   a:   c3                      retq

-1 Byte, danke @CodyGray!

Probieren Sie es online!


1
Da dies x86-64 ist, ist lea (%edi),%eaxein 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 tun lea (%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.)
Cody Gray

Eine wirklich clevere Lösung für TIO! Ich habe es in den meisten meiner ASM-Antworten übersprungen, weil ich nicht die gesamte Kesselplatte in die "Fußzeile" schreiben wollte, um die Ausgabe in ASM zu drucken. Ich bin letztens zusammengebrochen und habe es getan, aber das ist eine viel bessere Idee, denn Sie können C für alles andere verwenden. Ich werde das von jetzt an stehlen! :-)
Cody Grey

Ein Hoch auf Ihre Beiträge, ich bin ein absoluter Neuling bei der Montage, aber das schien einfach zu sein! Neugierig auf Ihre Lösung. Oh, das geht an @ceilingcat - ich habe es mir selbst gestohlen;)
ბიმო

Ich habe dir eigentlich kein Byte gespeichert ... Was du jetzt hast, hat ein gerades Byte ( F6) für den JNEBefehl, 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, OUTum 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.
Cody Grey

Dies ist eine ziemlich dumme Herausforderung, da keine der vernünftigen Lösungen funktioniert. Es wird nur getestet, wie gut Sie die dunklen Ecken des x86-Befehlssatzes kennen. Ich habe sogar die BTAnweisungsfamilie 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.
Cody Grey

3

Mathematica, 20 Bytes

Scheinen Sie die erste Lösung zu sein, wenn Sie nicht Golf spielen.

a=1+1;g[i_/;!a\[Divides]i]=i

In MacintoshChineseTraditionalZeichenkodierung. \[Divides]ist {161, 253}(2 Bytes)

Alternative Version (23 Bytes)

\[CapitalAlpha]=1+1;\[CapitalGamma][\[CapitalChi]_/;\[CapitalAlpha]\[LeftFloor]\[CapitalChi]/\[CapitalAlpha]\[RightFloor]\[NotEqual]\[CapitalChi]]=\[CapitalChi]

oder (in Unicode gezeigt)

Α=1+1;Γ[Χ_/;Α⌊Χ/Α⌋≠Χ]=Χ

in SymbolZeichenkodierung. (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.


+1 Byte ( ;am Ende), wenn die Anzahl der Bytes gerade sein muss; und \[Divides]haben auch ungerade Unicode-Codepunkt.
user202729

Sie brauchen nicht 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 erhalten 2aus \[LeftFloor]E\[RightFloor].
Martin Ender

@MartinEnder Nur SymbolBoden gültig machen, aber es hat weder Enoch \[ExponentialE].
user202729

Ich fürchte, Sie dürfen die Zeichen nicht verwenden D. v; noch d, da sie einen geraden Byte-Wert haben .. :(
Kevin Cruijssen

1
@KevinCruijssen \[Divides]ist ein einzelnes Zeichen in Mathematica, das durch 2 Bytes dargestellt wird {161, 253}.
user202729

3

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!

s//A_=Y[;A_=A_%O?A_W''/;y/#A-_/#-A/;s/[#-}]+/uc/ee;say

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 $_mit A_=Y[;A_=A_%O?A_W'', dann y/#A-_/#-A/Zeichen ersetzt , basierend auf der folgenden Liste (char oben wird char unten):

#ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
#$%&'()*+,-./0123456789:;<=>?@A

welche updates $_enthalten sein sollen $_=<>;$_=$_%2?$_:''. Als nächstes werden s/[#-}]+/uc/eealle Zeichen [#-}]+durch ersetzt uc. Ohne das /eewäre dies nur der String uc, /eewertet aber den Inhalt des Strings zweimal aus. Die erste Auswertung gibt das Ergebnis von zurück uc, das eine Großbuchstabenversion von ist. $_Da es jedoch $_keine alphabetischen Zeichen enthält, wird nur die gesamte Zeichenfolge zurückgegeben. Die zweite /eAuswertung 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 wir say(was erfordert, -Eanstatt -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.

s//_/g;s//uc/e;y/\x09-\x0b/_/;s/____/}[/;s/___/%C]/;s/_/{''H/;y/'{}1CDGH/'-)1-3+--/;s/[#-}]+/uc/ee

Enthält eine Registerkarte und eine vertikale Registerkarte in der y///als \x09und gekennzeichneten \x0b.

Probieren Sie es online!


2

LOGO , 390 46 52 50 Bytes

[ask    1   se[make]iseq    1-3 cos ?/ask   1[1/sum 1   179]?]

Dies ist eine Vorlagenliste, die die Eingabe zurückgibt, wenn die Eingabe ungerade ist, und einen Fehler verursacht, wenn die Eingabe gerade ist.

Verwendung:

show invoke [ask ... (paste code here) ... ] 5

Ausgabe

5

da 5 ungerade ist, und

invoke [ask ... (paste code here) ... ] 6

verursacht einen Fehler, weil 6 gerade ist.



2

TI-BASIC, 14 Bytes

Input Q
sinֿ¹(gcd(Q²,int(e
Q

Dadurch wird ein Domänenfehler (es wird nichts auf den Homescreen gedruckt) auf einer geraden Zahl ausgegeben.

Input Q             Q is a variable with an odd code. We cannot use "Ans" as it's even.

            int(e   floor(e) = 2; "2" is even.
         Q²         Q may be negative, so we square it which preserves parity.
     gcd(Q²,int(e   1 if Q is odd; 2 if Q is even.
sinֿ¹(gcd(Q²,int(e   Error iff Q is even.

Q                   If there was no error, print Q.

1

Pyth , 14 11 10 9 Bytes

I + Q_ + K / Q + 3_1KQ 
I! SIcQ + 3_1Q 
I! U + 1_GQ1Q
u + 1_GQ1k

Testsuite .


Das ist ein kluger Weg, aber sollte sowas nicht I%Qy1Qauch funktionieren?
Jakube

@Jakube habe ich eindeutig nicht herausgefunden y1... Allerdings %ist das leider nicht erlaubt.
Undichte Nonne

Warum nicht? %Hat den ASCII-Wert 37 und ist ungerade.
Jakube

3
@ Jakube, weil anscheinend vertraute ich in dieser Liste die OP zur Verfügung gestellt (was falsch ist)
Leaky Nun

1

Japt , 4 Bytes

u)çU

Japt verwendet ISO / IEC 8859-1 , dies entspricht also (in Dezimalzahl) 117 41 231 85.

Online testen!

Erläuterung

Uu)çU   Implicit: U = input integer
Uu)     Return Python-style U % (missing argument = 2). This gives 1 if U is odd, 0 if even.
   çU   Implicitly convert U to a string and repeat it that many times.
        Implicit: output result of last expression

Ich habe zuerst versucht Lösungen zu verwenden p, was im Grunde genommen çmit umgekehrten Argumenten ist. Führt jedoch peine 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.


1

Gleichstrom , 21 Bytes

[c]sa?kKKCI-1;1k%1!=a

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 fDebug-Befehls am Ende des Programms bestätigt werden, wie dies auf der TIO-Seite der Fall ist.

Probieren Sie es online!

Erläuterung

[    # Begin macro definition.
 c   # Clear the main stack.
]sa  # End macro definition and push the macro into register "a".
?k   # Prompt for input and store it into precision parameter "k".
KK   # Push two copies of the input to the main stack.
CI-  # Push C-I = 12-10 = 2 to the main stack  
1;1  # Push the value stored in the first index of array "1" (0 by default) 
     # to the main stack. 
k    # Push 0 into parameter "k" to reset the precision (otherwise the modulus 
     # function will not work correctly).
%    # Push the input (mod 2) to the main stack.
1!=a # If the input (mod 2) does not equal 1, execute the macro in register "a".
f    # OPTIONAL: Output the contents of the main stack.

1

TI-Basic, 18 Bytes

2 Bytes dank Lirtosiast gespeichert

:Prompt Q
:While 5Q/ᴇ1-int(5Q/ᴇ1
:Q

in Bytes (+2 Newlines = 3F)

:Prompt Q
 DD     51
:While 5Q/ᴇ1-int(5Q/ᴇ1
 D1    35 3B B1  35 3B  
        51 31     51 31
         83 71     83
:Q
 51

Siehe http://tibasicdev.wikidot.com/one-byte-tokens


1
Warum nicht fPart (?
Lirtosiast

@lirtosiast scheint laut tibasicdev.wikidot.com/one-byte-tokens
Oki

Oh, ich habe falsch verstanden, welche Einträge Zeilen und welche Spalten waren.
Lirtosiast

1
Ich fand Input Q[newline]sinֿ¹(gcd(Q²,int(e[newline]Q(14 Bytes). Darf ich als separate Antwort posten?
Lirtosiast

@ Lirtosiast Wow! Es ist definitiv anders genug für eine separate Antwort.
Ich


0

Bash , 31 Bytes

read a
[ $[a%2] = 0 ] ||echo $a

Probieren Sie es online!

Erläuterung:

read a                   reading the input and define it on the variable a
[ $[a%2] = 0 ]      outputs exit status 0 when a/2 is 0 and exit status 1 if not.
||                           evaluates only when the exit status left of it is 1
echo $a                displays the variable a

Sie haben anscheinend übersehen, dass dies eine eingeschränkte Quell-Herausforderung ist - Sie verwenden verbotene Bytes. ( rd $20|hund newline.)
Ørjan Johansen

@ ØrjanJohansen behoben, denke ich
ADDB

2
Um nein. Die Länge des Programms ist nicht beschränkt, aber jedes Zeichen muss einen ungeraden Bytewert haben.
Ørjan Johansen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.