这个GolfScript代码如何打印1000位的圆周率数字?
这个GolfScript代码如何打印1000位的圆周率数字?
这个代码是如何工作的?
;'' 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添加到元素中。
.
重复元素。
2/
将元素除以2。您的子堆栈如下:(n+2),((n+2)/2)
@
将第三个元素拉到顶部。
这是我们无法执行的第一个函数,因为我们的原始堆栈仅为两个。我们稍后再回到它。
*\/
现在将被跳过,我们将在讨论折叠更多内容时再回到它。
10.3??
复制10,然后推送3。[10 10 3]。?是指数运算,因此我们有[10 1000],然后再次得到一个1,后面有1000个零。
2*
将其乘以2。所以现在我们有一个2,后面有1000个零。
+
将我们的其余数学加到2e(1e3)中
那么,让我们回到那个难缠的@。
@*\/
将抓取第三个元素并将其带到顶部,然后将其乘以下一个顶部元素((n+2)/2),然后我们将n除以这个数字。
这是莱布尼茨级数的扩展。
\`1000<
将int转换为字符串,然后在3后面加一个小数点。
~
将字符串转换为数字。
\;
删除栈的剩余部分。
回答您的具体问题;
选择6666,因为一半是3333(数组的长度),我们想要的精度比pi要多。 如果我们想要更小,可以缩小它,但是6666是一个可爱的数字。
\/
是“反除”对。取a,取b,然后计算b/a。这是因为\
更改数组中前两个元素的顺序,/
将它们除以。