Odwracam kod źródłowy, negujesz wynik!


39

Twoim zadaniem, jeśli chcesz to zaakceptować, jest napisanie programu, który wyświetli liczbę niezerową (może być liczbą całkowitą lub zmiennoprzecinkową). Problem polega na tym, że jeśli odwrócę kod źródłowy, wynikiem musi być zanegowana oryginalna liczba całkowita.

Zasady

  • Musisz zbudować pełny program . Oznacza to, że wyjście musi zostać wydrukowane do STDOUT.

  • Obie liczby muszą znajdować się w bazie 10 (przekazywanie ich do jakiejkolwiek innej bazy lub z notacją naukową jest zabronione).

  • Wyprowadzanie liczb ze spacjami końcowymi / wiodącymi jest dozwolone.

  • To jest golf golfowy, więc wygrywa najkrótszy (oryginalny) kod w każdym języku!

  • Obowiązują domyślne luki.

Przykład

Powiedzmy, że twój kod źródłowy jest, ABCa odpowiadający mu wynik to 4. Jeśli CBAzamiast tego napiszę i uruchomię, wynik musi być następujący -4.


6
Gdybyśmy mogli odwrócić na poziomie bitowym niż na poziomie bajtów, jeden bajt -(0x45 = 0b00101101) działa w galaretce - -daje -1, ponieważ definiuje literał -1, podczas gdy (0xB4 = 0b10110100) daje 1, ponieważ wykonuje logiczne nie niejawnego wejścia wynoszącego zero. (Oczywiście działa równie dobrze: p)
Jonathan Allan

@TwilightSparkle Czy „nieużywane, puste dane wejściowe” oznaczają, że możemy polegać na funkcjach wejściowych, które natychmiast osiągają EOF?
Borka223

1
@ Borka223 Nie, nie możesz.
HighlyRadioactive

@JoKing Kopiowanie. Usunę to.
HighlyRadioactive

Odpowiedzi:



28

JavaScript (V8) , 19 bajtów

print(1)//)1-(tnirp

Wypróbuj online!


prawie identyczny z ...

C # (interaktywny kompilator Visual C #) , 19 bajtów

Print(1)//)1-(tnirP

Wypróbuj online!

(dzięki @someone za wskazanie tego)


nadal prawie tak samo w ...

Lua , 19 bajtów

print(1)--)1-(tnirp

Wypróbuj online!


ale krótszy w ...

Python 2 , 15 bajtów

print 1#1-tnirp

Wypróbuj online!


Jeszcze krótszy w PHP, ponieważ ma to magiczne narzędzie do drukowania: <?=...

PHP , 12 bajtów

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

Wypróbuj online!


Nawet krótszy w Rubim, ponieważ możesz inspectzamiast drukować

Rubinowy , 8 bajtów

p 1#1- p

Wypróbuj online!


Również C # Interactive Print(1)//)-1(tnirP. ( Spróbuj online! )
mój zaimek to monicareinstate

W przypadku C # najkrótszy program jest prawdopodobnie również trywialny:class A{static void Main(){System.Console.Write(1);}}//}};)1-(etirW.elosnoC.metsyS{)(niaM diov citats{A ssalc
LegionMammal978

Nie jest to język programowania, ale możesz zrobić 1<!--!<1-(9 bajtów) za pomocą HTML, który zostanie -1<!--!<1odwrócony. Robi dokładnie to samo co twoja odpowiedź.
Ismael Miguel

W większości takie same w Lua:print(1)--)1-(tnirp
val



12

/// , 4 bajty

9/9-

Wyjścia 9.

Wypróbuj online!

Wywrócony:

-9/9

Wyjścia -9.

Wypróbuj online!

Wszystko przed /drukowaniem, a reszta jest ignorowana (tak naprawdę nie używa się ukośników, więc nie wiem dokładnie, co się dzieje, ale nic nie wyświetla).


2
+1 za używanie ukośników. /Rozpoczyna proces wzór czytaniu, a więc znaki po jego odczytany do wzorca, nie wychodzącego.
Wysoce radioaktywny

2
Wymyśliłem /\-//1-i pomyślałem, że jestem sprytny. : D
Tanner Swett


10

Biała spacja , 21 bajtów

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

Litery S(spacja), T(tab) i N(nowa linia) dodane tylko jako wyróżnienia.

Wyjścia 1/ -1.

Wypróbuj online lub wypróbuj online w odwrotnej kolejności (tylko z surowymi spacjami, tabulatorami i nowymi wierszami).

Wyjaśnienie:

Wykorzystanie wbudowanego programu Exit będącego krótkim palindromem NNN.
Zwykły program będzie:

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

Program zwrotny:

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

Małe dodatkowe wyjaśnienie wypychania liczby:

  • Po pierwsze S: włącz manipulację stosem
  • Po drugie S: Wciśnij liczbę na stos
  • Slub T: odpowiednio pozytywny / negatywny
  • Niektóre S/ Tpo których następuje znak końcowy N: liczba binarna, gdzie S=0iT=1

To znaczy SSTTSTSNpopycha -10.


7

T-SQL, 16 bajtów

--Forwards:
PRINT 4--4-TNIRP

--Backwards:
PRINT-4--4 TNIRP

Wybrano 4, ponieważ 1 jest nadużywane :)


