Ich kehre den Quellcode um, Sie negieren die Ausgabe!


39

Wenn Sie dies akzeptieren möchten, müssen Sie ein Programm schreiben, das eine Zahl ungleich Null ausgibt (dies kann eine Ganzzahl oder ein Gleitkomma sein). Der schwierige Teil ist, dass, wenn ich Ihren Quellcode umkehre, die Ausgabe die ursprüngliche Ganzzahl sein muss, die negiert wird.

Regeln

  • Sie müssen ein vollständiges Programm erstellen . Das heißt, Ihre Ausgabe muss auf STDOUT gedruckt werden.

  • Beide Zahlen müssen sich in der Basis 10 befinden (die Ausgabe in einer anderen Basis oder mit wissenschaftlicher Notation ist verboten).

  • Die Ausgabe der Zahlen mit abschließenden / führenden Leerzeichen ist zulässig.

  • Das ist Code-Golf, also gewinnt der kürzeste (ursprüngliche) Code in jeder Sprache!

  • Es gelten Standardlücken.

Beispiel

Angenommen, Ihr Quellcode ist ABCund die entsprechende Ausgabe ist 4. Wenn ich CBAstattdessen schreibe und es laufen lasse, muss die Ausgabe sein -4.


6
Wenn wir auf der Bit-Ebene und nicht auf der Byte-Ebene -umkehren könnten, arbeitet das eine Byte (0x45 = 0b00101101) in Jelly - -ergibt -1, da es das Literal -1 definiert, während (0xB4 = 0b10110100) 1 ergibt, da es ein logisches Nein ausführt der impliziten Eingabe von Null. (Funktioniert natürlich genauso gut: p)
Jonathan Allan

@TwilightSparkle Bedeutet "eine unbenutzte, leere Eingabe", dass wir uns darauf verlassen können, dass die Eingabefunktionen sofort EOF erreichen?
Borka223,

1
@ Borka223 Nein, darfst du nicht.
Hochradioaktiv

@JoKing Kopieren. Ich werde das entfernen.
Hochradioaktiv

Antworten:



28

JavaScript (V8) , 19 Byte

print(1)//)1-(tnirp

Probieren Sie es online!


fast identisch mit ...

C # (Visual C # Interactive Compiler) , 19 Byte

Print(1)//)1-(tnirP

Probieren Sie es online!

(Danke an @someone für den Hinweis)


immer noch so ziemlich das gleiche in ...

Lua , 19 Bytes

