Odwróć biegunowość

12

Celem tego wyzwania jest napisanie programu spełniającego następujące warunki:

  • Program nie jest palindromiczny lub zasadniczo palindromiczny (co oznacza, że ​​możliwe jest usunięcie znaków, aby uczynić go palindromem bez zmiany efektów programu).

  • Program nie jest inwolucją (co oznacza, że ​​nie generuje oryginalnych danych wejściowych po uruchomieniu na danych wyjściowych)

  • Program odwróconej polaryzacji jest odwrotnością programu normalnego; więc kiedy odwrócony program jest uruchamiany na wyjściu normalnego programu, zwraca oryginalne wejście.

Co oznacza odwrócona polaryzacja ? Cóż, różni się między językami.

  • W przypadku większości nie-esolangów oznacza to również odwrócenie kolejności podoperacji w pojedynczej operacji, odwrócenie kolejności argumentów i odwrócenie zawartości zakodowanych list / tablic / krotek / słowników / stosów / kolejek / itp. jako odwrócenie kolejności bloków kodu i linii autonomicznych (ale nie linii w blokach)

Przykłady:

Haskell : x`mod`y-> y`mod`x; zipWith ((*3).(+)) [1,2,3] [4,5,6]->zipWith ((+).(*3)) [6,5,4] [3,2,1]

Python : 2**3-> 3**2; for x,y in [(1,2),(3,4),(5,6)]->for y,x in [(6,5),(4,3),(2,1)]

  • W przypadku języków, które mają funkcje 1-znakowe (jak Pyth, APL), po prostu odwróć ciąg instrukcji

  • W przypadku jednowymiarowych esolangów, takich jak BF, odwróć instrukcje lub zamień polaryzację; zamiany polaryzacji to []-> {}, +-> -, --> +, >-> <, <-> >, .-> ,i ,-> .(ale nie oba)

  • W przypadku dwuwymiarowych esolangów, takich jak Befunge, możesz albo wykonać odbicie wzdłuż osi x lub y, albo przekątną, obrócić o 180 stopni lub wykonać kombinację odbicia i obrotu

Operacje przemienne są dozwolone, ale operacje palindromiczne nie są: 2*xjest w porządku, ale x+xjest złe. Definicja odwrócenia polaryzacji jest dość luźna, ale użyj własnego osądu, co ma sens; celem nie jest znalezienie najbardziej sprytnej luki, ale znalezienie najbardziej sprytnego rozwiązania.

To konkurs popularności, więc bardzo sprytna luka może być popularna, ale staraj się trzymać w duchu tego wyzwania. Zwycięzca zostanie ogłoszony, gdy pojawi się co najmniej 10 rozwiązań z co najmniej 1 głosowaniem pozytywnym, i jest co najmniej jedno rozwiązanie z większą liczbą głosów pozytywnych niż zgłoszeń z co najmniej 1 głosowaniem pozytywnym; lub za 1 miesiąc, w zależności od tego, co nastąpi wcześniej. To jest moje pierwsze wyzwanie, więc postaraj się być uczciwy i konstruktywnie wyrazić opinię, ale daj mi również znać, czy jest to nieuzasadnione wyzwanie, czy w jakikolwiek sposób jest źle sklasyfikowane lub niejednoznaczne. Jeśli masz pytania dotyczące języka, który nie pasuje do żadnej z szufladek, które tu przedstawiłem, skomentuj, a ja zgodzę się na wolę społeczności, jeśli wystąpi silna potrzeba szczególnego wyjaśnienia lub zmiany zasad.

AKTUALIZACJA

Minął dokładnie 1 miesiąc od rozpoczęcia tego konkursu (akurat zdarzyło mi się to sprawdzić przez przypadek, nie wiedząc, że byłem na czas). Ponieważ jest to konkurs popularności, zwycięzcą (osuwiskiem) jest Pietu1998-Befunge . Mimo że dolne komponenty (odwracacz tekstu i alfabet wstecz) są jednościami, koder / dekoder nie są, więc nie ma problemu. Punkty bonusowe (w mojej opinii) za zarządzanie napisem „BEFUNGE” pośrodku. Osobiście podobała mi się nowość rozwiązania Theseus Zgarba , ponieważ język wygląda fajnie (jeśli jest ograniczony). Dziękujemy wszystkim za udział, a mimo że zwycięzca został wybrany, pozostawiam ten konkurs całkowicie otwarty i chętnie przyjmę przyszłe zgłoszenia.

