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*x
jest w porządku, ale x+x
jest 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.
źródło
()
palindromic? Technicznie jest odwrotnie)(
.Odpowiedzi:
Befunge
Whoa, to była praca, nawet z redaktorem, który podjąłem na to wyzwanie. Oto, co mam, niezły blok 11x12:
Robi kilka rzeczy, niestety tylko dla małych liter.
Co to robi
Podczas normalnego działania wykonuje na wejściu szyfr Cezara .
Po odwróceniu w poziomie odwraca wspomniany szyfr. Jest to wymóg dotyczący wyzwania, ale na tym się nie kończy.
Po odwróceniu w pionie szyfruje dane wejściowe odwrotnym alfabetem. Można to uznać za odwrotne podejście do szyfru Cezara.
Wreszcie, po obróceniu o 180 stopni, odwraca wejście. Mam wrażenie, że to musi być odwrotność czegoś (wskazówka: dane wejściowe).
Jak to działa
Blok zasadniczo składa się z czterech częściowo nakładających się algorytmów.
Enkoder szyfrujący Cezar
Dekoder szyfru Cezar (odwrócony w poziomie)
Szyfr odwrotnego alfabetu (odwrócony w pionie)
Odwracanie tekstu (obrócone o 180 stopni)
źródło
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
->A
lubC
->B
źródło
Cudowny
Oto prosty sposób na rozpoczęcie nas. Odczytuje jeden znak ze STDIN, zwiększa i drukuje go.
Jeśli obrócimy to o 180 ° (bez zamiany nawiasów) lub lustro w osi X, otrzymamy
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
00
Jest 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.
źródło
}0
i używasz go jako płyty głównej?}0
jako dokładność w wierszu poleceń.Cudowny
Ta tablica pobiera jeden argument (
x
) i zwraca(101 * x) mod 256
.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.Sprawdź to tutaj . Płytki cylindryczne i biblioteki dołączania powinny być sprawdzane.
Przykład Wejście / Wyjście :
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.
101
został 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 odwrotna109
, która jest dogodna odległość 8 od101
.Krótkie wyjaśnienie
Kolumna zawierająca komórki (od góry do dołu)
@0 >0 -- 65 @0
działa tak samo na obu tablicach i pętli101
razy przed przejściem w prawo. Po obu stronach>0
gałę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 * x
działa sama, dopóki płyta nie zostanie zakończona.Dp
po prostu drukuje wynik jako liczbę dziesiętną.źródło
Tezeusz
Można to uznać za lukę, ale podoba mi się ten język, więc proszę bardzo. Ten program definiuje funkcję
f
liczb naturalnych, która mapuje 3n do 3n + 1 , 3n + 1 do 3n + 2 i 3n + 2 do 3n , dla każdego n .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 pasujen
). 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.f
.f
według projektu .Wynik:
źródło
tr
Przykład:
Tylko prawdziwa odwrotność w dziedzinie ciągów, które nie zawierają zarówno „a”, jak i „b”.
źródło
tr abc bca
z wersją o odwróconej polaryzacjitr acb cba
.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
)Obracanie tej tablicy o 180 ° (ale pozostawianie zawartości każdej komórki niezmienionej) Zmienia program tak, aby pozostawił shift (
1000 0000 -> 0000 0001
)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):Są to dość proste tablice, obie pobierają dwie kopie danych wejściowych (które zajmują miejsce
}0
komó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, gdzieSb
przychodzą 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
Sb
płyty dla oryginalnego programu: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
Sb
musi spojrzeć na najmniej znaczący bit i powrócić,128
lub0
jest to trochę bardziej skomplikowane:Jeśli najmniej znaczący bit (w teście testowanym przez
^0
) ma wartość 0, zwraca po prostu 0. Jeśli jest jeden,^0
wyświetli1
. To nie powiedzie się z testem równości0
=0
i tym samym zostanie przesunięte w prawo. Następnie odejmujemy 2,-2
aby 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?)źródło