重叠圆


16

应该写的程序或函数,它给出一个NN等间隔的正方形网格和固体内切圆的输出或返回其由实心圆圈部分或完全重叠的方格的数目。

0大小的重叠(即当圆仅接触一条线时)不计算在内。(这些重叠出现在例如)N = 10

N = 8 (64 squares), Slices = 60

[Imgur](http://i.imgur.com/3M1ekwY.png)

输入值

  • 一个整数N > 0。(网格将具有N * N正方形。)

输出量

  • 整数,实心圆形切片的数量。

例子

(输入输出对)

Inputs:  1 2 3  4  5  6  7  8  9 10  11  12  13  14  15
Outputs: 1 4 9 16 25 36 45 60 77 88 109 132 149 172 201

这是代码高尔夫球,因此最短的参赛作品会获胜。


是我还是每个人都在这里错过了明显的解决方案?编辑:没关系。起初看起来很简单N^2
nyuszika7h 2015年

Answers:


5

佩斯,27 26

-*QQ*4lfgsm^d2T*QQ^%2_UtQ2

在线尝试:Pyth编译器/执行器

我使用2Nx2N网格并计算重叠的2x2正方形。因为我已经知道半径,所以它要短一些N

实际上,我不计算重叠的正方形。我计算第二个象限的非重叠正方形,将数字乘以4,然后从中减去结果N*N

27种解决方案的说明:

-*QQ*4lfgsm^-Qd2T*QQ^t%2UQ2   implicit: Q = input()
                     t%2UQ    generates the list [2, 4, 6, ..., Q]
                    ^     2   Cartesian product: [(2, 2), (2, 4), ..., (Q, Q)]
                              These are the coordinates of the right-down corners
                              of the 2x2 squares in the 2nd quadrant. 
       f                      Filter the coordinates T, for which:
        gsm^-Qd2T*QQ             dist-to-center >= Q
                                 more detailed: 
          m     T                   map each coordinate d of T to:
           ^-Qd2                       (Q - d)^2
         s                          add these values
        g        *QQ                 ... >= Q*Q
    *4l                       take the length and multiply by 4
-*QQ                          Q*Q - ...

26种解决方案的说明:

我注意到我只使用一次坐标,并立即从中减去坐标Q。为什么不简单地Q - coords直接生成值呢?

这发生在中%2_UtQ。仅比以前的解决方案大一个字符,并节省了2个字符,因为我不必减去-Q


6

Python 2,72

lambda n:sum(n>abs(z%-~n*2-n+(z/-~n*2-n)*1j)for z in range(~n*~n))+n+n-1

取消高尔夫:

def f(n):
    s=0
    for x in range(n+1):
        for y in range(n+1):
            s+=(x-n/2)**2+(y-n/2)**2<(n/2)**2
    return s+n+n-1

网格指向一个(n+1)*(n+1)正方形。如果单元格的最靠近中心的网格点位于圆内,则该单元与圆重叠。因此,我们可以计算网格点,除了这会丢失2*n+1轴上的网格点(偶数和奇数n),因此我们手动进行校正。

该代码通过使用复杂的距离来计算到中心的距离,并通过循环折叠来遍历单个索引来保存字符。


6

CJam,36 35 34 27字节

事实证明,该算法与xnor的算法相同,但是我想知道是否还有更好的算法。

rd:R,_m*{{2*R(-_g-}/mhR<},,

代码说明

rd:R                                "Read the input as double and store it in R";
    ,_                              "Get 0 to input - 1 array and take its copy";
      m*                            "Get Cartesian products";
                                    "Now we have coordinates of top left point of each";
                                    "of the square in the N by N grid";
        {               },,         "Filter the squares which are overlapped by the";
                                    "circle and count the number";
         {        }/                "Iterate over the x and y coordinate of the top left";
                                    "point of the square and unwrap them";
          2*                        "Scale the points to reflect a 2N grid square";
            R(-                     "Reduce radius - 1 to get center of the square";
               _g-                  "Here we are reducing or increasing the coordinate";
                                    "by 1 in order to get the coordinates of the vertex";
                                    "of the square closer to the center of the grid";
                    mhR<            "Get the distance of the point from center and check";
                                    "if its less than the radius of the circle";

更新:使用Jakube的2N技巧以及其他一些技巧来节省7个字节!

在这里在线尝试


2

Pyth,  44  36

JcQ2L^-+b<bJJ2sm+>*JJ+y/dQy%dQqQ1*QQ

尝试清理一下,以防我可以剃一些字节。

说明

                           Q = eval(input())    (implicit)
JcQ2                       calculate half of Q and store in J
L                          define function y(b) that returns
 ^-+b<bJJ2                 (b - J + (1 if b < J else 0)) ^ 2
s                          output sum of
 m                 *QQ      map d over integers 0..(Q*Q-1)
  +
   >*JJ                      J*J is greater than
       +y/dQy%dQ              sum of y(d / Q) and y(d % Q)
                qQ1          or Q is 1; see below

我必须明确检查n = 1,因为我的算法仅检查距离中心最近的正方形的角(并且中没有覆盖n = 1)。


2

八度(74)(66)(64)

这里是八度音阶版本。基本上找到圆内的所有顶点,然后通过卷积找到具有一个或多个有效顶点的所有正方形。64个字节:

x=ndgrid(-1:2/input(''):1);sum(conv2(x.^2+x'.^2<1,ones(2))(:)>0)

66个字节:

x=meshgrid(-1:2/input(''):1);sum(conv2(x.^2+x'.^2<1,ones(2))(:)>0)

74字节:

n=input('');x=ones(n+1,1)*(-1:2/n:1);sum(conv2(x.^2+x'.^2<1,ones(2))(:)>0)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.