> <> (Рыба) 107 106 103 байта
<v}:{r&" "
1xv+
2<v+
v}<
<~v!?=&:&:
6.>ol2-?!;a
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o-+
^3<v ~}}r]~<
.40<
Попробуйте онлайн!
Это не супер случайно, но это случайно. Просто поместите строку и целое число в стек (пример: «Hello world!», 5).
Input: "Hello world!", 5
Output: H^\^]^eceeedldcdeclgfffhowhhfggojkkkkrdccedl]]\]\d
Полное объяснение
Это немного более старая версия кода, пока я не обновлю объяснение. Это в основном то же самое, просто, может быть, немного легче читать:
< v}:{r&" "
+1xv
+2<v
}
:&:<~ v!?=&
?!;a6.>ol2-
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
Мы притворимся, что строковый параметр is, sа целочисленный параметр is i.
< v}:{r&" "
Он <приказывает рыбе немедленно сдвинуться влево, что оборачивается вокруг " ", что добавляет пространство, обозначенное в стопке. Затем рыба путешествует &, что добавляет место в регистр. rпереворачивает стек и {:}сдвигает стек влево (помещая iконец стека), копирует значение в конец стека и затем сдвигает его вправо. vговорит рыбе начать движение вниз.
+1xv
+2<v
}
xприказывает рыбе двигаться в произвольном направлении, в результате чего рыба движется направо и продолжает движение вниз, либо переходит 1+или 2+заранее. Они добавляют 1 или 2 соответственно к числу в конце стека. Если рыба движется вверх, она vснова попадает и спускается вниз. }сдвигает стек вправо, затем имеет iпозицию 1 в стеке и эту новую переменную в позиции 0 (мы назовем ее m).
:&:<~ v!?=&
Этот раздел является функцией, назовем ее whitespaceTrimmer . Это начинается там, где <есть. Он просто удаляет пробелы, которые находятся в конце стека (то есть в начале строки), пока не встретится непробельный символ.
Таким образом, рыба немедленно плывет в <и должна двигаться влево. Затем он сталкивается с:&:& копирует значение, которое копирует значение в конец стека, помещает пространство из регистра в конец стека, копирует его и помещает обратно в регистр.
Затем рыба попадает =?!v ~, или, точнее говоря, =извлекает последние два значения (два, которые мы только что создали) из стека, сравнивает их, помещает 1 в конец стека, если они равны, и 0 на конец стека, если они разные. ?Выскакивает новое значение с конца стека, если 0 оно не выполняет следующую инструкцию, которая в данном случае !, вместо этого он исполняет v, который заказывает рыбу двигаться вниз (выход из функции).
Однако, если он равен 1, то он нашел пробел, поэтому он выполняет !батут, и это заставляет рыбу пропустить следующую инструкцию, которая является v, и рыба продолжает. Перед рыбой он видит, ~что говорит ему выкинуть последнее значение из стека (подтверждено, что это пробел), затем рыба продолжает и снова запускает функцию.
?!;a6.>ol2-
Рыбе немедленно приказывают плавать прямо на a >, затем вывести последний символ в стеке o(который при первом запуске является первым символом s). Он получает длину стека l, помещает a 2в конец стека и затем -вычитает 2 из l. Это поражает, ?!;что, помня, что ?делает, заставляет рыбу пропускать! если стек пуст, и приземляется ;, что завершает программу.
Следуя, если в стеке все еще есть символы, мы выполняем, !что заставляет рыбу подпрыгивать над ;и выполнять a6., который хранит a(AKA 10), и 6в конце стека, которые являются x, yкоординатами для. которых они выталкиваются из конца стека, затем телепортирует рыбу 10, 6и выполняет инструкцию справа от этого положения (поскольку рыба плывет вправо).
Это менее сложно, чем кажется, когда вы понимаете, что yпозиция 6 - это линия ниже этой. xпозиция 10 есть v, а справа от этого есть , что не может. Это заставляет рыбу продолжать плавать правильно и фактически начинать выполнение в начале строки ...
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
Так что это функция, которая добавляет случайный текст между символами. Это немного глоток, но это только потому, что я пытался сделать это немного более случайным. Давайте назовем это genRandomChars .
:{{:}l1-[rvФактически установка для функции, и менее , так часть самой фактической функции. Рыба сначала переплывает, :{{что копирует значение в конец стека, затем дважды сдвигает его влево. Если вы вспомните, что это iбыло в позиции 1 в стеке, то вы бы знали, iчто теперь это конец стека.
Рыба затем переплывает то, :}что копирует i, и сдвигает стопку вправо, помещая ее iкак в начало, так и в конец стопки. l1-[пусть рыба поместит длину в конец стека, вычтет из нее 1, а затем [создаст новый стек, переместив l-1(длина стека минус 1) значения в новый стек (поэтому просто оставляя iв старом стеке). Затем рыба просто ударяется, rvчто снова переворачивает стопку (я думаю, что создание новой стопки переворачивает ее по какой-то причине), и приказывает рыбе снова плавать вниз, действительно начиная функцию с< ниже.
Так что в настоящее время конец стека имеет mи наш временный i, который мы будем называть ti. Сразу же рыба переплывает 1-}, что вычитает 1 из tiи перемещает его в начало стека. Затем, :}который просто копирует mи перемещает его в начало стека (помещаяti в позицию стека 1).
Это когда мы попали в эту маленькую вещь:
v2<
<1x|!
^3<
Это на самом деле очень просто. !Заставляет рыбу пропустить |и выполнить x. Помня, что xделает, мы помним, что это заставляет рыбу двигаться в любых 4 направлениях. |просто зеркало, и заставляет рыбу плыть обратноx . Таким образом, по сути, рыба поместит 1, 2 или 3 в конец стека и продолжит движение влево, оборачиваясь вокруг.
Затем выполняется выполнение fish, в результате *+oчего последние два значения в стеке отбрасываются, умножаются вместе, и результат возвращается обратно, затем то же самое с добавлением, затем окончательное значение отбрасывается из стека и выводится с помощью o. Наш стек теперь относительно нормально снова , содержащий только [ m, ti,s ].
:}}:приводит к тому, что значение на конце стека (в основном sпозиция 0) не копируется, затем стек сдвигается вправо дважды ( tiснова помещается на переднюю часть), а затем tiкопируется. ?!vдолжно быть довольно легко понять сейчас. В основном, если ti0, то мы выходим из функции с помощью v, в противном случае мы выполняем !и пропускаемv (делая еще один цикл).
Если tiравно 0, и мы закончили выводить немного случайные символы, тогда мы выполняем vи видим:
v ~}}r]~<
.43<
Здесь нет ничего особенного. Удаляем tiиз стека через ~. Затем ]новый, он выталкивает все наши значения из стека и помещает их в старый стек! Из - за этого вопроса разворота мы с обратной r, то сдвигать стек вправо дважды }}~, shufting стек справа, что дает нам [ m, i,s ], то ~есть , чтобы удалить лишнюю дублированныйs[0] ранее в функции , как мы должны были бы, если мы делали петлю (но мы не, мы уходим). vговорит рыбе плыть вниз и в >34.(инвертировано, чтобы показать порядок выполнения), что говорит рыбе просто плыть влево и внутрь 3, 4(потому что. это прыжок!). 3, 4на самом деле только справа от началаwhitespaceTrimmer, что идеально, потому что мы едем налево.
Следуя всей этой логике, мы можем следовать за рыбой до тех пор, пока стек в конечном итоге не станет пустым и программа не выйдет сразу после whitespaceTrimmerвыполнения.