Invertisco il codice sorgente, si annulla l'output!


39

Il tuo compito, se desideri accettarlo, è scrivere un programma che emetta un numero diverso da zero (può essere intero o float). La parte difficile è che se invertisco il codice sorgente, l'output deve essere l'intero intero negato.

Regole

  • È necessario creare un programma completo . Cioè, l'output deve essere stampato su STDOUT.

  • Entrambi i numeri devono essere nella base 10 (è vietato emetterli in qualsiasi altra base o con notazione scientifica).

  • L'output dei numeri con spazi finali / iniziali è consentito.

  • Questo è code-golf, quindi vince il codice (originale) più breve in ogni lingua!

  • Si applicano le lacune predefinite.

Esempio

Supponiamo che il codice sorgente sia ABCe l'output corrispondente sia 4. Se CBAinvece scrivo ed eseguo, l'output deve essere -4.


6
Se potessimo invertire a livello di bit anziché a livello di byte, il byte -(0x45 = 0b00101101) funziona in Jelly - -produce -1 poiché definisce il letterale -1, mentre (0xB4 = 0b10110100) produce 1 poiché esegue un logico non dell'input implicito di zero. (Naturalmente funziona altrettanto bene: p)
Jonathan Allan,

@TwilightSparkle "Ha un input vuoto, non utilizzato" significa che possiamo fare affidamento sul fatto che le funzioni di input raggiungano immediatamente EOF?
Borka223,

1
@ Borka223 No, non puoi.
Altamente radioattivo il

@JoKing Copying. Lo rimuoverò.
Altamente radioattivo il

Risposte:



28

JavaScript (V8) , 19 byte

print(1)//)1-(tnirp

Provalo online!


quasi identico a ...

C # (compilatore interattivo Visual C #) , 19 byte

Print(1)//)1-(tnirP

Provalo online!

(grazie a @someone per averlo sottolineato)


ancora più o meno lo stesso in ...

Lua , 19 byte