archaephyrryx
źródło
1
Co rozumiesz przez program odwróconej polaryzacji jest odwrotnością normalnego programu? Czy wydajność różni się w jakiś sposób?
Sp3000,
Wykonuje odwrotną operację; kiedy odwrócony program jest uruchamiany na wyjściu normalnego programu, zwraca oryginalne wejście.
archaephyrryx
Przepraszamy za błąd; Nie słyszałem o tym wcześniej i wydawało mi się to trochę groteskowe, więc musiałem założyć, że to Esolang; Zmienię to.
archaephyrryx
1
Po prostu coś, co prawdopodobnie powinno zostać określone - czy ()palindromic? Technicznie jest odwrotnie )(.
Sp3000,
1
W przykładzie Haskell dlaczego argument funkcji nie jest tasowany do końca? Czy rewersy są wybierane w taki sposób, aby zachować bezpieczeństwo typu? Czy możemy wybrać niektóre szczegóły operacji odwrócenia polaryzacji?
John Dvorak,

Odpowiedzi:

41

Befunge

Whoa, to była praca, nawet z redaktorem, który podjąłem na to wyzwanie. Oto, co mam, niezły blok 11x12:

v$,g6<6g,$v
v,$ _^_ $,v
1W>v\B\v>L1
~T+:1E1:-O~
+F00-F-02L+
>:|6gUg6|:>
{a@>^N^>@z`
>1+|@G$| +>
:^9< E<  ^1
~>7^@_,#:>:
 xD>65 ^=P~
v,-\+**<  v

Robi kilka rzeczy, niestety tylko dla małych liter.

Co to robi

Podczas normalnego działania wykonuje na wejściu szyfr Cezara .

abcxyz      -> bcdyza
exampletext -> fybnqmfufyu

Po odwróceniu w poziomie odwraca wspomniany szyfr. Jest to wymóg dotyczący wyzwania, ale na tym się nie kończy.

bcdyza      -> abcxyz
fybnqmfufyu -> exampletext

Po odwróceniu w pionie szyfruje dane wejściowe odwrotnym alfabetem. Można to uznać za odwrotne podejście do szyfru Cezara.

abcxyz      -> zyxcba
exampletext -> vcznkovgvcg

Wreszcie, po obróceniu o 180 stopni, odwraca wejście. Mam wrażenie, że to musi być odwrotność czegoś (wskazówka: dane wejściowe).

abcxyz      -> zyxcba
exampletext -> txetelpmaxe

Jak to działa

Blok zasadniczo składa się z czterech częściowo nakładających się algorytmów.

Enkoder szyfrujący Cezar

v$,g6<
v,$ _^
1 >v\
~ +:1
+ 00-
>:|6g
{a@>^

Dekoder szyfru Cezar (odwrócony w poziomie)

v$,g6<
v,$ _^
1 >v\
~ -:1
+ 20-
>:|6g
`z@>^

Szyfr odwrotnego alfabetu (odwrócony w pionie)

v,-\+**<
   >65 ^
~>7^
:^9<
>1+|@
   >^

Odwracanie tekstu (obrócone o 180 stopni)

v  <
~      
:>:#,_@
1^  <
>+ |$
   >^
PurkkaKoodari
źródło
2
Podejrzewam, że Befunge ma tutaj niewielką przewagę, ponieważ zawsze możesz po prostu użyć lewej górnej ćwiartki i całkowicie zignorować to, co jest w pozostałej części kodu. Dobra robota!
Martin Ender
1
Łał! Muszę to głosować, mimo że oznacza to, że spadam na trzecie miejsce.
Level River St
18

Brainfuck, 5

,+.-,

Być może po raz pierwszy w historii Brainfuck tworzy odpowiedź konkurencyjną pod względem długości kodu. Szkoda, że ​​to nie pytanie do golfa.

Wprowadza bajt (znak), zwiększa go i wyprowadza wynik. Przecinek na końcu czeka na kolejne dane wejściowe, które jeśli zostaną podane, zostaną zignorowane. W specyfikacji nie ma nic o prawidłowym rozwiązaniu: -) *

* (lub o zrobieniu czegoś użytecznego z całym kodem w obu kierunkach)

Typowe wyniki (drugi znak, jeśli podano, jest ignorowany).

Prześlij: B->C

Odwróć: B-> Alub C->B

Level River St
źródło
11

Cudowny

Oto prosty sposób na rozpoczęcie nas. Odczytuje jeden znak ze STDIN, zwiększa i drukuje go.

--
]]
00
]]
++

