> <> (Рыба) 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
должно быть довольно легко понять сейчас. В основном, если ti
0, то мы выходим из функции с помощью v
, в противном случае мы выполняем !
и пропускаемv
(делая еще один цикл).
Если ti
равно 0, и мы закончили выводить немного случайные символы, тогда мы выполняем v
и видим:
v ~}}r]~<
.43<
Здесь нет ничего особенного. Удаляем ti
из стека через ~
. Затем ]
новый, он выталкивает все наши значения из стека и помещает их в старый стек! Из - за этого вопроса разворота мы с обратной r
, то сдвигать стек вправо дважды }}~
, shufting стек справа, что дает нам [ m
, i
,s
], то ~
есть , чтобы удалить лишнюю дублированныйs[0]
ранее в функции , как мы должны были бы, если мы делали петлю (но мы не, мы уходим). v
говорит рыбе плыть вниз и в >34.
(инвертировано, чтобы показать порядок выполнения), что говорит рыбе просто плыть влево и внутрь 3, 4
(потому что.
это прыжок!). 3, 4
на самом деле только справа от началаwhitespaceTrimmer
, что идеально, потому что мы едем налево.
Следуя всей этой логике, мы можем следовать за рыбой до тех пор, пока стек в конечном итоге не станет пустым и программа не выйдет сразу после whitespaceTrimmer
выполнения.