> <>(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执行后立即退出程序。