目标
生成(N
)个等长()的随机线段l
,检查它们是否与等距(t
)平行线交叉。
模拟
我们在模拟什么? 布冯的针。平滑沙盒中的沙子,画出一组等距的平行线(称为之间的距离t
)。取直的长度l
,将其N
放到沙箱中。让它越过一条线的次数为c
。然后Pi = (2 * l * n) / (t * c)
!
我们如何模拟这一点?
- 接受输入
N,t,l
- 随着
N, t, l
全部为正整数 - 请执行以下
N
次数:- 生成均匀随机的整数坐标
x,y
- 用
1 <= x, y <= 10^6
x,y
是长度的线段的中心l
- 生成均匀随机整数
a
- 用
1 <= a <= 180
- 设
P
线段与x轴交叉的点 - 然后
a
是角度(x,y), P, (inf,0)
- 生成均匀随机的整数坐标
- 计算与整数
c
相交的线段的数量,x = i*t
i
- 返回
(2 * l * N) / (t * c)
规格
- 输入项
- 灵活,可以采用任何标准方式(例如,函数参数,STDIN)和任何标准格式(例如,字符串,二进制)进行输入
- 输出量
- 灵活,以任何标准方式(例如退货,打印)提供输出
- 可以使用空格,尾随和前导空格
- 精度,请提供至少4位小数位数(即
3.1416
)
- 计分
- 最短的代码胜出!
测试用例
由于随机的机会,您的输出可能与这些不一致。但平均而言,对于的给定值,您应该能获得如此高的准确性N, t, l
。
Input (N,t,l) -> Output
----------- ------
10,10,5 -> ?.????
10,100,50 -> ?.????
1000,1000,600 -> 3.????
10000,1000,700 -> 3.1???
100000,1000,700 -> 3.14??
TL; DR
这些挑战是仅需要自然和大脑(可能还有一些可重复使用的资源)才能逼近Pi的算法模拟。如果您在僵尸启示录期间确实需要Pi,那么这些方法不会浪费弹药!总共有九个挑战。
a
通过其他方法创建方向(如果方向一致)?(想到2D高斯气泡)
t > l
吗?下面的两个解决方案进行了此假设,从而大大简化了交叉检查。