> <>(FISH),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<
我们假设字符串参数为s
,整数参数为i
。
< v}:{r&" "
该<
通知的鱼立刻向左移动,其环绕于" "
,增加characted到堆栈空间。然后鱼越过&
,这增加了收银机的空间。r
反转堆栈并将{:}
堆栈向左移动(放在i
堆栈的末尾),将值复制到堆栈的末尾,然后将其向右移动。v
告诉鱼开始向下移动。
+1xv
+2<v
}
x
告诉鱼沿随机方向移动,最终导致鱼向右走并继续向下,或者越过1+
或2+
事先。它们分别在堆栈末尾的数字上加1或2。如果鱼向上运动,它将v
再次撞击并向下运动。}
向右移动堆栈,然后将其i
放在堆栈上的位置1处,并将此新变量放在位置0处(我们将其称为m
)。
:&:<~ v!?=&
这部分是一个函数,我们称其为whitespaceTrimmer。它从那里开始<
。它只是剥离堆栈末尾的空间(因此是字符串的开头),直到遇到非空格字符为止。
因此,鱼立即游入水中<
,必须向左移动。然后碰到:&:&
,将值复制到堆栈的末尾,将寄存器中的空间放到堆栈的末尾,复制它,然后将其放回寄存器。
然后,鱼击中=?!v ~
或更具体地将击中,=
这会将最后两个值(我们刚刚创建的两个)从堆栈中弹出,进行比较,如果相等,则将1放在堆栈的末尾,将0放在堆栈上如果它们不同,则返回堆栈的末尾。将?
新值弹出堆栈的末尾,如果为0,则不执行下一条指令(在本例中为)!
,而是执行v
,该指令命令鱼向下移动(退出该函数)。
但是,如果它是1,则说明它已经找到了一个空间,因此执行!
一条是蹦床的操作,这将导致鱼跳过下一条指令,即a v
,因此鱼继续操作。在鱼的前面,它看到~
哪个告诉它将最后一个值从堆栈中弹出(确认为空格),然后鱼继续运行,并再次运行该函数。
?!;a6.>ol2-
立即通过指示鱼游动>
,然后输出堆栈上的最后一个字符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
,我们记得这会使鱼向任何四个方向移动。|
只是一面镜子,使鱼游回x
。因此,基本上,鱼将1、2或3放在堆栈的末端,然后继续向左移动,环绕。
然后执行鱼操作*+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
执行后立即退出程序。