Fueue是基于队列的esolang,其中正在运行的程序是队列。
)$$4255%%1(~):[)$$24%%0:<[~:)~)]~[$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]](H-):~:[)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:](106328966328112328136317639696111819119696281563139628116326221310190661962811611211962861109696289611619628116111612896281115421063633063961111116163963011632811111819159628151213262722151522061361613096119619190661966311961128966130281807072220060611612811961019070723232022060611
在线尝试!
这个怎么运作
这种解释可能会或可能不会失控。另一方面,我不知道如何以希望人们能效仿的方式将其解释得更短。
适当的备忘单
有关详细信息,请参阅esolang Wiki文章,包括该程序未使用的一些功能。
执行跟踪语法
除数字之间的空格外,Fueue中的空格是可选的。在以下执行跟踪中,它将特别用于建议程序结构:
- 当一个函数执行时,它及其参数将与周围的元素之间留有空格。如果某些参数很复杂,它们之间也可能存在空格。
- 许多执行轨迹在左侧分为一个“延迟斑点”,从右侧的一部分分离出来,进行大量的数据处理。请参阅下一节。
{}
轨迹中使用花括号(Fueue中未使用)来表示数学表达式的整数结果。这包括负数,因为Fueue只有非负文字,这-
是负函数。
各种元变量名称,...
用于表示值和缩写。
拖延战术
直观地,执行周期围绕队列进行,部分修改了它所经过的内容。在下一个循环之前,无法再次作用函数的结果。程序的不同部分只要不交互,就可以有效地并行发展。
结果,许多代码专用于同步,特别是将程序的某些部分的执行延迟到正确的时间。打高尔夫球有很多选择,这往往会使这些部分变成不可读的斑点,这些斑点只能通过逐周期跟踪其执行过程来理解。
这些策略在下面不会总是被单独提及:
)[A]
延迟A
一个周期。(可能是最简单,最易读的方法。)
~ef
交换元素e
,f
这也会延迟其执行。(可能是可读性最差的,但对于最短的延迟通常最短。)
$1e
延迟单个元素e
。
-
并且%
对于延迟数字很有用(后者用于0
和1
。)
- 连续延迟几个相等的元素时,
:
或$
可用于从单个元素创建它们。
(n
包裹n
在括号中,这可在以后方便移除。这对于数字计算尤为重要,因为数字太不稳定,以至于即使不先将它们放在块中也无法复制。
整体结构
其余的解释分为七个部分,每个部分用于运行程序的一部分。大部分重复之后的较大循环将被称为“迭代”,以将其与遍历整个队列的单次通过的“循环”区分开。
以下是初始程序在它们之间的分配方式:
A: )$$4255%%1(~
B: ):[)$$24%%0:<[~:)~)]~[$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]
C:
D: (H-
E:
F:
G: ):~:[)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:](106328966328112328136317639696111819119696281563139628116326221310190661962811611211962861109696289611619628116111612896281115421063633063961111116163963011632811111819159628151213262722151522061361613096119619190661966311961128966130281807072220060611612811961019070723232022060611
程序末尾的大数字将其余字符反向编码,每个字符两位,从每个ASCII值中减去30(例如,10
对(
。进行编码)。
在更高的层次上,您可以认为该程序中的数据(从bignum开始)从右向左流动,但控制从左向右流动。但是,在较低级别上,Fueue始终使代码和数据之间的区别变得混乱。
- G节将bignum解码为ASCII数字(例如,数字
0
作为整数48
),首先分割最低有效数字。每15个周期产生一位数字。
- F节包含产生的数字ASCII值(每个在一个块内),直到E节可以使用它们为止。
- E节一次处理两个产生的数字,将它们配对成表格的块
[x[y]]
,并打印每对的编码字符。
- D部分由一个嵌套的深度嵌套的块组成,这些
[x[y]]
块由这些块逐步构建而成,这样,一旦包含所有数字,就可以运行以打印所有数字,然后暂停整个程序。
- C节处理D节的构造,并重新创建E节。
- B节每隔30个周期重新创建C节及其自身。
- A部分递减计数,直到其他部分的最后一次迭代。然后中止B节并运行D节。
A节
A节负责安排程序的结束时间。减少到一个交换函数~
,需要4258个周期,然后对B部分进行调整,使其停止其主循环并开始运行D部分。
)$ $4255% %1 (~
)$%%%...%% %0 [~]
)$%%%...% %1 [~]
⋮
)$ %0 [~]
) $1[~]
)[~]
~
- 一个
$
函数创建以下内容的4255个副本,%
而(
将~
括号括起来。
- 每个循环
%
都用完最后一个循环,以在0
和之间切换以下数字1
。
- 当所有
%
s用完时,将$1
创建1个[~]
(实际上是NOP)副本,然后在下一个循环中)
删除括号。
B区
B节每隔30个周期处理自身的更新以及C节的新迭代。
) : [)$$24%%0:<[~:)~)]~[$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]
) [)$$24%%0:<[~:)~)]~[$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]] [BkB]
)$ $24% %0 :< [~:)~)] ~ [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<] [BkB]
)$ %...%%% %1 < < [~:)~)] [BkB] [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]
)$ %...%% %0 < [~:)~)[BkB]] [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]
)$ %...% %1 [~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]
⋮
) $1 [~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]]
) [~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]] (1)
~:) ~)[BkB] [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]
) : [BkB] ) [$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<] (2)
) [BkB] [BkB] $11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<
- 甲
:
复制的大块以下(一个拷贝简称为[BkB]
),然后)
去除第一复制括号。
$$24%%0
设置与A部分类似的倒计时。
- 在递减计数的同时,
:<
将变为<<
,并~
交换两个块,最后将代码放置在新节C中。
- 这两个
<
函数将两个最后的块打包为第一个块-在正常的迭代中这是多余的,但将允许~
from节最后执行其工作。
- (1)倒计时结束后,
)
取下外支架。接下来~:)
变成C ):
并将其~)
交换)
到C节代码的开头。
- (2)B节现在又回到了初始周期,而a
)
刚要去掉方括号,开始运行C节的新迭代。
在最后的迭代中,~
A部分的起始位置出现在上方的(1)点:
~ ) [~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]] (1)
[~:)~)[BkB][$11~)~<[[+$4--498+*-:~-10)):])<~][)))~]<]] )
的~
掉期)
跨越块并进入部分C,防止B节被再次运行。
C区
C节负责将新的数字字符对合并到D节的块中,并创建E节的新迭代。
下面显示了一个典型的迭代过程,其中包含x
并y
代表数字的ASCII码。在第一个迭代中,传入的“ D”和“ E”元素是初始元素[H]
,-
而不是因为先前的E部分都没有运行以产生任何数字字符对。
C D E
$11~ ) ~<[[+$4--498+*-:~-10)):])<~] [)))~] < [)))~[...]] [x[y]]
~~~ ~~~ ~~~ ~~) [[+$4--498+*-:~-10)):])<~] < [)))~] [)))~[...][x[y]]]
~~~ ~~~ ) ~ [[+$4--498+*-:~-10)):])<~] [)))~[)))~[...][x[y]]]]
~~~ ~ ) [)))~[....]] [[+$4--498+*-:~-10)):])<~]
~~[)))~[....]] )[[+$4--498+*-:~-10)):])<~]
[)))~[....]] ~[+$4--498+*-:~-10)):])<~
- 这使用了我为此答案发现的另一种同步方法。当您
~
连续有多个交换函数时,该行将在每个周期缩小到大约2/3(因为一个~
交换将在后面交换两个),但是偶尔会有~
s 的剩余部分会严重破坏仔细地操作后续操作。
$11~
产生这样的行。下一个在下~
一个<
块之间交换a 。另一个<
在末尾将新的数字对块(数字x和y为ASCII码)附加到D部分中。
- 在下一个循环中,该
~
行具有~~
余数,该余数将a ~
替换为以下内容)
。另一个<
将D节附加到[)))~]
块中。
- 接下来,被交换的
~
自身在D区中用新的E区代码交换下一个区。然后,一个新的剩余~
交换一个)
跨越,终于最后~~
在~
一排掉其中的一个跨越到E节就像)
已删除的括号内。
在最后一次迭代中,A 部分将B部分~
换成了)
C部分,但是C部分的寿命很短,以至于它已经消失了,)
结束于D部分的开头。
D区
D节处理打印最终的大数字并暂停程序。在大多数程序运行过程中,B–G节将在构建过程中进行惰性干预。
(H -
[H]-
⋮
[)))~[H-]] After one iteration of section C
⋮
[)))~[)))~[H-][49[49]]]] Second iteration, after E has also run
⋮
) [)))~[...]] [49[48]] Final printing starts as ) is swapped in
))) ~[...][49[48]]
)) )[49[48]] [...]
)) 49 [48][...] Print first 1
) )[48] [...]
) 48 [...] Print 0
)[...] Recurse to inner block
...
⋮
)[H-] Innermost block reached
H - Program halts
- 在程序的第一个循环中,a
(
将暂停功能包装H
在方括号中。甲-
如下,将被用作对于第一次迭代,而不是数字对一个虚设元件。
- 包含的第一个实数对是
[49[49]]
,对应11
于数字中的最后一个。
- 最后一个数字对
[49[48]]
(对应于10
数字的开头)实际上并未合并到该块中,但这并没有区别,因为)[A[B]]
和)[A][B]
等价,都变成了A[B]
。
在最后一次迭代之后,)
从B部分向右交换的数据到达,D部分的块被解块。将)))~
在每个子块的开头可以确保所有部件都按照正确的顺序执行。最后,最里面的块包含一个H
暂停程序。
E节
E部分处理由G部分产生的ASCII数字对的组合,并且都打印相应的编码字符,并向组合C和D向左发送一个带有组合对的块。
再次,下面显示了一个典型的迭代过程,该迭代过程用x
并y
代表了数字的ASCII码。
E F
~ [+$4--498+*-:~-10)):] ) < ~ [y] [x]
) [+$4--498+*-:~-10)):] < [x] [y]
+ $4- - 498 +*- :~ -10 ) ) : [x[y]]
+--- -{-498} +*- ~~{-10} ) ) [x[y]] [x[y]]
+-- - 498 +* -{-10} ~ ) x [y] [x[y]]
+- -{-498} + * 10 x )[y] [x[y]]
+ - 498 + {10*x} y [x[y]]
+ {-498} {10*x+y} [x[y]]
{10*x+y-498} [x[y]]
[x[y]]
- 交换输入的数字块,然后将y块附加到x块,然后复制整个对块。C和D部分将保留一份副本,直到最后。
- 另一个副本再次被解块,然后应用一系列算术函数来计算
10*x+y-498
编码字符的ASCII值。498 = 10*48+48-30
中,48
小号撤消的ASCII编码x
和y
同时30
从偏移编码00–99
到30–129
,其中包括所有可打印的ASCII。
- 然后,生成的数字将继续执行,并打印其字符。
F节
F节由包含数字ASCII码的惰性块组成。对于大多数运行的程序,此处最多会有两个,因为E节以与G生成它们的速度相同的速度消耗它们。但是,在最后的打印阶段,一些多余的0
数字将在此处收集。
[y] [x] ...
G节
G节负责在程序结尾处拆分大数字,首先是最低有效数字,然后将其ASCII码向左发送的块发送到其他节。
由于它没有暂停检查功能,因此0
当数字减少到0时,它将实际上继续产生数字,直到D节暂停具有该H
功能的整个程序。
[BkG]
缩写大起始代码块的副本,该副本用于自我复制以开始新的迭代。
在第一个周期中初始化:
) :~ : [)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:] ( 106328966328112328136317639696111819119696281563139628116326221310190661962811611211962861109696289611619628116111612896281115421063633063961111116163963011632811111819159628151213262722151522061361613096119619190661966311961128966130281807072220060611612811961019070723232022060611
) ~ ~ [)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:] [BkG] [10...11]
) [)[):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):]~:] ~ [BkG] [10...11]
) [):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):] ~ : [10...11] [BkG]
典型的迭代,N
表示要拆分的数字:
) [):~[)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+:5):] ~ : [N] [BkG]
) :~ [)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/]+ :5 ) : [N] : [BkG]
) ~ ~ [)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/] +5 5 ) [N] [N] [BkG] [BkG]
) [)~:~~([:~)*[):~[$1(+48]):~+]-:~~)10)~~]/] ~ 10 N [N] [BkG] [BkG]
) ~:~ ~ ( [:~)*[):~[$1(+48]):~+]-:~~)10)~~] / N 10 [N] [BkG] [BkG]
) ~ : [:~)*[):~[$1(+48]):~+]-:~~)10)~~] ( {N/10} [N] [BkG] [BkG]
) [:~)*[):~[$1(+48]):~+]-:~~)10)~~] : [{N/10}] [N] [BkG] [BkG]
:~ )*[):~[$1(+48]):~+]- :~ ~)10 ) ~ ~ [{N/10}] [{N/10}] [N] [BkG] [BkG]
~~) *[):~[$1(+48]):~+]- ~~10 ) ) [{N/10}] ~ [{N/10}] [N] [BkG] [BkG]
) ~ * [):~[$1(+48]):~+] -10 ~ ) {N/10} [N] [{N/10}] [BkG] [BkG]
) [):~[$1(+48]):~+] * {-10} {N/10} ) [N] [{N/10}] [BkG] [BkG]
) :~ [$1(+48]) :~ + {-10*(N/10)} N [{N/10}] [BkG] [BkG]
) ~ ~ [$1(+48] ) ~ ~ {N%10} [{N/10}] [BkG] [BkG]
) [$1(+48] ~ ) {N%10} ~ [{N/10}] [BkG] [BkG]
$1( + 48 {N%10} ) [BkG] [{N/10}] [BkG]
( {48+N%10} BkG [{N/10}] [BkG] New iteration starts
[{48+N%10}] ....
- 这里的延迟斑点特别多毛。但是,唯一的新延迟技巧是使用
+:5
而不是--10
延迟10
两个周期。las,程序中只有10
s个受此帮助。
- 在
[N]
和[BkG]
块复制,然后的一个副本N
除以10
。
[{N/10}]
被复制,然后使用更多的算术函数来计算N
as 的最后一位的ASCII码48+((-10)*(N/10)+N)
。带有此ASCII代码的块保留在F节中。
[{N/10}]
获取的另一个副本在[BkG]
块之间交换,以设置新迭代的开始。
奖励奎因(540字节)
)$$3371%%1[~!~~!)!]):[)$$20%%0[):]~)~~[)$$12%%0[<$$7%~~0):~[+----48+*-~~10))]<]<~!:~)~~[40~[:~))~:~[)~(~~/[+--48):]~10]+30])):]]][)[H]](11(06(06(21(21(25(19(07(07(19(61(96(03(96(96(03(11(03(63(11(28(61(11(06(06(20(18(07(07(18(61(11(28(63(96(11(96(96(61(11(06(06(19(20(07(07(18(61(30(06(06(25(07(96(96(18(11(28(96(61(13(15(15(15(15(22(26(13(12(15(96(96(19(18(11(11(63(30(63(30(96(03(28(96(11(96(96(61(22(18(96(61(28(96(11(11(96(28(96(61(11(96(10(96(96(17(61(13(15(15(22(26(11(28(63(96(19(18(63(13(21(18(63(11(11(28(63(63(63(61(11(61(42(63(63
在线尝试!
由于我不确定哪种方法最短,因此我首先尝试将字符编码为以(
s 分隔的两位数字。核心代码要短一些,但是数据表示要大50%才能弥补。不像其他人那样打高尔夫球,当我意识到它不会打败我时就停下来了。它具有一个优点:不需要具有bignum支持的实现。
它的整体结构与主要结构类似。由于数据表示直接填写F部分,因此缺少G部分。但是,E节必须执行类似的divmod计算,以重构两位数字的数字。