Jeśli obrócimy to o 180 ° (bez zamiany nawiasów) lub lustro w osi X, otrzymamy

++
]]
00
]]
--

który odczytuje bajt ze STDIN i zmniejsza go.

Możesz to przetestować tutaj .

Mogę zajrzeć do bardziej skomplikowanych programów Marbelous, ale jestem pewien, że es1024 mnie pobije. ;)

Wyjaśnienie

00Jest marmur o wartości 0 (co jest dowolna). Te ]]urządzenia odczytać bajt z stdin - to znaczy, czy marmur spada przez nich wartość marmurowej zostaje zmieniona na bajt odczytu. Urządzenia ++i --po prostu zwiększają lub zmniejszają wartość marmuru (mod 256) i pozwalają mu spaść. Gdy marmur spada z planszy, bajt jest zapisywany w STDOUT.

Dlatego dwa urządzenia u góry są po prostu ignorowane, ponieważ przepływ sterowania nigdy do nich nie dociera.

Martin Ender
źródło
Alternatywnie możesz zastąpić swoje trzy środkowe rzędy jednym urządzeniem wejściowym.
overactor
@overactor A może masz na myśli }0i używasz go jako płyty głównej?
Martin Ender,
}0jako dokładność w wierszu poleceń.
overactor
5

Cudowny

Ta tablica pobiera jeden argument ( x) i zwraca (101 * x) mod 256.

.. @5 .. }0 }0 @1 .. @0 .. @2 .. 
.. /\ Dp << \\ .. &0 >0 &1 .. .. 
!! @3 .. << }0 .. \/ -- \/ .. }0 
@4 .. .. &0 @1 /\ &0 65 &1 /\ @2 
/\ Dp .. @4 .. .. @3 @0 @5 !! \\

Odbicie lustrzane komórek wzdłuż osi y da tablicę, która przyjmuje jeden argument ( y) i zwraca (101 * y + 8 * y) mod 256, co jest odwrotnością pierwszej tablicy.

.. @2 .. @0 .. @1 }0 }0 .. @5 ..
.. .. &1 >0 &0 .. \\ << Dp /\ ..
}0 .. \/ -- \/ .. }0 << .. @3 !!
@2 /\ &1 65 &0 /\ @1 &0 .. .. @4
\\ !! @5 @0 @3 .. .. @4 .. Dp /\

Sprawdź to tutaj . Płytki cylindryczne i biblioteki dołączania powinny być sprawdzane.

Przykład Wejście / Wyjście :

Original Board:      Mirrored Board:
Input   Output       Input    Output
025     221          221      025
042     146          146      042
226     042          042      226

Należy pamiętać, że Marbelous pozwala tylko na przekazywanie dodatnich liczb całkowitych jako argumentów, a te liczby całkowite są przekazywane do programu modulo 256 przez interpretera.

101został wybrany z dwóch powodów: jest to liczba pierwsza (i każde możliwe wejście do tego programu powoduje unikalne wyjście) oraz zaangażowana operacja odwrotna 109, która jest dogodna odległość 8 od 101.

Krótkie wyjaśnienie

