这个GolfScript代码如何打印1000位的圆周率数字?

16 浏览
0 Comments

这个GolfScript代码如何打印1000位的圆周率数字?

这个代码是如何工作的?

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

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

admin 更改状态以发布 2023年5月21日
0
0 Comments

前三个字符;;'',对于程序的功能是不必要的。它们只是将所有输入都丢弃并替换为空字符串,以防编译器需要输入。

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。这是因为\更改数组中前两个元素的顺序,/将它们除以。

0