这段代码是如何工作的?
;''
6666,-2%{2+.2/@*\/10.3??2*+}*
`1000<~\;
它似乎使用了一个数组@*和一个循环{/**/},但是 6666 是什么?什么是\/?
前三个字符;;'', 程序运行不需要。他们只是丢弃所有输入并将其替换为空字符串,以防您的编译器需要输入。
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。这是因为\改变了数组中前两个元素的顺序,/并将它们分开。