Kolumna zawierająca komórki (od góry do dołu) @0 >0 -- 65 @0działa tak samo na obu tablicach i pętli 101razy przed przejściem w prawo. Po obu stronach >0gałęzi znajduje się inny synchronizator; wybór jednego zależy od tego, czy tablica jest dublowana, czy nie.

Z każdej strony, w synchronizacji z pętlą środkową, sygnał wejściowy jest wielokrotnie sumowany, uzyskując w ten sposób 101*x mod 256. Na odwróconej planszy dwie kopie wejścia są również dwukrotnie przesunięte w lewo ( input * 4), a następnie zsumowane i pozostawione w synchronizatorze.

Po zakończeniu pętli środkowej zsumowane kulki są wysyłane do drukowania, które znajduje się z boku płyty (po lewej stronie na oryginalną płytę, po prawej na odbicie lustrzane). Po wydrukowaniu !!osiągana jest komórka, kończąca płytkę. Zauważ, że pętla, która dała, 101 * xdziała sama, dopóki płyta nie zostanie zakończona.

Dp po prostu drukuje wynik jako liczbę dziesiętną.

es1024
źródło
5

Tezeusz

Można to uznać za lukę, ale podoba mi się ten język, więc proszę bardzo. Ten program definiuje funkcję fliczb naturalnych, która mapuje 3n do 3n + 1 , 3n + 1 do 3n + 2 i 3n + 2 do 3n , dla każdego n .

data Num = Zero | Succ Num

iso f :: Num <-> Num
  | n                          <-> iter $ Zero, n
  | iter $ m, Succ Succ Succ n <-> iter $ Succ m, n
  | iter $ m, Succ Succ Zero   <-> back $ m, Zero
  | iter $ m, Succ Zero        <-> back $ m, Succ Succ Zero
  | iter $ m, Zero             <-> back $ m, Succ Zero
  | back $ Succ m, n           <-> back $ m, Succ Succ Succ n
  | back $ Zero, n             <-> n
  where iter :: Num * Num
        back :: Num * Num

Theseus to odwracalny język ze składnią podobną do Haskella, w której każda funkcja jest odwracalna (pomijanie problemów z brakiem zakończenia). Jest wysoce eksperymentalny i przeznaczony do celów badawczych. Powyższy kod definiuje typ danych dla liczb naturalnych i funkcję f. Podany numer wejściowy dopasowuje się do wzoru po lewej stronie (zawsze pasuje n). Następnie spójrz na wzór po prawej stronie. Jeśli ten wzór ma etykietę (tutajiter), kontynuujesz dopasowywanie wzoru po lewej stronie i ponownie przyjmujesz odpowiednią wartość po prawej stronie. To się powtarza, aż po prawej stronie pojawi się nieznana wartość, i to jest twój wynik. Wzory po lewej i po prawej stronie muszą być wyczerpujące i nie nakładać się (osobno dla każdej etykiety). Teraz, aby „odwrócić polaryzację” f, wykonuję następujące czynności.

  • Zamień dwie wartości każdej etykiety. To nie zmienia semantyki f.
  • Zamień prawą i lewą stronę w korpusie funkcji. Definiuje to funkcję odwrotną f według projektu .

Wynik:

iso f :: Num <-> Num
  | iter $ n, Zero             <-> n
  | iter $ n, Succ m           <-> iter $ Succ Succ Succ n, m
  | back $ Zero, m             <-> iter $ Succ Succ Zero, m
  | back $ Succ Succ Zero, m   <-> iter $ Succ Zero, m
  | back $ Succ Zero, m        <-> iter $ Zero, m
  | back $ Succ Succ Succ n, m <-> back $ n, Succ m
  | n                          <-> back $ n, Zero
  where iter :: Num * Num
        back :: Num * Num
Zgarb
źródło
3

tr

a b

Przykład:

$ echo "apple" | tr a b
bpple
$ echo "bpple" | tr b a
apple

Tylko prawdziwa odwrotność w dziedzinie ciągów, które nie zawierają zarówno „a”, jak i „b”.

