这段代码是如何工作的?
;''
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。这是因为\
改变了数组中前两个元素的顺序,/
并将它们分开。