Odwracam kod źródłowy, negujesz dane wejściowe!


36

Jawne zdzierstwo z rip-off . Głosujcie za tymi!

Twoim zadaniem, jeśli chcesz to zaakceptować, jest napisanie programu / funkcji, która wypisuje / zwraca liczbę całkowitą / argument. Problem polega na tym, że jeśli odwrócę kod źródłowy, wynikiem musi być zanegowana oryginalna liczba całkowita.

Przykłady

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

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

Dane wejściowe 0mogą dać 0lub -0, jeśli jednak obsługujesz podpisane zero, -0powinny dać 0.


5
Dlaczego potrzebujemy kopii tego samego pytania?
Christian

5
@Christian Ten wyprowadza stałą liczbę (i jej negację), podczas gdy ten musi przyjmować dane wejściowe i zwracać / negować je. Zupełnie inna praca w wielu językach.
Adám

5
Tak, teraz widzę różnicę. Trzeba bardzo uważnie przeczytać
Christian

Jeśli używasz języka strukturalnego, takiego jak C #, czy po prostu odwracasz wiersze?
PerpetualJ

@PerpetualJ Nie, spójrz na źródło jak lista znaków, z których niektóre są łamaniem linii.
Adám

Odpowiedzi:





11

kod maszynowy x86, 3 bajty

C3 D8 F7

Powyższe bajty kodu definiują funkcję, która nie działa: po prostu zwraca kontrolę nad dzwoniącym. Po tej funkcji następują dwa bajty śmieci, które nie zostaną wykonane, ponieważ przychodzą po powrocie - znajdują się w „ziemi niczyjej”. W mnemonikach asemblera:

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

Okej, więc teraz pojawia się troll i odwraca kolejność bajtów:

F7 D8 C3

Te bajty definiują teraz funkcję, która przyjmuje do EAXrejestru argument liczby całkowitej , neguje go i zwraca kontrolę do obiektu wywołującego. W mnemonikach asemblera:

neg  eax     ; F7 D8
ret          ; C3

Więc… to było proste. :-)

Zauważ, że możemy sprawić, by instrukcja „negacja” była czymkolwiek chcemy, ponieważ nigdy nie jest wykonywana w orientacji „do przodu” i tylko w orientacji „odwróconej”. Dlatego możemy postępować według tego samego schematu, aby robić dowolnie bardziej skomplikowane rzeczy. Na przykład tutaj bierzemy argument liczby całkowitej w innym rejestrze (powiedzmy, EDIaby postępować zgodnie z konwencją wywoływania Systemu V powszechnie stosowaną w systemach * nix), negować go i zwracać do EAXrejestru konwencjonalnego :

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

Biała spacja , 48 bajtów

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 

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

Niewielka modyfikacja mojej odpowiedzi w Whitespace dla I odwracam kod źródłowy, negujesz wynik! wyzwanie .

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:

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

Program zwrotny:

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

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. Do 0tego nie potrzebujemy wyraźnego S=0, więc po prostu SSSNlub SSTNwystarczy.




5

Brain-Flak , 7 bajtów

#)]}{[(

Wypróbuj online!

Wywrócony:

([{}])#

Wypróbuj online!

Uwaga: Działa tylko w tłumaczach obsługujących komentarze (np. Działa w Rain-Flak, ale nie w BrainHack)


Jeśli zamienimy również nawiasy otwierające / zamykające zamiast po prostu odwrócić bajty, możemy to zrobić w 8 bajtach bez użycia komentarzy:

({}[{}])

Wypróbuj online!
Spróbuj odwrócić!


Czy to nieokreślone zachowanie stanowi nadużycie? Nie sądzę, że specyfikacja Brain-Flak dopuszcza taki nawias.
Wysoce radioaktywny

@TwilightSparkle #Rozpoczyna komentarz, więc nawiasy w oryginalnej wersji są ignorowane.
Riley

A tak, zapomniałem! Ale wtedy działa tylko w Rain-Flak (jest to jednak oficjalny interpreter). Prawdopodobnie będziesz musiał o tym wspomnieć?
Wysoce radioaktywny

@TwilightSparkle dodał notatkę dla wyjaśnienia. Dzięki.
Riley

Zabawne małe wyzwanie: czy możesz to zrobić bez komentarzy, jeśli zamienisz nawiasy otwierające / zamykające zamiast po prostu cofać?
DJMcMayhem




4

R , 23 bajty

Postanowiłem spróbować bez komentowania.

Naprzód

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

Wypróbuj online!

Rewers

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