histocrat
źródło
W rzeczywistości musisz nieco bardziej ograniczyć domenę. Na przykład, jeśli zaczynasz od „torfowiska”, twój program i jego odwrotność dają „torfowisko” -> „torfowisko” -> „aog”. Tak więc każdy ciąg zawierający „b” stanowi problem (lub zawiera „a”, jeśli najpierw zastosujesz program odwrotny).
user19057,
Możesz używać tr abc bcaz wersją o odwróconej polaryzacji tr acb cba.
Christian Sievers
2

Kolejna cudowna odpowiedź

Oryginalne prawe przesuwa wejście wiersza poleceń (wartość 8 bitów), dodając wiodące, jeśli 1 zostanie utracone przez przesunięcie. ( 0000 0001 -> 1000 0000)

{0 ..
~~ ..
>> {0
-2 =0
.. ^0
\/ }0
}0 Sb
<< ..
\\ ..
:Sb
// ..
Sb >>
}0 ..
^7 }0
{0 \/

Obracanie tej tablicy o 180 ° (ale pozostawianie zawartości każdej komórki niezmienionej) Zmienia program tak, aby pozostawił shift ( 1000 0000 -> 0000 0001)

\/ {0
}0 ^7
.. }0
>> Sb
.. //
:Sb
.. \\
.. <<
Sb }0
}0 \/
^0 ..
=0 -2
{0 >>
.. ~~
.. {0

Możesz to przetestować tutaj . (musisz włączyć opcję „Wyświetl dane wyjściowe jako liczby dziesiętne”)

Wyjaśnienie

Oba programy składają się z dwóch płyt, płyty głównej (która pobiera dane z wiersza poleceń) i Sb. Przyjrzyjmy się obu wersjom płyty głównej, patrząc tylko na komórki, do których można dotrzeć w ich odpowiedniej orientacji (ponieważ kulki zwykle nie mogą iść w górę, a urządzenia wejściowe nie są na górze):

original:      flipped:
   }0          }0
}0 Sb          .. }0
<< ..          >> Sb
\\ ..          .. //

Są to dość proste tablice, obie pobierają dwie kopie danych wejściowych (które zajmują miejsce }0komórek. Oryginał podaje jedną wersję do lewego urządzenia przesuniętego, <<wersja odwrócona umieszcza je w prawym urządzeniu przesuwającym. >>Wykonują przesunięcie bitów, ale niestety odrzucają dowolne Zagubione bity. Tam, gdzie Sbprzychodzą płytki, sprawdzają, czy przesunięcie bitów wartości, którą są podawane, spowoduje, że bit zostanie utracony, i zwrócą wartość, która zostanie dodana do wyniku, aby przeciwdziałać utraconemu bitowi.

Oto odpowiednia część oryginalnej Sbpłyty dla oryginalnego programu:

}0
^7
{0

Ten jest niezwykle łatwy, `^ 7 'sprawdza wartość najbardziej znaczącego bitu. Jeśli ten ma wartość 1, wykonanie przesunięcia w lewo spowoduje utratę tego bitu. Tak więc ta tablica wyprowadza wartość tego bitu jako 8-bitową wartość, która zostanie dodana do wyniku przesunięcia bitów.

W wersji odwróconej Sbmusi spojrzeć na najmniej znaczący bit i powrócić, 128lub 0jest to trochę bardziej skomplikowane:

}0
^0 ..
=0 -2
{0 >>
.. ~~
.. {0

Jeśli najmniej znaczący bit (w teście testowanym przez ^0) ma wartość 0, zwraca po prostu 0. Jeśli jest jeden, ^0wyświetli 1. To nie powiedzie się z testem równości 0 =0i tym samym zostanie przesunięte w prawo. Następnie odejmujemy 2, -2aby uzyskać 255, lewy Shift, >>aby uzyskać 127 i wykonujemy plik binarny, ~~aby nie uzyskać 128 (moglibyśmy również dodać jeden, ++aby uzyskać 128, ale gdzie to jest zabawne?)

overactor
źródło