此问题将让您分析网格上绘制的圆圈,网格线以x和y的整数值绘制。
让\varepsilon是一个很小的数字(想想看,\varepsilon = 0.0001)。如果我们绘制一个以原点为中心的半径\varepsilon填充圆,它将要求油漆位于4框中;绘制半径1 + \varepsilon的圆圈将把画笔发送到12不同的框(第二,红色圆圈);绘制一个半径\sqrt 2 + \varepsilon圆圈将画笔发送到16不同的框(第三,绿色圆圈)。
没有办法绘制一个基于原点的圆圈,准确地生活在13、14或15框中,所以一个圆圈可以居住的可能数量是由[4, 12, 16, ...]给出的。

这个挑战将给出平面上的一个点(x,y),由两个有理数x和y组成。您的工作是输出前十六个(或更多!)由所有数字b组成的序列的术语,因此有一种方法可以画一个以(x,y)为中心的圆圈,其中包含精确的b框的一部分。
任何合理的输入都是允许的:你可以把中心点作为一对浮标,一个复数,一个包含分子和分母的列表,等等。
这是一个密码-高尔夫挑战,所以最短的代码获胜。
在我的例子中,输入被写成一对有理数。表中的第一项如上所示。
[input] | [output]
(x, y) | sequence
-----------+----------------------------------------------------------------------
(0/1, 0/1) | 4, 12, 16, 24, 32, 36, 44, 52, 60, 68, 76, 80, 88, 104, 112, 120, ...
(5/1, 5/2) | 2, 6, 8, 12, 16, 20, 22, 26, 34, 38, 40, 44, 48, 52, 56, 60, ...
(1/3, 8/1) | 2, 4, 6, 8, 10, 12, 14, 18, 20, 22, 24, 26, 28, 30, 32, 34, ...
(1/2, 3/2) | 1, 5, 9, 13, 21, 25, 29, 37, 45, 49, 61, 69, 77, 81, 89, 97, ...
(1/3,-1/3) | 1, 3, 4, 6, 8, 9, 11, 13, 15, 17, 19, 21, 22, 24, 26, 29, ...
(1/9, 8/7) | 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, ...(如果有帮助的话,第一个例子是4 times A000592给出的。)
发布于 2021-01-09 00:16:42
NθNηNζNε≧×εθ≧×ηζ≧×ηε≔⁰ηW‹Lυ¹⁶«≔⟦⟧δF…·±ηηF…·±ηηF¬›ΣX⟦κλ⟧²ηF…·÷⁺θκε±÷⁺θκ±εF…·÷⁺ζλε±÷⁺ζλ±εF¬№δ⟦νξ⟧⊞δ⟦νξ⟧F¬№υLδ⊞υLδ≦⊕η»Iυ在网上试试!链接是详细的代码版本。接受输入作为分子分母分子分母分母。解释:
NθNηNζNε输入协调程序。
≧×εθ≧×ηζ≧×ηε增加网格的规模,以便按照分母的乘积绘制网格线。
≔⁰η使用radius \sqrt h + ε 开始枚举圆圈。
W‹Lυ¹⁶«重复,直到找到16盒计数为止。
≔⟦⟧δ从一个空的框列表开始。
F…·±ηηF…·±ηη搜索点的距离达到并包括水平和垂直的h 。
F¬›ΣX⟦κλ⟧²η跳过与所需点的距离大于h 的点。
F…·÷⁺θκε±÷⁺θκ±εF…·÷⁺ζλε±÷⁺ζλ±ε假设所有的盒子都接触到了这一点。
F¬№δ⟦νξ⟧⊞δ⟦νξ⟧如果方框尚未出现,则将其添加到框列表中。
F¬№υLδ⊞υLδ如果方框尚未出现,则将其添加到框计数列表中。
≦⊕η进入下一个半径。
»Iυ打印找到的所有方框计数。
发布于 2021-01-15 00:27:38
我很久以来第一次打高尔夫球了!
我最初是从一个蛮力的解决方案开始的,但无法得到足够小的步长,使它能够及时地产生正确的答案。因此,这里有一个更优雅的解决方案,它以类似于Zaelin的答案的方式迭代点。
(x,y)=>{b={0:1};g=w=>b[d=parseInt(w*1e7)]=1+(b[d]|0);for(u=x%1-9;++u<9;){g(u*u);for(v=y%1-9;++v<9;)g(u*u+v*v)||u+1<9||g(v*v)}s=0;return Object.keys(b).sort((a,b)=>a-b).map(v=>(s+=b[v])).slice(0,16)}(x, y) => {
b = { 0: 1 }; // initialize a map for the lengths
g = (w) => { // function g is used to add to the map
d = parseInt(w * 1e7); // avoid floating point rounding errors
b[d] = 1 + (b[d] | 0); // increment point with length d
}
for (u = (x % 1) - 9; ++u < 9; ) { //loop over "u" coordinates
g(u * u); // add horizontal line
for (v = (y % 1) - 9; ++v < 9; ) // loop over "v" coords
g(u * u + v * v); // add corner
(u + 1 < 9) || g(v * v); // add vertical line (but only once per above for loop)
}
s = 0; // sum of circles up to this point
return Object.keys(b)
.sort((a, b) => a - b)
.map((v) => (s += b[v])) // aggregate number of circles visited
.slice(0, 16); // first 16 terms only
};它依赖于这样一个事实:找到的每一个新的垂直、水平和角节点都代表一个新发现的网格正方形。请注意,不需要特别处理x=0或y=0的情况,这只是意味着我们同时命中了一个节点和一个垂直/水平线,这表示了多个新的网格方块命中。
https://codegolf.stackexchange.com/questions/217444
复制相似问题