2

这段代码是如何工作的?

;''
6666,-2%{2+.2/@*\/10.3??2*+}*
`1000<~\;

它似乎使用了一个数组@*和一个循环{/**/},但是 6666 是什么?什么是\/

4

1 回答 1

5

前三个字符;;'', 程序运行不需要。他们只是丢弃所有输入并将其替换为空字符串,以防您的编译器需要输入。

6666,打印出一个 6666 个元素长的数组,每个元素都是数字 0-6665。

-2%是一个映射函数。它反转函数并删除每两个元素。你现在有一个长度为 3333 个元素的数组,它是 [6665 6663 6661 … 5 3 1]

{foo}*是折叠块调用。对于每个元素,对元素的组合执行以下操作。例如,5,{+}*将数字 0-4 相加。

所以,让我们看看我们在这个折叠块调用中做了什么。

2+向元素添加两个。

.复制元素。

2/减半。您的子堆栈如下所示;(n+2),((n+2)/2)

@将第三个元素拉到顶部。

这是我们不能做的第一个函数,因为我们的原始堆栈只有两个高。我们稍后再谈。

*\/现在将被跳过,我们将在讨论更多折叠时回到它。

10.3??复制 10,然后按 3. [10 10 3]。? 是幂运算,所以我们有 [10 1000],然后再给我们一个 1,之后有 1000 个零。

2*乘以二。所以现在我们有一个 2,后面有 1000 个零。

+将剩下的数学添加到 2e(1e3)

所以,让我们回到那个讨厌的@。

@*\/将抓取第三个元素并将其带到顶部,然后将它乘以下一个顶部元素 ((n+2)/2),然后我们将 n 除以这个数字。

这是莱布尼茨系列的扩展。

\`1000<将 int 转换为字符串,然后在 3 之后抛出一个小数。

~再次将字符串转储为数字。

\;删除了堆栈的其余部分。

回答您的具体问题;

选择了 6666,因为一半是 3333(数组长度),并且我们想要超过 pi 乘以我们想要的精度位数。如果我们愿意,我们可以把它变小,但是 6666 是一个可爱的数字。

\/是“逆除法”对。取 a,取 b,然后计算 b/a。这是因为\改变了数组中前两个元素的顺序,/并将它们分开。

于 2020-02-21T17:02:03.773 回答