这段代码是如何工作的?
;''
6666,-2%{2+.2/@*\/10.3??2*+}*
`1000<~\;
Run Code Online (Sandbox Code Playgroud)
好像用了数组@*和循环{/**/},但是6666是什么?什么是\/?
前三个字符;;\'\',程序运行不需要。他们只是丢弃所有输入并将其替换为空字符串,以防您的编译器需要输入。
6666,打印出一个 6666 个元素长的数组,每个元素都是数字 0-6665。
-2%是一个映射函数。它反转该函数并删除每两个元素。现在你有一个长度为 3333 个元素的数组,它是 [6665 6663 6661 \xe2\x80\xa6 5 3 1]
{foo}*是一个折叠块调用。对于每个元素,对元素组合执行以下操作。例如,5,{+}*将数字 0-4 加在一起。
那么,让我们看看我们在这个折叠块调用中做了什么。
\n\n2+将两个添加到元素中。
.复制该元素。
2/把它减半。你的子堆栈看起来像这样;(n+2),((n+2)/2)
@将第三个元素拉到顶部。
这是我们无法执行的第一个函数,因为我们的原始堆栈只有两层高。我们稍后再讨论这个问题。
\n\n*\\/现在将被跳过,一旦我们讨论更多折叠,我们就会回到它。
10.3??复制 10,然后推入 3。[10 10 3]。?是求幂,所以我们有 [10 1000],然后再次给我们一个 1,之后有 1000 个零。
2*将其乘以二。所以现在我们有一个 2 后面有 1000 个零。
+将剩余的数学结果加到 2e(1e3)
那么,让我们回到那个讨厌的@。
\n\n@*\\/将抓取第三个元素并将其带到顶部,然后将其乘以下一个顶部元素 ((n+2)/2),然后将 n 除以该数字。
这是莱布尼茨级数的扩展。
\n\n\\`1000<将 int 转换为字符串,然后在 3 后面抛出小数。
~再次将字符串转储为数字。
\\;删除了堆栈的其余部分。
回答您的具体问题;
\n\n选择 6666,因为一半是 3333(数组长度),而我们想要的精度位数超过 pi 倍。如果我们愿意的话,我们可以把它改小,但 6666 是一个很好用的数字。
\n\n\\/是“逆除法”对。取a,取b,然后计算b/a。这是因为\\改变了数组中前两个元素的顺序,并将/它们分开。