1
Jeśli jesteś ciekawy, odpowiedzią na MySQL byłoby select 1#1-tceles(17 bajtów). Możesz sprawdzić wynik na sqlfiddle.com/#!9/9eecb/107825 .
Ismael Miguel

7

Japt , 2 bajty

Każda pojedyncza cyfra całkowitą >0można stosować w miejsce 2, jak to możliwe A-G, H, I, Ji L( 10-16, 32, 64, -1i 100, odpowiednio).

n2

Przetestuj | Wywrócony

nSposób w zastosowaniu do liczby całkowitej, odejmowania, że liczba całkowita z argumentu przekazywane do niego, które domyślnie 0. Podczas uruchamiania do przodu nmetoda jest uruchamiana na niejawnym pierwszym wejściu, który również jest domyślnie ustawiony na 0.

Alternatywnie gzamiast tego można zastosować metodę n, która daje znak wyniku odjęcia jej argumentu od liczby całkowitej, do której jest stosowana.


7

Haskell bez komentarzy, 41 bajtów

Przesyła wydruki 1+ nowa linia:

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

Wypróbuj online!

Odwrócone wydruki -1bez znaku nowej linii (które można dodać kosztem 2 bajtów):

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

Wypróbuj online!

  • Pierwszy wiersz każdego programu wypisuje numer.
    • Do -1ciągów wyjściowych służy unikanie nawiasów.
    • Użycie $!(ścisła aplikacja) zamiast spacji pozwala, aby odwrócona linia była prawidłową definicją operatora !$(po prostu $nie zrobiłoby tego, ponieważ redefinicja przerwałaby użycie).
  • Linia środkowa zapewnia, że niamjest zdefiniowana dla ostatniej linii.
  • Ostatni wiersz jest definicją operatora !$, który nie jest używany, ale musi poprawnie parsować i sprawdzać typ.

7

PHP , 15 13 bajtów

Wersja PHP bez nadużywania komentarzy. ohcejest niezdefiniowaną stałą, więc będzie równa wartości ciągu jej nazwy. W rezultacie spróbuje wydrukować +1-'ohce'lub -1+'ohce'po odwróceniu. Ponieważ 'ohce'jest to wartość nienumeryczna, w operacjach arytmetycznych zostanie użyte 0, a tylko 1lub -1zostaną wydrukowane.

;echo+1-ohce;

Wypróbuj online!

Wypróbuj online!


To sprytne. Miły!
AdmBorkBork

1
Człowieku, to smutne, że doszedłem do tej samej odpowiedzi co ty, 3 godziny spóźnienia :( Pozdrawiam.
Ismael Miguel




6

Cubix , 7 6 5 bajtów

@)O(@

Spróbuj tutaj
Odwrócony

Wyjaśnienie

Cubified:

  @
) O ( @
  .

Rozwijając przepływ sterowania, wykonujemy )O(@przyrosty, wyjścia, dekrecje i wyjścia.

Odwrócone i skostniałe:

  @
( O ) @
  .

Rozwijając przepływ sterujący, wykonujemy (O)@, które zmniejszają, generują, zwiększają i wychodzą.

Poprzednia wersja

@O(.)O@

Spróbuj tutaj
Odwrócony

Nie tak krótki, ale estetyczny.


fajny sposób na umieszczenie go na kostce wielkości 1!
Giuseppe

3
@)O(@za 5 bajtów i przywrócenie symetrii :)
MickyT



5

Stack Cats -mn , 4 bajty

:-:_

Wypróbuj online! W stopce zamieściłem wszystkie pozostałe 4-bajtowe rozwiązania. (Stack Cats ignoruje wszystko po pierwszym wysunięciu linii).

Spróbuj na odwrót!

Wyjaśnienie

Te -nzakręty flag na wyjściu numerycznej (i wejścia, ale nie mają żadnych), a -mflaga jest zazwyczaj tylko wygoda golfa, który pozwala uniknąć niepotrzebnego część kodu źródłowego. Jest tak, ponieważ każdy program Stack Cats musi mieć lustrzaną symetrię. Z -mflagą dajesz jej tylko pierwszą połowę (plus środkową postać). Tak więc rzeczywisty program, tutaj jest:

:-:_:-:

Jak widać na pierwszym łączu TIO, jest mnóstwo 4-bajtowych rozwiązań, ale wybrałem to ze względu na jego prostotę. Stack Cats jest oparty na stosie, a ten program używa tylko początkowego stosu. Ponieważ nie mamy żadnych danych wejściowych, zawiera on pojedynczy -1(znacznik EOF) na nieskończonej studzience zer. Trzy polecenia w programie mają następujące znaczenie:

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

Oto, w jaki sposób program modyfikuje stos (stany i polecenia są rozmieszczone naprzemiennie, aby wskazać, w jaki sposób każde polecenie zmienia stos z jednego stanu na drugi):

   :   -   :   _   :   -   :

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

Jak się okazuje, jedynym poleceniem, które naprawdę tu robi cokolwiek, jest zmiana _znacznika EOF w 1. Dane wyjściowe na końcu programu są niejawne, a znacznik EOF jest opcjonalny, więc po prostu drukuje to, 1co otrzymujemy.

Teraz, jeśli odwrócimy kod źródłowy, z powodu niejawnego dublowania, rzeczywisty program staje się:

_:-:-:_

To robi coś zupełnie innego:

   _   :   -   :   -   :   _

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

Tym razem dolna część stosu jest nadal, -1więc działa jak znacznik EOF i -1drukowana jest tylko jego górna część.

...