Wypróbuj online!

W wersji forward +działa operator binarny i -jest operatorem jednoargumentowym.

Z drugiej strony +staje się jednoargumentowy, a -dwójkowy. Tak więc funkcja skanowania przyjmuje argumenty: file=""co oznacza stdin i what=0, które są również domyślnymi. Tak więc, gdy +argument jest jednostkowy, pierwszy argument znajduje się po prawej stronie, a gdy jest binarny, pierwszy argument znajduje się po lewej stronie.

The

;nacs=`+`

część kodu nie robi nic naprawdę przydatnego, więc w pewnym sensie mój kod nie jest tak naprawdę bardziej poprawny niż użycie sztuczki komentowania.


1
To bardzo mądre (+1). Często redefiniujemy operatory R na bajty golfowe, ale myślę, że po raz pierwszy widzę, jak +redefinicja ma być używana jako jednoargumentowa i binarna. Zrozumienie, w jaki sposób zostało to przeanalizowane, zajęło mi minutę… Żadna inna nazwa operatora nie wykonałaby tego zadania.
Robin Ryder


4

Perl 5 ( -p), 7 6 bajtów

-1 dzięki @primo

$_*=$#

TIO

Komentarz nie zmienia danych wejściowych

#1-=*_$

Neguj dane wejściowe

$_*=-1#

TIO


-1: $_*=$# TIO . Zauważ, że #musi to być ostatni bajt programu, w przeciwnym razie będzie interpretowany jako zmienna $#, a nie jako ostatni indeks tablicy o nazwie <pusty>.
primo

1
jednak nie rozumiem, jak to działa, ponieważ próba drukowania $#powoduje błąd (jeśli # nie jest ostatnim znakiem) lub nic
Nahuel Fouilleul

Wydaje się działać tylko z -plub -n. Podejrzewam, że płyta kotłowa ma z tym coś wspólnego ...
primo

2
@primo Działa, ponieważ -p/-ndodaje ;kod po. Co oznacza, że $#tak naprawdę jest to $#;: rozmiar tablicy @;. Jeśli rozmiar @;zmian, wynik nie jest już poprawny ( TIO ). W każdym razie jest to super sprytne, dobrze zrobione! :)
Dada

takie wyjaśnienie można zobaczyć perl -MO=Deparse -p <(echo -n '$_*=$#'), ponieważ wydaje się, że perl -MO=Deparse -pe '$_*=$#'dodaje nową linię
Nahuel Fouilleul

4

Gaia , 2 bajty

_@

Wypróbuj online!

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

Wywrócony:

@	| push input
 _	| negate
	| implicit print TOS

4

Backhand , 6 5 bajtów

I@-Ov

Wypróbuj online! Spróbuj dwukrotnie!

Zrobiono trochę skomplikowane ze względu na charakter wskaźnika w Backhand. Nie sądzę, że można uzyskać krótszą haha, okazuje się, że się myliłem. Nie powiela to instrukcji i ponownie wykorzystuje polecenia wejścia, wyjścia i zakończenia między dwoma programami. Teraz uważam, że jest optymalny, ponieważ potrzebujesz wszystkich IO-@poleceń do działania, aw programie 4-bajtowym możesz wykonać tylko dwa z tych poleceń.

Wyjaśnienie:

Wskaźnik w Backhand przesuwa się o trzy komórki tyknięciem i odbija się od granic komórki, co oznacza, że ​​ogólna logika nakłada się. Można jednak manipulować tą prędkością za pomocą vi^ poleceń .

Oryginalny program wykonuje instrukcje IO-@, które są wprowadzane jako liczba, wyprowadzane jako liczba, odejmowanie, kończenie. Oczywiście odejmowanie jest zbędne. W kodzie są to:

I@-Ov
^  ^    Reflect
  ^     Reflect again
 ^

Odwrócony program jest wykonywany v-I-vO-@. vZmniejsza działania wskaźnika pomiędzy kleszczy i -odejmuje od spodu stosu, który jest pośrednio zero. Dodatkowe -polecenia nic nie robią. Program działa jak

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







2

APL (Dyalog Unicode) , 13 3 bajtów

-∘0

Wypróbuj online!

Trywialna odpowiedź. Zwraca arglub ¯arg.

Zaoszczędzono 10 bajtów, nie będąc głupcem (dzięki Adám).

Zmieniono wynikowy 3-bajtowy na bardziej dopasowaną funkcję.


Zaraz, można to zrobić trywialnie w trzech bajtach!
Adám