print(1)--)1-(tnirp

Provalo online!


ma più corto in ...

Python 2 , 15 byte

print 1#1-tnirp

Provalo online!


Ancora più breve in PHP, perché ha questo magico strumento di stampa: <?=...

PHP , 12 byte

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

Provalo online!


Ancora più breve in Ruby, perché puoi inspectpiuttosto che stampare

Rubino , 8 byte

p 1#1- p

Provalo online!


Anche C # Interactive, Print(1)//)-1(tnirP. ( Provalo online! )
mio pronome è monicareinstate il

Per C #, il programma più breve è probabilmente anche quello banale:class A{static void Main(){System.Console.Write(1);}}//}};)1-(etirW.elosnoC.metsyS{)(niaM diov citats{A ssalc
LegionMammal978

Non è un linguaggio di programmazione, ma puoi fare 1<!--!<1-(9 byte) con HTML, che sarà -1<!--!<1quando invertito. Fa esattamente lo stesso della tua risposta.
Ismael Miguel,

Principalmente lo stesso in Lua:print(1)--)1-(tnirp
val dice Reinstate Monica il



12

/// , 4 byte

9/9-

Uscite 9.

Provalo online!

invertito:

-9/9

Uscite -9.

Provalo online!

Tutto ciò che /viene stampato prima , mentre il resto viene ignorato (le barre non sono molto utilizzate, quindi non so esattamente cosa succede, ma non produce nulla).


2
+1 per l'utilizzo di barre. Il /inizia il processo modello lettura, e quindi, i caratteri dopo che è letta nel modello, non emesso.
Altamente radioattivo il

2
Mi sono inventato /\-//1-e ho pensato di essere intelligente. : D
Tanner Swett,


10

Spazio bianco , 21 byte

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

Lettere S(spazio), T(scheda) e N(nuova riga) aggiunti solo come evidenziazione.

Uscite 1/ -1.

Provalo online o provalo online invertito (solo con spazi grezzi, schede e nuove righe).

Spiegazione:

Utilizzando il programma di uscita incorporato essendo un palindromo breve NNN.
Il programma regolare dovrà:

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

Il programma inverso:

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

Piccola spiegazione aggiuntiva di come spingere un numero:

  • Primo S : abilitare la manipolazione dello stack
  • Secondo S: spingere un numero nello stack
  • S o T : rispettivamente positivo / negativo
  • Alcuni S/ Tseguiti da un trascinamento N: numero in binario, dove S=0eT=1

Cioè SSTTSTSNspinge -10.



7

Japt , 2 byte

Qualsiasi numero intero sola cifra >0può essere utilizzato al posto del 2quale lattina A-G, H, I, Jo L( 10-16, 32, 64, -1e 100, rispettivamente).

n2

Provalo | Reversed

Il nmetodo, quando applicato a un numero intero, sottrae quel numero intero dall'argomento passato ad esso, il cui valore predefinito è 0. Quando viene eseguito in avanti, il nmetodo viene eseguito sul primo input implicito, che per impostazione predefinita è anche0 .

In alternativa, gè possibile utilizzare il metodo anziché n, il che fornisce il segno del risultato della sottrazione dell'argomento dall'intero a cui è applicato.


7

Haskell senza commenti, 41 byte

Stampa in avanti 1+ newline:

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

Provalo online!

Stampe invertite -1senza newline (che potrebbero essere aggiunte al costo di 2 byte):

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

Provalo online!

  • La prima riga di ciascun programma stampa il numero.
    • Per -1string output viene utilizzato per evitare parentesi.
    • L'uso di $!(applicazione rigorosa) anziché uno spazio consente alla linea invertita di essere una definizione valida dell'operatore !$(semplicemente $non lo farebbe poiché la ridefinizione ne spezzerebbe l'uso).
  • La linea di mezzo assicura che niamsia definita per l'ultima linea.
  • L'ultima riga è una definizione di operatore !$, che non viene utilizzata ma deve essere analizzata e controllata correttamente.

7

PHP , 15 13 byte

Una versione di PHP senza abuso di commenti. ohceè una costante indefinita, quindi sarà uguale al valore di stringa del suo nome. Di conseguenza, questo tenterà di stampare +1-'ohce'o -1+'ohce'invertito. Poiché 'ohce'è un valore non numerico, verrà invece utilizzato 0 nelle operazioni aritmetiche e verrà stampato solo 1o -1verrà stampato.

;echo+1-ohce;

Provalo online!

Provalo online!


È intelligente. Bello!
AdmBorkBork,

1
Amico, è triste che sono arrivato alla tua stessa risposta, con 3 ore di ritardo :( Avere il mio voto.
Ismael Miguel,




6

Cubix, 7 6 5 bytes

@)O(@

Try it here
Reversed

Explanation

Cubified:

  @
) O ( @
  .

Unrolling the control flow, we execute )O(@, which increments, outputs, decrements, and exits.

Reversed and cubified:

  @
( O ) @
  .

Unrolling the control flow, we execute (O)@, which decrements, outputs, increments, and exits.

Previous version

@O(.)O@

Try it here
Reversed

Not as short, but aesthetically pleasing.


nice, way to put it on a size 1 cube!
Giuseppe

3
@)O(@ for 5 bytes and restoration of symmetry :)
MickyT



5

Stack Cats -mn, 4 bytes

:-:_

Try it online! In the footer I've included all other 4-byte solutions. (Stack Cats ignores everything after the first linefeed.)

Try the reverse!

Explanation

The -n flag turns on numeric output (and input, but we don't have any), and the -m flag is normally just a golfing convenience which lets you avoid the redundant part of the source code. This is because every Stack Cats program needs to have mirror symmetry. With the -m flag you only give it the first half (plus the central character). So the actual program here is:

:-:_:-:

As you can see in the first TIO link, there's a ton of 4-byte solutions, but I picked this one for its simplicity. Stack Cats is stack-based, and this program only uses the initial stack. Since we don't have any input, it contains a single -1 (an EOF marker) on top of an infinite well of zeros. The three commands in the program have the following meaning:

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

So here is how the program modifies the stack (states and commands are staggered to indicate how each command changes the stack from one state to the next):

   :   -   :   _   :   -   :

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

As it turns out, the only command that really does anything here is _ which turns our EOF marker into a 1. Output at the end of the program is implicit, and the EOF marker is optional, so this just prints out the 1 we get.

Now if we reverse the source code, due to the implicit mirroring, the actual program becomes:

_:-:-:_

This does something very different:

   _   :   -   :   -   :   _

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

This time the bottom of the stack is still a -1 so it does act as the EOF marker and only the -1 on top of it gets printed.

...

Now with all of that said, since Stack Cats has such a unique relationship with reversing code, I feel that using -m is a little cheating. It's normally only meant to save bytes by omitting the redundant part of the source code, but here it actually makes the challenge a lot easier and even the full program shorter. This is because reversing a full program will only change the program if it contains any of <>[], which also means that the program ends up making use of multiple stacks (Stack Cats actually has a tape of stacks, where all but the initial one are only filled with zeros to begin with). Furthermore, reversing it then just swaps the <> and [] pairs, which still makes the execution symmetric. The only way to break that symmetry is to use I which does -] or -[o niente a seconda del segno della parte superiore della pila. Così...


Stack Cats -n , 11 byte

*|]I*:*I[|*

Provalo online! Il piè di pagina include di nuovo tutte le altre alternative con lo stesso numero di byte. Alcuni di questi producono 1 / -1 e altri 2 / -2 come indicato dopo ciascun programma. Ho scelto questo per spiegarlo in modo casuale come uno di quelli che hanno prodotto 2.

Prova il contrario!

Spiegazione

Come ho già detto, questo è un po 'più lungo. Anche se abbiamo usato il-m notation for this, it would weigh in at 6 bytes instead of the above 4.

I comandi in uso questa volta:

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

Il primo programma utilizza solo due pile. È un po 'complicato da fare nell'arte ASCII, ma farò del mio meglio. Le parentesi quadre indicano su quale pila si trova la testina e inserirò i comandi tra ciascuna coppia di stati di pila.

  [-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
    …   …

Ora -1agisce come un marker EOF e il2 viene stampato.

L'altro programma è lo stesso fino a quando [. È ancora praticamente lo stesso fino al secondo I. Saremo tecnicamente su uno stack diverso, ma senza valori su di essi, sono tutti indistinguibili. Ma poi la differenza tra I[e I]finisce per essere importante:

    *|[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
    …   …   …

E questa volta, non abbiamo un marker EOF, ma il programma continua a produrre -2.


4

Zsh , 12 byte

<<<2 # 2-<<<

Provalo online!

Inoltro di base, commento, metodo inverso.


Se l'I / O è meno restrittivo, è possibile una soluzione più interessante a 11 byte grazie a Zsh che supporta i codici di ritorno negativi:

return -127

Invertito, 721- nruteresce con il codice 127(comando non trovato). exit -127non può essere utilizzato, verrebbe eseguito il cast in a u8. Provalo online!


4

CJam , 3 byte

W;1

Provalo online!

Come funzionano

Versione normale:

W    e# Push -1
;    e# Delete
1    e# Push 1
     e# Implicit display

Versione inversa: hai avuto l'idea.


4

MATL , 3 byte

Nqv

Provalo online!

Come funzionano

Normale:

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

invertito:

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

Esagonia , 5 byte

1!@!(

Provalo online!

Qualsiasi programma valido deve:

  • Avere un comando di terminazione ( @o :). Il secondo è diverso solo per il primo quando c'è un comando di movimento del puntatore della memoria. Inoltre, questo comando non deve essere al primo o all'ultimo byte.
  • Avere un comando di output. ( !, ;è anche possibile ma probabilmente richiederebbe più byte)
  • Avere un comando di manipolazione della memoria.

Pertanto un programma a 2 byte è ovviamente impossibile. Un programma a 3 byte è impossibile perché il secondo byte deve essere il comando di terminazione e il primo byte non deve essere un comando di manipolazione mirror / IP, pertanto è possibile eseguire solo 1 byte.

Penso che un programma a 4 byte non sia possibile. Tale programma deve avere la forma a@bccon griglia esagonale

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

Pertanto adeve essere un comando di reindirizzamento IP. Tuttavia è impossibile generare sia numeri positivi che negativi con 1 solo comando di manipolazione della memoria.


+1 per la prova dell'ottimalità in una risposta altrimenti banale
Jo King il



3

Java 5 or 6, 127 67 bytes

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

Outputs 9/-9.

No online compiler, because Java 5 or 6 isn't available anywhere.

You can however try this 127 bytes Java 8 equivalent:
Try it online or try it online reversed.

Explanation:

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 and 6 had a bug allowing you to create a code block inside an enum to do something, despite missing a program's mandatory main-method. This will result in an error:

java.lang.NoSuchMethodError: main
Exception in thread "main"

But will still output what we'd want to STDOUT first, so we can ignore that.


3

Golang, 109 bytes

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

And its reverse:

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

Try it online!


2
I don't know Go, but it seems you can remove a few bytes. The Println can be Print, and the import "fmt"; doesn't need the space: import"fmt";. :)
Kevin Cruijssen


3

Retina, 6 bytes

-`<
-

Prints 1.

Try it online!



-
<`-

Prints -1.

Try it online!

Explanation: 1

-`<
-

This... does nothing. Due to the `, this is a substitution from < to - (with configuration -, which does nothing), but the input is empty, so the output is empty as well.


And this second stage matches the empty regex against the empty input and counts the number of matches, which is exactly 1. Output is implicit.

Explanation: -1


-

This time we replace the empty regex with -. This does indeed turn the empty input into a single -.

<`-

Here, the configuration actually does something: < prints the stage's input before executing the stage, so we print the -. Then - counts the hyphens in the stage's input which is again 1. Due to the implicit output, this prints a 1 after the -, giving us -1 as required.


3

TEX(MathJax), 4bytes

1%1-

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


3

brainfuck, 156 bytes

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

Try it online! / Forward/backward verifier in Bash

Prints -1 forward and \n1 backwards.

Despite being almost trivial, I believe this is the optimal solution for this particular fixed output.

Proof:

  • The program cannot have [ or ].

    Therefore the program must have the form <A> . <B> . <C>.

  • Each , can be replaced with a sufficient number of < without increasing the number of + or -.

  • Each + is only useful in either the forward or the backward program, never both.

    Proof: + in part A is obviously only useful in the forward program, and + in part C is obviously only useful in the backward program.

    Denote shift(P) = number of < in P - number of > in P. Consider program <B> = <D> + <E>, the + in the middle is useful in the forward program shift(E) = 0, similarly it's useful in the backward program shift(D) = 0. However if shift(D) = shift(E) = 0 then the program B executed either forward or backward would add a fixed value to the current cell before printing the second time, which can't be the case because ord('1') - ord('\n') != ord('1') - ord('-').

Therefore the program needs at least ord('-')+ord('1')+ord('\n')+ord('1') = 153 +s, 2 .s, and at least a < > or , because shift(B) != 0.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.