s
><> (Рыба), 107 106 103 байт
Попробуйте онлайн!
:}}:
Это не суперслучайно, но это случайно. Просто поместите строку и целое число в стек (Пример: «Привет, мир!», 5).
Полное объяснение
s
Это немного более старая версия кода, пока я не обновлю объяснение. В основном то же самое, просто, может быть, немного легче читать: ti
and the integer parameter is m
.
o
Мы притворимся, что строковый параметр *+o
tells the fish to immediately move left, which wraps around to x
|
, which adds the space to the register. x
, который добавляет в стек пробел. Затем рыба путешествует x
shifts the stack to the left (putting |
переворачивает стек и !
tells the fish to begin moving downwards.
v2<
<1x|!
^3<
ti
tells the fish to move in a random direction, ultimately resulting in the fish going right and continuing downwards, or pass over m
в конце стека), копирует значение в конце стека, а затем сдвигает его вправо. :}
beforehand. These add 1 or 2 respectively to the number on the end of the stack. If the fish travels upwards, it hits ti
или 1-}
shifts the stack to the right, then having ti
снова и возвращается вниз. i
).
m
в позиции 1 в стеке, а эта новая переменная в позиции 0 (мы назовем ее Этот раздел представляет собой функцию, назовем еепробелыТриммер <
is. It simply strips spaces that're on the end of the stack (so the beginning of the string) until it runs into a non-space character.
. Оно начинается там, где rv
and must travel to the left. It then runs into i
И сразу же рыба плывет в
который копирует значение в конец стека, помещает пространство из регистра в конец стека, копирует его, а затем помещает обратно в регистр. l-1
, or more specifically, [
Затем рыба попадает l1-[
pops the new value off the end of the stack, if it is 0 it doesn't execute the next instruction, which in this case is i
, который извлекает два последних значения (два, которые мы только что создали) из стека, сравнивает их, помещает 1 в конец стека, если они равны, и 0 в конец стека, если они равны. другой. i
, which orders the fish to move downwards (exiting the function).
, вместо этого он выполняет :}
which is a trampoline, and that causes the fish to skip the next instruction, which is a i
Однако если это 1, то он нашел пробел и выполняет команду i
which tells it to pop the last value off the stack (confirmed to be a space), then the fish continues, and runs the function again.
:{{
, поэтому рыба продолжается. Перед рыбой она видит :{{:}l1-[rv
, then output the last character on the stack by :{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
Рыбе немедленно приказывают плыть прямо мимо v
). It gets the length of the stack from x
(который при первом запуске является первым символом y
on the end of the stack, then 10, 6
, помещает .
. It hits x, y
заставляет 2 вычитаться из 6
does, causes the fish to skip the 10
который, помня что a
, which ends the program.
если стек пуст, и приземлиться на a6.
which causes the fish to bounce over the ;
Далее, если в стеке еще есть символы, мы выполняем !
, which stores ;
и выполнить !
), and ?
(АКА ?!;
coordinates for l
на конце стека, которые -
, and execute the instruction to the right of that postion (as the fish is swimming right).
, который выталкивает их из конца стопки, а затем телепортирует рыбу в 2
position 6 is the line below this one. l
Это не так сложно, как кажется, когда вы понимаете, s
, and to the right of that is , which is a no-op. This causes the fish to continue swimming right and actually begin execution at the beginning of the line...
o
позиция 10 тогда Итак, это функция, которая добавляет случайный текст между символами. Это немного сложновато, но это только потому, что я постарался сделать его немного более случайным. Давайте назовем это.
genRandomChars >
is actually the setup for the function, and less-so part of the actual function itself. The fish first swims over ?!;a6.>ol2-
~
was at postion 1 on the stack, then you'd know v
который копирует значение в конце стека, а затем дважды сдвигает его влево. Если ты помнишь это
теперь находится в конце стека. !
which copies v
Затем рыба подплывает !
both at the beginning and end of the stack. ?
и сдвигает стек вправо, помещая =
creates a new stack, moving =?!v ~
просит рыбу положить длину в конец стопки, вычесть из нее 1, затем :&:&
on the old stack). Then the fish simply hits <
(длина стека минус 1) в новый стек (поэтому просто оставляем <
below.
который снова переворачивает стек (я думаю, что создание нового стека по какой-то причине меняет его) и приказывает рыбе снова плыть вниз, на самом деле начиная функцию с :&:<~ v!?=&
and our temporary m
Итак, в настоящее время конец стека имеет i
. Immediately the fish swims over }
, который мы назовем v
and moves it to the beginning of the stack. Then 2+
, что вычитает 1 из 1+
and moves it to the beginning of the stack (putting x
который просто копирует
в позиции стека 1).
+1xv
+2<v
}
На самом деле это очень просто. v
causes the fish to skip i
и выполнить {:}
. Remembering what r
да, мы помним, что это заставляет рыбу двигаться в любых 4 направлениях. &
is simply a mirror, and causes the fish to swim back to " "
. Таким образом, рыба поместит 1, 2 или 3 в конец стека и продолжит двигаться влево, оборачиваясь.
Затем рыба выполняет <
which causes the last two values on the stack to be popped off, multiplied together, and the result push back on, then the same thing with addition, then the final value is popped off the stack and outputted with < v}:{r&" "
. Наш стек теперь снова относительно нормальный и содержит только [ i
, s
, < v}:{r&" "
+1xv
+2<v
}
:&:<~ v!?=&
?!;a6.>ol2-
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o+*
^3<v ~}}r]~<
.43<
].
Input: "Hello world!", 5
Output: H^\^]^eceeedldcdeclgfffhowhhfggojkkkkrdccedl]]\]\d
causes the value on the end of the stack (basically <v}:{r&" "
1xv+
2<v+
v}<
<~v!?=&:&:
6.>ol2-?!;a
:{{:}l1-[rv
v2<
<1x|!}:}-1<v!?:{{:o-+
^3<v ~}}r]~<
.40<
позиция 0) не копируется, тогда стек дважды сдвигается вправо (помещая def c(s:String,i:Int)=s.filter(_>32).mkString(scala.util.Random.alphanumeric.take(i).mkString)
on the front again), then HfKIedb3l<-Ul%}vod"Bw\"|oa`%rH-}l/-{dMS;!B#X
копируется. 3, "Hello world!"
should be pretty easy to understand by now. Basically if String.chars
равно 0, то мы выходим из функции с помощью (n,s)->s.chars().forEach((c)->{if(c>32)for(int i=0;i<=n;)System.out.print((char)(++i==1?c:33+Math.random()*94));})
, otherwise we execute TVghrveVp Rpti+r0sea3a9nsIjuRXrAReJ; +di=ys`{ ikhKTe4trTZesz
и пропустить `char$40+n?87
//Possible characters.
()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~
(doing another loop).
Если s:"The treasure is here"
n:2
is 0 and we are done outputting slightly random characters, then we execute (,/)({""sv((,/)x;10h$40+n?87)}':)s
и посмотрите:
raze{""sv(raze x;`char$40+n?87)}prior s
(,/)({""sv((,/)x;`char$40+n?87)}':)s
Здесь нет ничего особенного. Мы удаляем >E "The treasure is here" 2
TkZhf(e&Rt@FrS,edha+-sJTuh.rX@eVKi+3s<7hftey8r*/e
from the stack via E() { N=${1// /};paste <(fold -1<<<$N) <(tr -cd "\\40-\\176"<\/dev\/urandom|head -c$(($2*${#N}-$2))|fold -$2)|tr -d '\t\n';}
. Затем lS- e# Read line and remove spaces.
l~ e# Read and evaluate another line.
f{ e# For each character (passing in N)...
{ e# Do this N times...
95mr e# Push random integer in [0, 95).
Sc+ e# Add to space character, giving a random printable ASCII character.
}*
}
e# All characters remaining on the stack are printed implicitly
e# at the end of the program.
is new, it pops all our values off the stack and places them on the old stack! Because of the reversal issue we reverse with n
, затем дважды сдвиньте стек вправо с помощью lS-(ol~f{{95mrSc+\}*}
, shufting the stack to the right, giving us [ function(x,n,l=nchar(x))for(i in 1:l)cat(substr(x,i,i),if(i<l)intToUtf8(sample(32:126,n)),sep="")
, n
, x
], (s,n)=>String.raw({raw:s.split` `.join``},...[for(_ of s)String.fromCharCode(...[for(_ of Array(n))Math.random()*95+32])])
is to remove the extra duplicated (s,n)=>s.replace(/. */g,x=>x[0]+String.fromCharCode(...[...Array(n)].map(_=>Math.random()*95+32)))
из ранее описанной функции, поскольку она нам понадобилась бы, если бы мы выполняли цикл (но это не так, мы выходим). (s,n)=>s.replace(/. */g,x=>x[0]+String.fromCharCode(...[for(_ of Array(n))Math.random()*95+32]))
tells the fish to swim down and into from random import*
f=lambda s,n:s and(' '<s[0])*eval('s[0]'+'+chr(randint(32,126))'*n)+f(s[1:],n)
(перевернут, чтобы показать порядок выполнения), который говорит рыбе просто плыть влево и внутрь. random
(because the (:)'
это прыжок!). s
is actually just to the right of the beginning s(s>32)
, что идеально, потому что мы движемся влево.
Следуя всей этой логике, мы можем следить за рыбой до тех пор, пока стек не станет окончательно пустым и программа не завершится сразу после этого. n
is executed.