Co ciekawe, masz już 3-bajtową odpowiedź osadzoną jako jej podłańcuch.
Adám

@ Adám tak, wiedziałem, że jest tam prosta odpowiedź. Dzięki.
J. Sallé

2

Język maszyny Turinga , 39 bajtów

Pozytywny

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

Negatyw

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

Ten był nieco trudniejszy niż myślałem, głównie dlatego, że musiałem pozbyć się uprzedzeń do posiadania kodu, który działa z błędami „kompilacji”.


2

> <> , 5 4 bajtów

n-r0

używa inicjalizacji stosu z -vopcją, umieść tam zmienną wejściową.

Wypróbuj online!

Lub spróbuj odwrócić

Wyjaśnienie

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

Stack Cats -mn , 2 bajty

-X

Wypróbuj online!

Spróbuj na odwrót!

Wyjaśnienie

Okazuje się, że jest to o wiele łatwiejsze niż poprzednie wyzwanie w Stack Cats. Pełny program (po złożeniu wniosku -m) tutaj -X-. Xsłuży do zamiany stosów po lewej i prawej stronie głowicy taśmy, tzn. nie wpływa w ogóle na początkowy stos, więc możemy go zignorować. Ale wtedy program jest właściwie sprawiedliwy-- (dwukrotnie neguje górę stosu), co nic nie robi.

W przypadku programu odwrotnego zastosowanie -mdaje X-X. Ponownie Xnic nie robi, więc program jest właściwie sprawiedliwy- , co neguje górę stosu.

Jedyne inne rozwiązanie 2-bajtowe jest -=, ale jest praktycznie takie samo. Jedyna różnica polega na tym= zamienia się tylko wierzchołki sąsiednich stosów, a nie całe stosy.

Ale znowu używanie -mczuje się trochę jak oszukiwanie, dlatego poniżej znajduje się rozwiązanie, które wykorzystuje w pełni dublowany program.


Stack Cats -n , 7 bajtów

:I<->I:

Wypróbuj online!

Spróbuj na odwrót!

Wyjaśnienie

Nadal obowiązują rozważania z poprzedniej odpowiedzi : każde poprawne rozwiązanie wymaga użycia sparowanych znaków i I. Sześć możliwych rozwiązań (zawartych w łączu TIO) jest praktycznie takich samych. -i _są równoważne w tym programie i :mogą być zastąpione przez |lubT (które robią to samo dla wejść niezerowych i jednocześnie działają również dla wejść zerowych). Właśnie wybrałem ten do wyjaśnienia, ponieważ jest to najłatwiejsze.

Pamiętaj więc, że początkowy stos zawiera dane wejściowe na górze -1(na nieskończenie wielu zerach), podczas gdy wszystkie inne stosy wzdłuż taśmy zawierają tylko zera. Stack Cats ma również właściwość polegającą na tym, że żaden program o parzystej długości nic nie robi (pod warunkiem, że się zakończy, ale i tak nie możemy użyć pętli do tego wyzwania). To samo dotyczy oczywiście każdego programu o nieparzystej długości, którego środkowa postać nic nie robi ... zobaczmy:

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

Dlatego druga połowa programu dokładnie cofa pierwszą połowę i ponownie otrzymujemy dane wejściowe na początku -1.

Program odwrotny to :I>-<I:. Zobaczmy, jak to zmienia rzeczy:

:    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

Partia, 34 bajty

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

Echa ( ECHO.) wejście ( %1). Reszta pierwszego wiersza technicznie przekierowuje STDERRdo pliku o nazwie MER@, ale nie ma to wpływu.
Drugi wiersz jest skomentowany ( REM...).

Wywrócony

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

Używa trybu arytmetycznego polecenia set ( SET /a) do odejmowania ( -=) input ( %1) od niezdefiniowanej zmiennej ( a), która jest równoważna z 0 - input. Ponownie, reszta pierwszego wiersza technicznie przekierowuje STDERRdo pliku o nazwie MER@, ale to nie ma wpływu.
Drugi wiersz jest skomentowany ( REM...).


To wygląda interesująco. Chcesz to wyjaśnić?
Adám

@ Adám Dodano wyjaśnienie, a także zdałem sobie sprawę, że miałem te programy do tyłu.
Οurous

2

Brachylog , 2 bajty

&ṅ

Brachylog domyślnie wkłada z lewej strony i wychodzi z prawej.
&ignoruje cokolwiek po lewej i przekazuje dane wejściowe do funkcji w prawo.
ogranicza każdą ze stron, aby były zaprzeczonymi wersjami.

Wypróbuj online


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.