> <> (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, s
a 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. r
odwraca stos i {:}
przesuwa stos w lewo (umieszczenie i
na końcu stosu), kopiuje wartość na końcu stosu, a następnie przesuwa go w prawo. v
mówi rybie, aby zaczęła poruszać się w dół.
+1xv
+2<v
}
x
każ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 v
ponownie i płynie z powrotem w dół. }
przesuwa stos w prawo, a następnie ma i
pozycję 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 2
na 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 6
na końcu stosu, którego x, y
współrzędne są współrzędne .
, co wyskakuje z końca stos, następnie teleportuje rybę 10, 6
i 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 y
pozycja 6 to linia poniżej tego. x
pozycja 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-[rv
rzeczywistoś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 i
było to w pozycji 1 na stosie, to wieszi
teraz jest na końcu stosu.
Ryba następnie przepływa przez :}
które kopie i
i przesuwa stos w prawo, umieszczając i
zaró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 i
stary stos). Następnie ryba po prostu uderza, rv
co 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 m
nasz tymczasowy i
, który nazwiemy ti
. Ryba natychmiast przepływa 1-}
, co odejmuje 1 ti
i przenosi ją na początek stosu. Następnie, :}
który po prostu kopiuje m
i przenosi go na początek stosu (umieszczenie ti
w 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 x
robi, 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, *+o
co 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 s
skopiowanie wartości na końcu stosu (zasadniczo pozycja 0), następnie stos jest dwukrotnie przesuwany w prawo ( ti
ponowne umieszczanie na przodzie), a następnie ti
kopiowany. ?!v
do tej pory powinno być dość łatwe do zrozumienia. Zasadniczo, jeśli ti
wynosi 0, to wychodzimy z funkcji za pomocą v
, w przeciwnym razie wykonujemy !
i pomijamy v
(wykonując kolejną pętlę).
Jeśli ti
ma wartość 0 i skończyliśmy wyprowadzać nieco losowe znaki, wówczas wykonujemy v
i widzimy:
v ~}}r]~<
.43<
Nic nadzwyczajnego. Usuwamy ti
ze 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). v
każ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, 4
jest 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 whitespaceTrimmer
wykonaniu.