重なる円


16

あなたは、プログラムまたは機能を記述する必要があり、その与えられたNことにより、N等間隔の正方格子と固体内接円出力または戻り黒丸によって部分的にまたは完全に重複しているグリッドの正方形の数。

サイズが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

回答:


5

ピス、27 26

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

オンラインで試す:Pyth Compiler / Executor

2Nx2Nグリッドを使用して、重複する2x2正方形をカウントします。私はすでに半径を知っているので、それは少し短くなりNます。

そして実際には、重複する正方形をカウントしません。2番目の象限の重複しない正方形を数え、その数に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ます。前のソリューションよりも1文字だけ大きく、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)

こちらがオクターブ版です。基本的に円内のすべての頂点を見つけてから、畳み込みを介して1つ以上の有効な頂点を持つすべての正方形を見つけます。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)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.