print(1)--)1-(tnirp

Probieren Sie es online!


aber kürzer in ...

Python 2 , 15 Bytes

print 1#1-tnirp

Probieren Sie es online!


Noch kürzer in PHP, weil es dieses magische Druckwerkzeug hat: <?=...

PHP , 12 Bytes

<?=1;#;1-=?<

Probieren Sie es online!


Noch kürzer in Ruby, weil man inspectnicht drucken kann

Ruby , 8 Bytes

p 1#1- p

Probieren Sie es online!


Auch C # Interactive Print(1)//)-1(tnirP. ( Versuchen Sie es online! )
jemand

Für C # ist das kürzeste Programm wahrscheinlich auch das triviale:class A{static void Main(){System.Console.Write(1);}}//}};)1-(etirW.elosnoC.metsyS{)(niaM diov citats{A ssalc
LegionMammal978

Keine Programmiersprache, aber Sie können 1<!--!<1-mit HTML (9 Bytes) arbeiten, was -1<!--!<1umgekehrt sein wird. Es macht genau das gleiche wie Ihre Antwort.
Ismael Miguel

Meistens sind die gleichen in Lua:print(1)--)1-(tnirp
val



12

/// , 4 Bytes

9/9-

Ausgänge 9.

Probieren Sie es online!

Rückgängig gemacht:

-9/9

Ausgänge -9.

Probieren Sie es online!

Alles, bevor das /gedruckt wird, während der Rest ignoriert wird (nicht wirklich verwendete Schrägstriche, so dass ich nicht genau weiß, was passiert, aber es wird nichts ausgegeben).


2
+1 für die Verwendung von Schrägstrichen. Das /beginnt den Musterleseprozess, und somit werden die Zeichen, nachdem sie in das Muster eingelesen wurden, nicht ausgegeben.
Hochradioaktiv

2
Ich kam mit /\-//1-und dachte, ich sei schlau. : D
Tanner Swett


10

Leerzeichen , 21 Bytes

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

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

Ausgänge 1/ -1.

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

Erläuterung:

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

SSSTN  # Push 1 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:

SSTTN  # Push -1 to the stack
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.



7

Japt , 2 Bytes

Jede einzelne Ziffer integer >0kann anstelle der verwendet werden , 2wie Dose A-G, H, I, Joder L( 10-16, 32, 64, -1und 100, respectively).

n2

Testen Sie es | Rückgängig gemacht

Das nVerfahren , wenn in eine ganze Zahl angewendet, subtrahieren , dass ganze Zahl aus dem Argument übergeben , um es, die Standardwerte zu 0. Wenn die nMethode vorwärts ausgeführt wird, wird sie für die implizite erste Eingabe ausgeführt, die ebenfalls den Standardwert hat 0.

Alternativ gkönnte stattdessen die Methode verwendet werden n, die das Vorzeichen des Ergebnisses des Subtrahierens des Arguments von der Ganzzahl angibt, auf die es angewendet wird.


7

Haskell ohne Kommentare, 41 Bytes

Vorwärtsdrucke 1+ Newline:

main=print$!1
niam=main
"1-"!$rtStup=niam

Probieren Sie es online!

Umgekehrte Ausdrucke -1ohne Zeilenumbruch (die zu einem Preis von 2 Byte hinzugefügt werden könnten):

main=putStr$!"-1"
niam=main
1!$tnirp=niam

Probieren Sie es online!

  • In der ersten Zeile jedes Programms wird die Nummer gedruckt.
    • Bei der -1String-Ausgabe werden Klammern vermieden.
    • Die Verwendung von $!(strenge Anwendung) anstelle eines Leerzeichens ermöglicht, dass die umgekehrte Linie eine gültige Definition des Operators ist !$( $würde dies einfach nicht tun, da die Neudefinition die Verwendung unterbrechen würde).
  • Die mittlere Zeile stellt sicher, dass niamfür die letzte Zeile definiert ist.
  • Die letzte Zeile ist eine Definition eines Operators !$, der nicht verwendet wird, aber korrekt analysiert und typgeprüft werden muss.

7

PHP , 15 bis 13 Bytes

Eine PHP-Version ohne Kommentarmissbrauch. ohceist eine undefinierte Konstante, daher entspricht sie dem Zeichenfolgewert ihres Namens. Dies führt dazu, dass versucht wird zu drucken +1-'ohce'oder -1+'ohce'umgekehrt. Da 'ohce'es sich um einen nicht numerischen Wert handelt, wird bei arithmetischen Operationen stattdessen 0 verwendet und nur 1oder -1gedruckt.

;echo+1-ohce;

Probieren Sie es online!

Probieren Sie es online!


Das ist schlau. Nett!
AdmBorkBork

1
Mann, es ist traurig, dass ich zu der gleichen Antwort wie Sie gekommen bin, 3 Stunden zu spät :( Habe meine Zustimmung.
Ismael Miguel




6

Cubix , 7 6 5 Bytes

@)O(@

Versuchen Sie es hier
umgekehrt

Erläuterung

Cubified:

  @
) O ( @
  .

Den Kontrollfluss abwickelnd, führen wir aus )O(@, welcher inkrementiert, ausgibt, dekrementiert und beendet.

Umgekehrt und kubisch:

  @
( O ) @
  .

Wir lösen den Kontrollfluss und führen aus (O)@, was dekrementiert, ausgibt, inkrementiert und beendet.

Vorherige Version

@O(.)O@

Versuchen Sie es hier
umgekehrt

Nicht so kurz, aber ästhetisch ansprechend.


schön, wie man es auf einen Würfel der Größe 1 legt!
Giuseppe

3
@)O(@für 5 Bytes und Wiederherstellung der Symmetrie :)
MickyT



5

Stapel Katzen -mn , 4 Bytes

:-:_

Probieren Sie es online! In der Fußzeile habe ich alle anderen 4-Byte-Lösungen aufgenommen. (Stack Cats ignoriert alles nach dem ersten Zeilenvorschub.)

Versuchen Sie das Gegenteil!

Erläuterung

Das -nFlag aktiviert die numerische Ausgabe (und Eingabe, aber wir haben keine), und das -mFlag ist normalerweise nur ein Vorteil beim Golfen, mit dem Sie den redundanten Teil des Quellcodes vermeiden können. Dies liegt daran, dass jedes Stack Cats-Programm Spiegelsymmetrie haben muss. Mit der -mFlagge geben Sie nur die erste Hälfte (plus das zentrale Zeichen). Das eigentliche Programm hier ist also:

:-:_:-:

Wie Sie im ersten TIO-Link sehen können, gibt es eine Menge 4-Byte-Lösungen, aber ich habe diese wegen ihrer Einfachheit ausgewählt. Stack Cats ist stapelbasiert und dieses Programm verwendet nur den Anfangsstapel. Da wir keine Eingabe haben, enthält es eine einzelne -1(einen EOF-Marker) auf einer unendlichen Nullmulde. Die drei Befehle im Programm haben folgende Bedeutung:

:   Swap the top two stack elements.
-   Negate the top stack element (i.e. multiply by -1).
_   Pop a. Peek b. Push b-a.

So ändert das Programm den Stapel (Zustände und Befehle sind gestaffelt, um anzuzeigen, wie jeder Befehl den Stapel von einem Zustand zum nächsten ändert):

   :   -   :   _   :   -   :

-1   0   0  -1   1   0   0   1
 0  -1  -1   0   0   1   1   0
 0   0   0   0   0   0   0   0
 …   …   …   …   …   …   …   …

Wie sich herausstellt, ist der einzige Befehl, der hier wirklich etwas tut, _der unseren EOF-Marker in einen verwandelt 1. Die Ausgabe am Ende des Programms ist implizit, und der EOF-Marker ist optional. Dadurch wird nur das ausgegeben, was 1wir erhalten.

Wenn wir nun den Quellcode aufgrund der impliziten Spiegelung umkehren, wird das eigentliche Programm:

_:-:-:_

Das macht etwas ganz anderes:

   _   :   -   :   -   :   _

-1   1   0   0   1  -1   0  -1
 0   0   1   1   0   0  -1  -1
 0   0   0   0   0   0   0   0
 …   …   …   …   …   …   …   …

Diesmal ist der Boden des Stapels immer noch ein, -1sodass er als EOF-Marker fungiert und nur der -1obere Rand gedruckt wird.

...

Nun, da Stack Cats eine so einzigartige Beziehung zum Umkehren von Code hat, halte ich das Verwenden -mfür ein bisschen betrügerisch. Es ist normalerweise nur dazu gedacht, Bytes zu sparen, indem der redundante Teil des Quellcodes weggelassen wird, aber hier macht es die Herausforderung tatsächlich viel einfacher und sogar das gesamte Programm kürzer. Dies liegt daran, dass das Umkehren eines vollständigen Programms das Programm nur dann ändert, wenn es eines von enthält <>[], was auch bedeutet, dass das Programm mehrere Stapel verwendet (Stack Cats hat tatsächlich ein Stapelband, in dem alle außer dem ersten nur gefüllt sind mit Nullen zu beginnen). Wenn Sie es umkehren, werden außerdem nur die Paare <>und []vertauscht, wodurch die Ausführung immer noch symmetrisch wird. Die einzige Möglichkeit, diese Symmetrie zu durchbrechen, ist die Verwendung von Iwhich does -]oder-[oder nichts, je nach dem Zeichen auf der Oberseite des Stapels. So...


Stapel Katzen -n , 11 Bytes

*|]I*:*I[|*

Probieren Sie es online! Die Fußzeile enthält wieder alle anderen Alternativen mit derselben Byteanzahl. Einige davon geben 1 / -1 und einige 2 / -2 aus, wie nach jedem Programm angegeben. Ich habe dieses ausgewählt, um es zufällig als eines von denen zu erklären, die 2 ausgeben.

Versuchen Sie das Gegenteil!

Erläuterung

Wie gesagt, das ist etwas länger. Selbst wenn wir die -mNotation dafür verwenden würden, würde sie 6 Bytes anstelle der obigen 4 wiegen.

Die Befehle, die diesmal verwendet werden:

*   Toggle the least significant bit of the top of the stack.
|   Reverse the longest non-zero of prefix on this stack.
[]  Move one stack to the left/right and take the top of the current stack with you.
I   If the top of the stack is positive, -], if it's negative, -[, otherwise do nothing.
:   Swap the top two stack elements.

