Ich kehre den Quellcode um, du negierst die Eingabe!


36

Eklatante Abzocke einer Abzocke . Geht und stimmt denen zu!

Ihre Aufgabe ist es, ein Programm / eine Funktion zu schreiben, das / die seine ganzzahligen Eingaben / Argumente ausgibt / zurückgibt, wenn Sie dies akzeptieren möchten. Der schwierige Teil ist, dass, wenn ich Ihren Quellcode umkehre, die Ausgabe die ursprüngliche Ganzzahl sein muss, die negiert wird.

Beispiele

Nehmen wir an, Ihr Quellcode ist ABCund seine Eingabe ist 4. Wenn ich CBAstattdessen schreibe und es laufen lasse, muss die Ausgabe sein -4.

Nehmen wir an, Ihr Quellcode ist ABCund seine Eingabe ist -2. Wenn ich CBAstattdessen schreibe und es laufen lasse, muss die Ausgabe sein 2.

Ein Eingang 0kann geben 0oder -0aber, wenn Sie Unterstützung Null tun unterzeichnet, -0geben soll 0.


5
Warum brauchen wir eine Kopie derselben Frage?
Christian

5
@Christian Dieser gibt eine konstante Zahl (und deren Negation) aus, während dieser eine Eingabe nehmen und diese zurückgeben / negieren muss. Ein ganz anderer Beruf in vielen Sprachen.
Adám,

5
A ja, jetzt sehe ich den Unterschied. Man muss SEHR sorgfältig lesen
Christian

Wenn Sie eine strukturierte Sprache wie C # verwenden, kehren Sie nur Zeilen um?
PerpetualJ

@PerpetualJ Nein, sehen Sie sich die Liste der Zeichen an, von denen einige Zeilenumbrüche sind.
Adám

Antworten:





11

x86-Maschinencode, 3 Byte

C3 D8 F7

Die obigen Code-Bytes definieren eine No-Op-Funktion: Sie gibt einfach die Kontrolle an den Aufrufer zurück. Dieser Funktion folgen zwei Müllbytes, die nicht ausgeführt werden, da sie nach einer Rückkehr kommen - sie befinden sich im "Niemandsland". In Assembler Mnemonics:

ret                     ; C3    
fdiv  st(0), st(7)      ; D8 F7

Okay, jetzt kommt ein Troll vorbei und kehrt die Reihenfolge der Bytes um:

F7 D8 C3

Diese Bytes definieren jetzt eine Funktion, die ein ganzzahliges Argument in das EAXRegister aufnimmt , es negiert und die Kontrolle an den Aufrufer zurückgibt. In Assembler Mnemonics:

neg  eax     ; F7 D8
ret          ; C3

Also ... das war einfach. :-)

Beachten Sie, dass wir die Anweisung "negation" beliebig machen können , da sie niemals in der Ausrichtung "forward" und nur in der Ausrichtung "reverse" ausgeführt wird. Daher können wir dem gleichen Muster folgen, um willkürlich kompliziertere Dinge zu tun. Hier nehmen wir zum Beispiel ein ganzzahliges Argument in ein anderes Register (zum Beispiel, um EDIdie auf * nix-Systemen übliche System V-Aufrufkonvention zu befolgen), negieren es und geben es in das herkömmliche EAXRegister zurück:

C3      ret
D8 F7   fdiv  st(0), st(7)      ;  \ garbage bytes that
F8      clc                     ;  | never get executed,
89      .byte 0x89              ;  / so nobody cares

  ↓ ↓

89 F8   mov  eax, edi
F7 D8   neg  eax
C3      ret



6

Leerzeichen , 48 Bytes

S S S N
S N
S T N
T   T   T   T   T   T   N
S T N
N
N
T   S N
T   N
S S T   N
T   T   S S T   T   T   T   T   N
T   S N
S N
S S S 

Buchstaben S(Leerzeichen), T(Tabulator) und (Zeilenvorschub) werden Nnur als Hervorhebungen hinzugefügt.

Kleinere Änderungen an meiner Whitespace-Antwort für das Umkehren des Quellcodes, negieren Sie die Ausgabe! herausfordern .

Probieren Sie es online oder umgekehrt aus (nur mit Leerzeichen, Tabulatoren und Zeilenumbrüchen).

Erläuterung:

Mit Hilfe der Exit - Programm builtin eine kurze Palindrom ist NNN.
Das reguläre Programm wird:

SSSN   # Push 0 to the stack
SNS    # Duplicate it
TNTT   # Read STDIN as integer, and store it at heap address 0
TTT    # Retrieve the input from heap address 0, and push it to the stack
TNST   # Pop and print the top of the stack as number
NNN    # Exit the program, making everything after it no-ops

Das umgekehrte Programm wird:

