> <> (Ryba), 107 106 103 bajtów
<v}:{r&" "
1xv+
2<v+
v}<
<~v!?=&:&:
6.>ol2-?!;a
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o-+
^3<v ~}}r]~<
.40<
Wypróbuj online!
To nie jest super losowe, ale jest losowe. Wystarczy umieścić ciąg i liczbę całkowitą na stosie (przykład: „Witaj świecie!”, 5).
Input: "Hello world!", 5
Output: H^\^]^eceeedldcdeclgfffhowhhfggojkkkkrdccedl]]\]\d
Pełne wyjaśnienie
To jest nieco starsza wersja kodu, dopóki nie zaktualizuję wyjaśnienia. W większości jest taki sam, może nieco łatwiejszy do odczytania:
< v}:{r&" "
+1xv
+2<v
}
:&:<~ v!?=&
?!;a6.>ol2-
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
Udajemy, że parametrem ciągu jest, sa parametrem liczby całkowitej jest i.
< v}:{r&" "
<Mówi rybę od razu w lewo, który owija się wokół celu " ", który dodaje spację characted na stosie. Następnie ryba przemieszcza się &, co dodaje miejsce do rejestru. rodwraca stos i {:}przesuwa stos w lewo (umieszczenie ina końcu stosu), kopiuje wartość na końcu stosu, a następnie przesuwa go w prawo. vmówi rybie, aby zaczęła poruszać się w dół.
+1xv
+2<v
}
xkaże rybom poruszać się w losowym kierunku, co ostatecznie prowadzi do tego, że ryba idzie w prawo i kontynuuje w dół, lub przechodzi 1+lub 2+wcześniej. Dodaje to odpowiednio 1 lub 2 do liczby na końcu stosu. Jeśli ryba przemieszcza się w górę, uderza vponownie i płynie z powrotem w dół. }przesuwa stos w prawo, a następnie ma ipozycję 1 na stosie i tę nową zmienną w pozycji 0 (nazwiemy to m).
:&:<~ v!?=&
Ta sekcja jest funkcją, nazwijmy ją whitespaceTrimmer . Zaczyna się tam, gdzie <jest. Po prostu usuwa spacje, które znajdują się na końcu stosu (czyli na początku łańcucha), aż napotka znak spacji.
Tak więc ryba natychmiast wpada do <i musi skręcić w lewo. Następnie biegnie do:&:& której kopiuje wartość na końcu stosu, umieszcza przestrzeń z rejestru na końcu stosu, kopiuje ją, a następnie umieszcza z powrotem na rejestrze.
Następnie ryba uderza =?!v ~, a ściślej mówiąc, =co wyrywa dwie ostatnie wartości (dwie, które właśnie utworzyliśmy) ze stosu, porównuje je, umieszcza 1 na końcu stosu, jeśli są równe, a 0 na koniec stosu, jeśli są różne. ?Wyskakuje nową wartość od końca stosu, jeśli jest 0 to nie wykonać następną instrukcję, która w tym przypadku jest !, zamiast tego Wykonuje v, który nakazuje ryby, aby przenieść w dół (wyjście z funkcji).
Jeśli jednak ma wartość 1, to znalazło miejsce, więc wykonuje !trampolinę, co powoduje, że ryba pomija następną instrukcję, czyli a v, więc ryba kontynuuje. Przed rybą widzi, ~co mówi mu, aby zrzuciła ostatnią wartość ze stosu (potwierdzoną spacją), a następnie ryba kontynuuje i ponownie uruchamia funkcję.
?!;a6.>ol2-
Ryba natychmiast przepływa przez a >, a następnie wypuszcza ostatnią postać na stosie o(która, przy pierwszym uruchomieniu, jest pierwszą postacią s). Pobiera długość stosu l, umieszcza a 2na końcu stosu, a następnie -powoduje odjęcie 2 l. Uderza, ?!;co, pamiętając o tym, co ?powoduje, powoduje, że ryba przeskakuje, !jeśli stos jest pusty, i ląduje; , co kończy program.
Następnie, jeśli na stosie nadal znajdują się postacie, wykonujemy polecenie, !które powoduje, że ryba odbija się od niego ;i wykonujemy a6., który przechowuje a(AKA 10), a 6na końcu stosu, którego x, ywspółrzędne są współrzędne ., co wyskakuje z końca stos, następnie teleportuje rybę 10, 6i wykonuje instrukcje po prawej stronie tej pozycji (gdy ryba płynie w prawo).
Jest to mniej skomplikowane, niż się wydaje, gdy uświadomisz sobie, że ypozycja 6 to linia poniżej tego. xpozycja 10 jest wtedy v, a po jej prawej stronie , co jest opcją. Powoduje to, że ryba dalej pływa w prawo i faktycznie zaczyna wykonywanie na początku linii ...
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
Jest to funkcja, która dodaje losowy tekst między znakami. To trochę kęs, ale tylko dlatego, że starałem się, aby było trochę bardziej losowe. Nazwijmy to genRandomChars .
W :{{:}l1-[rvrzeczywistości jest to konfiguracja funkcji, a tym bardziej część samej funkcji. Ryba najpierw przepływa, nad :{{którą kopiuje wartość na końcu stosu, a następnie dwukrotnie przesuwa ją w lewo. Jeśli przypomnisz sobie, że ibyło to w pozycji 1 na stosie, to wieszi teraz jest na końcu stosu.
Ryba następnie przepływa przez :}które kopie ii przesuwa stos w prawo, umieszczając izarówno na początku, jak i na końcu stosu. l1-[ryba umieszcza długość na końcu stosu, odejmuje 1 od niego, a następnie [tworzy nowy stos, przenosząc wartości l-1(długość stosu minus 1) na nowy stos (pozostawiając tylko istary stos). Następnie ryba po prostu uderza, rvco ponownie odwraca stos (myślę, że utworzenie nowego stosu odwraca go z jakiegoś powodu), i każe rybom ponownie opłynąć w dół, naprawdę rozpoczynając funkcję na< poniżej.
Tak więc obecnie koniec stosu ma mnasz tymczasowy i, który nazwiemy ti. Ryba natychmiast przepływa 1-}, co odejmuje 1 tii przenosi ją na początek stosu. Następnie, :}który po prostu kopiuje mi przenosi go na początek stosu (umieszczenie tiw pozycji stosu 1).
Właśnie wtedy uderzamy w tę małą rzecz:
v2<
<1x|!
^3<
To jest naprawdę bardzo proste. !Powoduje ryby do pominąć |i wykonania x. Pamiętając, co xrobi, pamiętamy, że powoduje to, że ryba porusza się w 4 dowolnych kierunkach. |jest po prostu lustrem i powoduje, że ryba wraca do x. Zasadniczo ryba umieści 1, 2 lub 3 na końcu stosu i będzie kontynuować ruch w lewo, owijając się wokół.
Ryba następnie wykonuje, *+oco powoduje, że ostatnie dwie wartości na stosie są usuwane, mnożone razem, a wynik przesuwa się z powrotem, potem to samo z dodawaniem, a następnie końcowa wartość jest usuwana ze stosu i generowana za pomocą o. Nasz stos jest teraz stosunkowo znowu normalny zawierający tylko [ m, ti, s].
:}}:powoduje sskopiowanie wartości na końcu stosu (zasadniczo pozycja 0), następnie stos jest dwukrotnie przesuwany w prawo ( tiponowne umieszczanie na przodzie), a następnie tikopiowany. ?!vdo tej pory powinno być dość łatwe do zrozumienia. Zasadniczo, jeśli tiwynosi 0, to wychodzimy z funkcji za pomocą v, w przeciwnym razie wykonujemy !i pomijamy v(wykonując kolejną pętlę).
Jeśli tima wartość 0 i skończyliśmy wyprowadzać nieco losowe znaki, wówczas wykonujemy vi widzimy:
v ~}}r]~<
.43<
Nic nadzwyczajnego. Usuwamy tize stosu za pośrednictwem ~. Następnie ]jest nowy, usuwa wszystkie nasze wartości ze stosu i umieszcza je na starym stosie! Z powodu problemu odwracania odwrócić się r, a następnie przesunąć stos prawo dwukrotnie }}~, shufting stos do prawej strony, przedstawiając nam [ m, i, s], sygnał ~jest usunięcie Extra kopiowane s[0]z wcześniej funkcji jak my potrzebujemy go, jeśli robiliśmy pętlę (ale nie, wychodzimy). vkaże rybom płynąć w dół i do >34.(odwrócony, aby pokazać kolejność wykonywania), co oznacza, że ryba po prostu płynie w lewo i do 3, 4(bo .to skok!). 3, 4jest właściwie na samym początkuwhitespaceTrimmer, co jest idealne, ponieważ podróżujemy w lewo.
Postępując zgodnie z tą logiką, możemy podążać za rybą, aż stos będzie ostatecznie pusty i program zakończy się zaraz po whitespaceTrimmerwykonaniu.