To jest pytanie uzupełniające do mojego pytania Puzzling.SE : Zapytałem, czy istnieje funkcja f mapująca ciągi logiczne na ciągi logiczne, tak że f (f (b)) = rewers (b) dla wszystkich ciągów wejściowych b . (Przez odwrotność rozumiem funkcję odwracającą kolejność bitów.)
Powyższy link zawiera pozytywną odpowiedź, z dowodem, przez wielkie f '' , ale możesz zastanowić się nad tym pytaniem przed spojrzeniem.
Zaimplementuj taką funkcję f w jak najmniejszej liczbie bajtów.
Możesz albo odczytać dane wejściowe ze STDIN, albo wziąć argument funkcji; i albo napisz wynikowy ciąg do STDOUT, albo zwróć go.
Tak czy inaczej, możesz pracować z rzeczywistymi ciągami dwóch różnych bajtów lub znaków do wyboru (powiedz
0
i1
, lub\x00
i i\x01
), lub z tablicami / listami wartości prawdziwych i fałszywych . Wybierz dwie wartości i trzymaj się ich.Wynikiem pojedynczego zastosowania f musi być sam ciąg binarny: żadne głupie odpowiedzi, takie jak
b -> if b starts with 'x' then reverse(b[1:]) else 'x' + b
...Twoja funkcja powinna być całkowita ; w szczególności wejściem może być pusty ciąg lub jeden bit długości itp. Nie ma górnej granicy długości łańcucha.
Powinno być również czyste : nie utrzymuj żadnego globalnego stanu między wywołaniami funkcji; ciąg wejściowy musi całkowicie określać ciąg wyjściowy.
Odpowiedzi:
CJam, 32 bajty
Wypróbuj online.
Za długo...
źródło
Python 2, 64
69bajtówNie golfowany:
Znajduje to okres struny, tj. Minimalny
p
taki, którys
jest ciągiem długościp
powtarzanymn
razy (znalazłem metodę golfa na SO). Jeśli więcn
jest nieparzyste, dodaje to jeszcze jedno powtórzenie okresu. Jeślin
jest równy, usuwa jedno powtórzenie okresu i odwraca go.Dzięki @ Sp3000 za pomoc w implementacji mapowania funkcji między 1 <-> 2, 3 <-> 4 itd.źródło
Perl,
4947 bajtówObejmuje +2 za
-lp
Oparty na bardzo fajnym algorytmie @ feersum
Uruchom z wejściem na STDIN, np
halfreverse.pl
:Wyjaśnienie
źródło