SSSN   # Push 0 to the stack
SNS    # Duplicate it
TNTT   # Read STDIN as integer, and store it at heap address 0
TTT    # Retrieve the input from heap address 0, and push it to the stack
SSTTN  # Push -1 to the stack
TSSN   # Multiply the top two values on the stack together
TNST   # Pop and print the top of the stack as number
NNN    # Exit the program, making everything after it no-ops

Kleine zusätzliche Erklärung zum Drücken einer Nummer:

  • Erstens S: Aktivieren Sie die Stapelmanipulation
  • Zweitens S: Schieben Sie eine Zahl auf den Stapel
  • Soder T: positiv / negativ
  • Einige S/ Tgefolgt von einer abschließenden N: Zahl in binär, wo S=0undT=1

Dh SSTTSTSNdrückt -10. Für die 0brauchen wir keinen expliziten S=0, also einfach SSSNoder SSTNreicht.




5

Brain-Flak , 7 Bytes

#)]}{[(

Probieren Sie es online!

Rückgängig gemacht:

([{}])#

Probieren Sie es online!

Hinweis: Funktioniert nur in Interpreten, die Kommentare unterstützen (z. B. in Rain-Flak, aber nicht in BrainHack)


Wenn wir auch öffnende / schließende Klammern tauschen, anstatt nur die Bytes umzukehren, können wir dies in 8 Bytes tun, ohne Kommentare zu verwenden:

({}[{}])

Probieren Sie es online!
Versuchen Sie es umgekehrt!


Ist das undefinierter Verhaltensmissbrauch? Ich glaube nicht, dass die Brain-Flak-Spezifikation solche Klammern zulässt.
Hochradioaktiv

@TwilightSparkle Startet #einen Kommentar, sodass die Klammern in der Originalversion ignoriert werden.
Riley

Oh ja ich vergaß! Aber es funktioniert dann nur in Rain-Flak (es ist allerdings der offizielle Interpreter). Sie müssen es wahrscheinlich erwähnen?
Hochradioaktiv

@TwilightSparkle hat zur Verdeutlichung einen Hinweis hinzugefügt. Vielen Dank.
Riley,

Kleine lustige Herausforderung: Können Sie dies ohne Kommentare tun, wenn Sie auch öffnende / schließende Klammern tauschen, anstatt nur umzukehren?
DJMcMayhem




4

R , 23 Bytes

Ich habe beschlossen, es ohne Kommentar zu versuchen.

Nach vorne

`+`=scan;""+-0;nacs=`+`

Probieren Sie es online!

Umkehren

`+`=scan;0-+"";nacs=`+`

Probieren Sie es online!

In der Vorwärtsversion +handelt es sich um einen binären Operator und -um einen unären Operator.

Umgekehrt +wird das unär und das -binär. Die Scan-Funktion übernimmt also die Argumente: file=""das heißt stdin und what=0, das sind auch Standardwerte. Wenn das +unär ist, befindet sich das erste Argument rechts, wenn es binär ist, befindet sich das erste Argument links.

Das

;nacs=`+`

Ein Teil des Codes ist nicht wirklich nützlich, so dass mein Code in gewisser Weise nicht viel aussagekräftiger ist als die Verwendung des Kommentar-Tricks.


1
Das ist sehr klug (+1). Wir definieren die R-Operatoren oft neu in Golf-Bytes, aber ich denke, dies ist das erste Mal, dass ich eine +Neudefinition gesehen habe , die sowohl als unär als auch als binär verwendet werden kann. Ich brauchte eine Minute, um zu verstehen, wie das analysiert wurde ... Kein anderer Operator hätte die Arbeit erledigt.
Robin Ryder


4

Perl 5 ( -p), 7 6 Bytes

-1 danke an @primo

$_*=$#

TIO

Ein Kommentar ändert die Eingabe nicht

#1-=*_$

Negiere die Eingabe

$_*=-1#

TIO


-1: $_*=$# TIO . Beachten Sie, dass #dies das allerletzte Byte des Programms sein muss, da es sonst als Variable $#und nicht als letzter Index des Arrays mit dem Namen <leer> interpretiert wird .
Primo

1
Ich verstehe jedoch nicht, wie es funktioniert, weil der Versuch zu drucken $#entweder einen Fehler (wenn # nicht das letzte Zeichen ist) oder nichts gibt
Nahuel Fouilleul

Scheint nur mit -poder zu arbeiten -n. Ich vermute , die vorformulierten etwas damit zu tun hat ...
primo

2
@primo Es funktioniert da -p/-nein ;nach dem Code. Das heißt, das $#ist eigentlich $#;: die Größe des Arrays @;. Wenn sich die Größe @;ändert, ist das Ergebnis nicht mehr korrekt ( TIO ). Wie auch immer, das ist super schlau, gut gemacht! :)
Dada