Teraz, gdy już to wszystko zostało powiedziane, ponieważ Stack Cats ma tak wyjątkowy związek z kodem cofania, uważam, że używanie -mjest trochę oszustwem. Zwykle ma to na celu zaoszczędzenie bajtów poprzez pominięcie zbędnej części kodu źródłowego, ale tutaj w rzeczywistości sprawia, że ​​wyzwanie jest o wiele łatwiejsze, a nawet pełny program krótszy. Wynika to z faktu, że odwrócenie pełnego programu zmieni program tylko, jeśli zawiera którykolwiek <>[], co oznacza również, że program używa wielu stosów (Stack Cats faktycznie ma taśmę stosów, gdzie wszystkie oprócz początkowej są wypełnione tylko z zerami na początek). Co więcej, odwrócenie go powoduje zamianę par <>i [], co nadal sprawia, że ​​wykonanie jest symetryczne. Jedynym sposobem na przełamanie tej symetrii jest użycie tego, Ico robi -]lub-[lub nic w zależności od znaku górnej części stosu. Więc...


Stack Cats -n , 11 bajtów

*|]I*:*I[|*

Wypróbuj online! Stopka ponownie zawiera wszystkie inne alternatywy o tej samej liczbie bajtów. Niektóre z tych wyjść 1 / -1 i niektóre 2 / -2, jak wskazano po każdym programie. Wybrałem ten, aby wyjaśnić trochę losowo jako jeden z tych, które generują 2.

Spróbuj na odwrót!

Wyjaśnienie

Jak powiedziałem, ten jest trochę dłuższy. Nawet jeśli użyjemy -mdo tego zapisu, ważyłby 6 bajtów zamiast powyższych 4.

Tym razem używane polecenia:

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

Pierwszy program wykorzystuje tylko dwa stosy. To trochę niechlujne w sztuce ASCII, ale postaram się jak najlepiej. Nawiasy kwadratowe wskazują, na którym stosie znajduje się głowica taśmy, i umieszczę polecenia między każdą parą stanów stosu.

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

Teraz -1działa jak znacznik EOF i 2drukuje się.

Drugi program jest taki sam, dopóki [. Do drugiej sekundy jest praktycznie tak samo I. Technicznie będziemy na innym stosie, ale bez wartości, wszystkie są nierozróżnialne. Ale wtedy różnica między I[i I]kończy się bez znaczenia:

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

I tym razem nie mamy znacznika EOF, ale program nadal wyświetla -2.


4

Zsh , 12 bajtów

<<<2 # 2-<<<

Wypróbuj online!

Podstawowa metoda przekazywania, komentowania i odwracania.


Jeśli I / O jest mniej restrykcyjne, możliwe jest bardziej interesujące rozwiązanie 11-bajtowe dzięki Zsh obsługującemu ujemne kody powrotu:

return -127

Odwrócony, 721- nruterkończy działanie z kodem 127(nie znaleziono polecenia). exit -127nie może być użyty, byłby rzutowany na u8. Wypróbuj online!



4

MATL , 3 bajty

Nqv

Wypróbuj online!

Jak oni pracują

Normalna:

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

Wywrócony:

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

Sześciokąt , 5 bajtów

1!@!(

Wypróbuj online!

Każdy prawidłowy program musi:

  • Mieć polecenie zakończenia ( @lub :). Ta ostatnia różni się tylko w przypadku pierwszej, gdy istnieje polecenie ruchu wskaźnika pamięci. Również to polecenie nie może znajdować się na pierwszym lub ostatnim bajcie.
  • Mam polecenie wyjściowe. ( !, ;jest również możliwe, ale prawdopodobnie zajmie więcej bajtów)
  • Wykonaj polecenie manipulacji pamięcią.

Dlatego dwubajtowy program jest oczywiście niemożliwy. Program 3-bajtowy jest niemożliwy, ponieważ drugi bajt musi być poleceniem kończącym, a pierwszy bajt nie może być poleceniem lustrzanym / manipulacyjnym IP, dlatego można wykonać tylko 1 bajt.

Myślę, że 4-bajtowy program nie jest możliwy. Taki program musi mieć postać a@bcz sześciokątną siatką

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

Dlatego amusi być poleceniem przekierowania IP. Jednak niemożliwe jest wygenerowanie zarówno dodatniej, jak i ujemnej liczby za pomocą tylko 1 polecenia manipulacji pamięcią.


+1 za dowód optymalności w trywialnej odpowiedzi
Jo King



3

Java 5 lub 6, 127 67 bajtów

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

Wyjścia 9/ -9.

Brak kompilatora online, ponieważ Java 5 lub 6 nie jest nigdzie dostępna.

Możesz jednak wypróbować 127 bajtów odpowiednika Java 8:
Wypróbuj online lub wypróbuj online w odwrotnej kolejności .

Wyjaśnienie:

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 i 6 zawierały błąd pozwalający na utworzenie bloku kodu w wyliczeniu, aby coś zrobić, pomimo pominięcia obowiązkowej metody głównej programu. Spowoduje to błąd:

java.lang.NoSuchMethodError: main
Wyjątek w wątku „main”

Ale nadal wyświetli to, co chcielibyśmy STDOUT, więc możemy to zignorować .


3

Golang , 109 bajtów

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

I odwrotnie:

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

Wypróbuj online!


2
Nie wiem Go, ale wygląda na to, że możesz usunąć kilka bajtów. PrintlnMoże być Print, i import "fmt";nie potrzebuje miejsca: import"fmt";. :)
Kevin Cruijssen


3

Siatkówka , 6 bajtów

-`<
-

Wydruki 1.

Wypróbuj online!



-
<`-

Wydruki -1.

Wypróbuj online!

Wyjaśnienie: 1

-`<
-

To ... nic nie robi. Z `tego powodu jest to podstawienie z <na -(z konfiguracją -, która nic nie robi), ale dane wejściowe są puste, więc dane wyjściowe są również puste.


I ten drugi etap dopasowuje puste wyrażenie regularne do pustych danych wejściowych i zlicza liczbę dopasowań, która wynosi dokładnie 1. Wynik jest niejawny.

Wyjaśnienie: -1


-

Tym razem zastępujemy puste wyrażenie regularne -. To rzeczywiście zamienia puste wejście w jeden -.

<`-

Tutaj konfiguracja faktycznie coś robi: <drukuje dane wejściowe stołu montażowego przed wykonaniem stołu montażowego, więc drukujemy -. Następnie -zlicza myślniki w danych wejściowych stołu montażowego, które są ponownie 1. Ze względu na niejawne dane wyjściowe, to wypisuje 1po -, dając nam -1w razie potrzeby.


3

TEX(MathJax), 4bytes

1%1-

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


3

pieprzenie mózgu , 156 bajtów

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

Wypróbuj online! / Weryfikator do przodu / do tyłu w Bash

Drukuje do -1przodu i \n1do tyłu.

Pomimo tego, że jest prawie banalna, uważam, że jest to optymalne rozwiązanie dla tej konkretnej stałej wydajności.

Dowód:

  • Program nie może mieć [lub ].

    Dlatego program musi mieć formę <A> . <B> . <C>.

  • Każdy ,może zostać zastąpiony wystarczającą liczbą <bez zwiększania liczby +lub -.

  • Każdy z nich +jest użyteczny tylko w programie do przodu lub do tyłu, nigdy w obu.

    Dowód: +w części A jest oczywiście przydatny tylko w programie do przodu, +aw części C jest oczywiście użyteczny tylko w programie do tyłu.

    Oznacz shift(P)= liczba <w P - liczba >w P. Rozważmy program <B> = <D> + <E>, +środek jest przydatny w programie do przodu shift(E) = 0, podobnie jest przydatny w programie wstecznym shift(D) = 0. Jeśli jednak shift(D) = shift(E) = 0program zostanie Bwykonany do przodu lub do tyłu, doda drugą wartość do bieżącej komórki przed wydrukowaniem za drugim razem, co nie może mieć miejsca, ponieważ ord('1') - ord('\n') != ord('1') - ord('-').

Dlatego program potrzebuje co najmniej ord('-')+ord('1')+ord('\n')+ord('1') = 153 +s, 2 .si co najmniej a < >lub ,ponieważ shift(B) != 0.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.