Das erste Programm verwendet nur zwei Stapel. In der ASCII-Kunst ist das ein bisschen chaotisch, aber ich werde mein Bestes geben. Die eckigen Klammern geben an, auf welchem ​​Stapel sich der Bandkopf befindet, und ich setze die Befehle zwischen die einzelnen Stapelzustände.

  [-1]
…   0   0   …
    0   0
    …   …

      *

  [-2]
…   0   0   …
    0   0
    …   …

      | (does nothing)
      ]

      [-2]
…   0   0   …
    0   0
    …   …

      I

   [2]
…   0   0   …
    0   0
    …   …

      *

   [3]
…   0   0   …
    0   0
    …   …

      :

   [0]
…   3   0   …
    0   0
    …   …

      *

   [1]
…   3   0   …
    0   0
    …   …

      I

      [-1]
…   3   0   …
    0   0
    …   …

      [

  [-1]
…   3   0   …
    0   0
    …   …

      |

  [ 3]
…  -1   0   …
    0   0
    …   …

      *

  [ 2]
…  -1   0   …
    0   0
    …   …

Jetzt -1fungiert der als EOF-Marker und der 2wird gedruckt.

Das andere Programm ist bis zum [. Bis zur zweiten ist es praktisch immer noch dasselbe I. Wir werden technisch gesehen auf einem anderen Stack sein, aber ohne Werte sind sie alle nicht zu unterscheiden. Aber dann kommt es auf den Unterschied zwischen I[und an I]:

    *|[I*:*I

      [-1]
…   3   0   0   …
    0   0   0
    …   …   …

        ]

          [-1]
…   3   0   0   …
    0   0   0
    …   …   …

        | (does nothing)
        *

          [-2]
…   3   0   0   …
    0   0   0
    …   …   …

Und dieses Mal haben wir keinen EOF-Marker, aber das Programm gibt immer noch den aus -2.


4

Zsh , 12 Bytes

<<<2 # 2-<<<

Probieren Sie es online!

Grundlegende Vorwärts-, Kommentar- und Rückwärtsmethode.


Wenn die E / A weniger restriktiv ist, ist eine interessantere 11-Byte- Lösung möglich, da Zsh negative Rückgabecodes unterstützt:

return -127

Umgekehrt, wird 721- nrutermit Code beendet 127(Befehl nicht gefunden). exit -127kann nicht verwendet werden, es würde zu einer u8. Probieren Sie es online!



4

MATL , 3 Bytes

Nqv

Probieren Sie es online!

Wie sie arbeiten

Normal:

N   % Push number of elements in the stack: 0
q   % Subtract 1: gives -1
v   % Concatenate stack contents vertically: leaves -1 as is
    % Implicit display stack contents

Rückgängig gemacht:

v   % Concatenate stack contents vertically: gives the empty array, []
q   % Subtract 1: leaves [] as is
N   % Push number of elements in the stack: 1
    % Implicit display. [] is not displayed


4

Hexagony , 5 Bytes

1!@!(

Probieren Sie es online!

Jedes gültige Programm muss:

  • Habe einen Beendigungsbefehl ( @oder :). Letzteres unterscheidet sich nur dann vom ersteren, wenn ein Speicherzeiger-Bewegungsbefehl vorliegt. Auch dieser Befehl darf nicht im ersten oder letzten Byte stehen.
  • Habe einen Ausgabebefehl. ( !, ;ist auch möglich, würde aber wahrscheinlich mehr Bytes benötigen)
  • Habe einen Befehl zur Speichermanipulation.

Daher ist ein 2-Byte-Programm offensichtlich unmöglich. Ein 3-Byte-Programm ist nicht möglich, da das zweite Byte der Beendigungsbefehl und das erste Byte kein Spiegel- / IP-Manipulationsbefehl sein darf. Daher kann nur 1 Byte ausgeführt werden.

Ich denke, ein 4-Byte-Programm ist nicht möglich. Ein solches Programm muss die Form a@bcmit sechseckigem Raster haben

 Forward:       | Backward:
                | 
  c b           |   a @
 @ a .          |  b c .
  . .           |   . .

Daher amuss ein IP-Umleitungsbefehl sein. Es ist jedoch unmöglich, mit nur einem Befehl zur Speichermanipulation sowohl positive als auch negative Zahlen zu generieren.


+1 für den Beweis der Optimalität in einer ansonsten trivialen Antwort
Jo King



3

Java 5 oder 6, 127 67 Bytes

enum A{A;{System.out.print(9);}}//}};)9-(tnirp.tuo.metsyS{;A{A mune

Ausgänge 9/ -9.

Kein Online-Compiler, da Java 5 oder 6 nirgendwo verfügbar ist.

Sie können dieses Java 8-Äquivalent mit 127 Byte jedoch ausprobieren :
Probieren Sie es online aus oder versuchen Sie es online umgekehrt .

Erläuterung:

enum A{                              // Create an enum
 A;                                  //  With a mandatory value
 {                                   //  And in a separate instance code-block:
  System.out.print(9);}}             //   Print 9 to STDOUT
//}};)9-(tnirp.tuo.metsyS{;A{A mune  // Comment and thus a no-op

Java 5 und 6 hatten einen Fehler, der es Ihnen ermöglichte, einen Codeblock innerhalb einer Aufzählung zu erstellen, um etwas zu tun, obwohl die obligatorische Hauptmethode eines Programms fehlte. Dies führt zu einem Fehler:

java.lang.NoSuchMethodError: Hauptausnahme
im Thread "main"

Es wird jedoch immer noch ausgegeben, was zuerst STDOUT sein soll, sodass wir dies ignorieren können .


3

Golang , 109 Bytes

package main;import "fmt";func main(){fmt.Println(1)}//})1(nltnirP.tmf{)(niam cnuf;"tmf" tropmi;niam egakcap

Und sein Gegenteil:

package main;import "fmt";func main(){fmt.Println(-1)}//})1(nltnirP.tmf{)(niam cnuf;"tmf" tropmi;niam egakcap

Probieren Sie es online!


2
Ich weiß nicht, Go, aber es scheint, Sie können ein paar Bytes entfernen. Das Printlnkann sein Print, und die import "fmt";nicht den Raum benötigen: import"fmt";. :)
Kevin Cruijssen


3

Netzhaut , 6 Bytes

-`<
-

Druckt 1.

Probieren Sie es online!



-
<`-

Druckt -1.

Probieren Sie es online!

Erläuterung: 1

-`<
-

Das ... macht nichts. Aufgrund des `ist dies eine Substitution von <nach -(mit Konfiguration -, die nichts bewirkt), aber die Eingabe ist leer, so dass auch die Ausgabe leer ist.


Und diese zweite Stufe vergleicht die leere Regex mit der leeren Eingabe und zählt die Anzahl der Übereinstimmungen, die genau 1 beträgt. Die Ausgabe ist implizit.

Erläuterung: -1


-

Dieses Mal ersetzen wir den leeren regulären Ausdruck durch -. Dies macht die leere Eingabe tatsächlich zu einer einzigen -.

<`-

Hier macht die Konfiguration tatsächlich etwas: <druckt die Eingabe der Bühne aus, bevor die Bühne ausgeführt wird, also drucken wir die -. Dann -zählt die Bindestriche in der Eingabe des Stufe , die wieder 1. Aufgrund des impliziten ausgegeben wird, druckt das eine 1nach dem -, was uns je -1nach Bedarf.


3

TEX(MathJax), 4bytes

1%1-

CodeResultForward:1%1-1Backward:-1%11


3

Brainfuck , 156 Bytes

+++++++++++++++++++++++++++++++++++++++++++++.+++++++++++++++++++++++++++++++++++++++++++++++++<+++++++++++++++++++++++++++++++++++++++++++++++++.++++++++++

Probieren Sie es online! / Vorwärts- / Rückwärtsprüfer in Bash

Druckt -1vorwärts und \n1rückwärts.

Obwohl dies fast trivial ist, halte ich dies für die optimale Lösung für diesen bestimmten festen Ausgang.

Beweis:

  • Das Programm kann [oder nicht haben ].

    Daher muss das Programm die Form haben <A> . <B> . <C>.

  • Jedes ,kann durch eine ausreichende Anzahl von ersetzt werden, <ohne die Anzahl von +oder zu erhöhen -.

  • Jedes +ist nur im Vorwärts- oder Rückwärtsprogramm nützlich, niemals in beiden.

    Beweis: +Teil A ist offensichtlich nur im Vorwärtsprogramm nützlich, und +Teil C ist offensichtlich nur im Rückwärtsprogramm nützlich.

    Bezeichnen Sie shift(P)= Anzahl von <in P - Anzahl von >in P. Betrachten Sie Programm <B> = <D> + <E>, das +in der Mitte ist im Vorwärtsprogramm nützlich shift(E) = 0Ebenso ist es im Rückwärtsprogramm nützlich shift(D) = 0. Wenn shift(D) = shift(E) = 0dann jedoch das Programm Bentweder vorwärts oder rückwärts ausgeführt wird, fügt es der aktuellen Zelle einen festen Wert hinzu, bevor es das zweite Mal gedruckt wird, was jedoch nicht der Fall sein kann ord('1') - ord('\n') != ord('1') - ord('-').

Daher benötigt das Programm mindestens ord('-')+ord('1')+ord('\n')+ord('1') = 153 +s, 2 .s und mindestens a < >oder ,da shift(B) != 0.

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.