Das ist die Erklärung, mit der man sehen kann perl -MO=Deparse -p <(echo -n '$_*=$#'), weil es perl -MO=Deparse -pe '$_*=$#'eine neue Zeile hinzufügt
Nahuel Fouilleul,

4

Gaia , 2 Bytes

_@

Probieren Sie es online!

_	| implicit push input and negate
 @	| push next input OR push last input (when all inputs have been pushed)
	| implicit print TOS

Rückgängig gemacht:

@	| push input
 _	| negate
	| implicit print TOS

4

Rückhand , 6 5 Bytes

I@-Ov

Probieren Sie es online! Probieren Sie es doppelt aus!

Aufgrund der Art des Zeigers in der Rückhand etwas komplexer gemacht. Ich glaube nicht, dass es möglich ist, kürzer zu werden, haha, ich habe mich geirrt. Dies dupliziert Nr Anweisung und verwendet sowohl die Eingabe- als auch die Ausgabe- und die Beendigungsbefehle zwischen den beiden Programmen. Jetzt denke ich, dass es optimal ist, da Sie alle IO-@Befehle benötigen, um zu arbeiten, und in einem 4-Byte-Programm können Sie nur zwei dieser Befehle ausführen.

Erläuterung:

Der Zeiger in der Rückhand bewegt sich um drei Zellen pro Häkchen und springt von den Grenzen der Zelle ab, was bedeutet, dass sich die allgemeine Logik überlappt. Sie können diese Geschwindigkeit jedoch mit der Taste ändernv^ Befehlen und ändern.

Das ursprüngliche Programm führt die Anweisungen aus IO-@, die als Zahl eingegeben, als Zahl ausgegeben, subtrahiert und beendet werden. Offensichtlich ist der Abzug überflüssig. Im Code sind dies:

I@-Ov
^  ^    Reflect
  ^     Reflect again
 ^

Das umgekehrte Programm wird ausgeführt v-I-vO-@. Das vverringert die Zeigerschritte zwischen Ticks und -subtrahiert vom unteren Ende des Stapels, der implizit Null ist. Die zusätzlichen -Befehle machen nichts. Das Programm läuft wie folgt ab

vO-@I
v       Reduce pointer speed to 2
  -     Subtract zero from zero
    I   Get input as number and reflect off boundary
  -     Subtract input from zero
v       Reduce pointer speed to 1
 O      Output as number
  -     Subtract zero from zero
   @    Terminate




3

Python 3 , 22 14 Bytes

int#__bus__. 0

Probieren Sie es online!

Verwendet den intKonstruktor der Klasse und eine integrierte pseudo-private Methode.


Huh. Warum ist das Leerzeichen vor dem Attribut obligatorisch?
Jo King

2
@JoKing 0.wird als Zahl interpretiert, auf die ein Symbol folgt
Uhr



2

APL (Dyalog Unicode) , 13 3 Bytes

-∘0

Probieren Sie es online!

Triviale Antwort. Rückgabe argoder ¯arg.

Sparte 10 Bytes, indem du nicht dumm bist (danke Adám).

Der resultierende 3-Byte-Wert wurde zu einer passenderen Funktion geändert.


Wow, das geht ganz einfach in drei Bytes!
Adám,

Interessanterweise haben Sie bereits eine 3-Byte-Antwort als Teilzeichenfolge eingebettet.
Adám,

@ Adám ja, ich wusste, dass irgendwo eine einfache Antwort drin war. Vielen Dank.
J. Sallé,

2

Turing Maschinensprache , 39 Bytes

Das Positive

1 r - _ 0
0 l * * 0
0 - _ l 0
0 _ _ r 0

Das negative

0 r _ _ 0
0 l _ - 0
0 * * l 0
0 _ - r 1

Dieser war etwas kniffliger als ich dachte, hauptsächlich, weil ich meine Vorurteile überwinden musste, Code zu haben, der mit Kompilierungsfehlern ausgeführt wird.


2

> <> , 5 4 Bytes

n-r0

Verwendet Stack-Initialisierung mit der -vOption, setzen Sie Ihre Eingabevariable dort ab.

Probieren Sie es online!

Oder versuchen Sie die Umkehrung

Erläuterung

n       Prints whatever is on the stack as a number
 -      Subtract the top 2 elements on the stack.
        There aren't 2 elements, so it crashes.
  r0    Never gets executed

or reversed:

0       Push a 0 onto the stack
 r      reverse the stack (now 0, -v)
  -     Subtract top 2 elements and push result (0-v, ie negated)
   n    Print as number
        The code wraps around and executes again. 
        It crashes on the - as there is only one
        item on the stack: 0.

2

Stapel Katzen -mn , 2 Bytes

