首页
学习
活动
专区
圈层
工具
发布

笼子圈
EN

Code Golf用户
提问于 2021-01-08 07:37:44
回答 2查看 793关注 0票数 20

此问题将让您分析网格上绘制的圆圈,网格线以xy的整数值绘制。

\varepsilon是一个很小的数字(想想看,\varepsilon = 0.0001)。如果我们绘制一个以原点为中心的半径\varepsilon填充圆,它将要求油漆位于4框中;绘制半径1 + \varepsilon的圆圈将把画笔发送到12不同的框(第二,红色圆圈);绘制一个半径\sqrt 2 + \varepsilon圆圈将画笔发送到16不同的框(第三,绿色圆圈)。

没有办法绘制一个基于原点的圆圈,准确地生活在131415框中,所以一个圆圈可以居住的可能数量是由[4, 12, 16, ...]给出的。

规则

这个挑战将给出平面上的一个点(x,y),由两个有理数xy组成。您的工作是输出前十六个(或更多!)由所有数字b组成的序列的术语,因此有一种方法可以画一个以(x,y)为中心的圆圈,其中包含精确的b框的一部分。

任何合理的输入都是允许的:你可以把中心点作为一对浮标,一个复数,一个包含分子和分母的列表,等等。

这是一个密码-高尔夫挑战,所以最短的代码获胜。

示例

在我的例子中,输入被写成一对有理数。表中的第一项如上所示。

代码语言:javascript
复制
[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给出的。)

EN

回答 2

Code Golf用户

发布于 2021-01-09 00:16:42

木炭,117个字节

代码语言:javascript
复制
NθNηNζNε≧×εθ≧×ηζ≧×ηε≔⁰ηW‹Lυ¹⁶«≔⟦⟧δF…·±ηηF…·±ηηF¬›ΣX⟦κλ⟧²ηF…·÷⁺θκε±÷⁺θκ±εF…·÷⁺ζλε±÷⁺ζλ±εF¬№δ⟦νξ⟧⊞δ⟦νξ⟧F¬№υLδ⊞υLδ≦⊕η»Iυ

在网上试试!链接是详细的代码版本。接受输入作为分子分母分子分母分母。解释:

代码语言:javascript
复制
NθNηNζNε

输入协调程序。

代码语言:javascript
复制
≧×εθ≧×ηζ≧×ηε

增加网格的规模,以便按照分母的乘积绘制网格线。

代码语言:javascript
复制
≔⁰η

使用radius \sqrt h + ε 开始枚举圆圈。

代码语言:javascript
复制
W‹Lυ¹⁶«

重复,直到找到16盒计数为止。

代码语言:javascript
复制
≔⟦⟧δ

从一个空的框列表开始。

代码语言:javascript
复制
F…·±ηηF…·±ηη

搜索点的距离达到并包括水平和垂直的h

代码语言:javascript
复制
F¬›ΣX⟦κλ⟧²η

跳过与所需点的距离大于h 的点。

代码语言:javascript
复制
F…·÷⁺θκε±÷⁺θκ±εF…·÷⁺ζλε±÷⁺ζλ±ε

假设所有的盒子都接触到了这一点。

代码语言:javascript
复制
F¬№δ⟦νξ⟧⊞δ⟦νξ⟧

如果方框尚未出现,则将其添加到框列表中。

代码语言:javascript
复制
F¬№υLδ⊞υLδ

如果方框尚未出现,则将其添加到框计数列表中。

代码语言:javascript
复制
≦⊕η

进入下一个半径。

代码语言:javascript
复制
»Iυ

打印找到的所有方框计数。

票数 6
EN

Code Golf用户

发布于 2021-01-15 00:27:38

Javascript,199字节

我很久以来第一次打高尔夫球了!

我最初是从一个蛮力的解决方案开始的,但无法得到足够小的步长,使它能够及时地产生正确的答案。因此,这里有一个更优雅的解决方案,它以类似于Zaelin的答案的方式迭代点。

代码语言:javascript
复制
(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)}

在网上试试!

Ungolfed

代码语言:javascript
复制
(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的情况,这只是意味着我们同时命中了一个节点和一个垂直/水平线,这表示了多个新的网格方块命中。

票数 2
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/217444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档