-X

Probieren Sie es online!

Versuchen Sie das Gegenteil!

Erläuterung

Es stellt sich heraus, dass dies viel einfacher ist als die vorherige Herausforderung in Stack Cats. Das vollständige Programm (nach der Bewerbung -m) finden Sie hier -X-. Xwird verwendet, um die Stapel links und rechts vom Bandkopf zu vertauschen, dh, der ursprüngliche Stapel wird überhaupt nicht beeinflusst, sodass wir ihn ignorieren können. Aber dann ist das Programm effektiv gerecht-- (negieren Sie die Oberseite des Stapels zweimal), was nichts tut.

Für das inverse Programm Anwendung -mgibt X-X. Wieder Xtut nichts, so ist das Programm effektiv nur -, was die Oberseite des Stapels negiert.

Die einzige andere 2-Byte-Lösung ist -=, aber es ist praktisch das gleiche. Der einzige Unterschied besteht darin, dass =nur die Oberseiten der benachbarten Stapel ausgetauscht werden, nicht die gesamten Stapel.

Aber auch hier -mfühlt sich das Verwenden ein bisschen wie Schummeln an. Im Folgenden finden Sie eine Lösung, die ein vollständig gespiegeltes Programm verwendet.


Stapel Katzen -n , 7 Bytes

:I<->I:

Probieren Sie es online!

Versuchen Sie das Gegenteil!

Erläuterung

Die Überlegungen aus der vorherigen Antwort gelten weiterhin : Für jede gültige Lösung müssen die gepaarten Zeichen und verwendet werden I. Die sechs möglichen Lösungen (im TIO-Link enthalten) sind praktisch alle gleich. -und _sind in diesem Programm äquivalent und :können durch |oder ersetzt werden T(die dasselbe für Nicht-Null-Eingänge tun und zufällig auch für Null-Eingänge funktionieren). Ich habe gerade dieses ausgewählt, um zu erklären, weil es am einfachsten ist.

Denken Sie also daran, dass der Anfangsstapel die Eingabe über a -1(über unendlich viele Nullen) hält, während alle anderen Stapel auf dem Band nur Nullen enthalten. Stack Cats hat auch die Eigenschaft, dass jedes Programm mit gerader Länge nichts tut (vorausgesetzt, es wird beendet, aber wir können für diese Herausforderung ohnehin keine Schleifen verwenden). Dasselbe gilt dann natürlich auch für Programme ungerader Länge, deren zentrales Zeichen nichts bewirkt ... mal sehen:

:    Swap the input with the -1 below.
I    Move the -1 one stack to the left and turn it into +1.
<    Move another stack left (without taking the value).
-    Negate the zero on top of that stack (i.e. do nothing).

Daher macht die zweite Hälfte des Programms genau die erste Hälfte rückgängig und wir haben die Eingabe wieder oben auf einem -1.

Das inverse Programm ist :I>-<I:. Mal sehen, wie sich die Dinge ändern:

:    Swap the input with the -1 below.
I    Move the -1 one stack to the left and turn it into +1.
>    Move one stack right, i.e. back onto the initial stack which still holds the input.
-    Negate the input.
<    Move back to the left where we've parked the 1.
I    Move that 1 back onto the initial stack and turn it back into a -1.
:    Swap the -1 below the negated input to act as an EOF marker.

2

Batch, 34 Bytes

@ECHO.%1 2>MER@
@REM>2 1%=-aa/TES@

Echoes ( ECHO.) die Eingabe ( %1). Der Rest der ersten Zeile leitet technisch STDERRzu einer Datei mit dem Namen weiter MER@, dies hat jedoch keine Auswirkungen.
Die zweite Zeile ist auskommentiert ( REM...).

Rückgängig gemacht

@SET/aa-=%1 2>MER@
@REM>2 1%.OHCE@

Verwendet den arithmetischen Modus des Befehls set ( SET /a), um -=die Eingabe ( %1) von einer undefinierten Variablen ( a) zu subtrahieren ( ), die äquivalent zu ist 0 - input. Auch hier wird der Rest der ersten Zeile technisch STDERRzu einer Datei mit dem Namen umgeleitet MER@, dies hat jedoch keine Auswirkungen.
Die zweite Zeile ist auskommentiert ( REM...).


Das sieht interessant aus. Möchtest du das erklären?
Adám

@Adam Fügte eine Erklärung hinzu und erkannte auch, dass ich die Programme rückwärts herum hatte.
25.

2

Brachylog , 2 Bytes

&ṅ

Brachylog gibt implizit von links und von rechts ein.
&Ignoriert alles links und leitet die Eingabe nach rechts an die Funktion weiter.
zwingt jede Seite davon, negierte Versionen voneinander zu sein.

Probieren Sie es online aus


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.