Lingkaran yang tumpang tindih

16

Anda harus menulis sebuah program atau fungsi yang diberikan Noleh Nkotak persegi dengan spasi sama dan lingkaran yang bertuliskan menghasilkan atau mengembalikan jumlah kotak kotak yang tumpang tindih sebagian atau seluruhnya oleh lingkaran padat.

Tumpang tindih berukuran 0 (yaitu ketika lingkaran hanya menyentuh garis) tidak dihitung. (Tumpang tindih ini terjadi pada misalnya N = 10.)

Contoh

N = 8 (64 squares), Slices = 60

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

Memasukkan

  • Bilangan bulat N > 0. (Kotak akan memiliki N * Nkotak.)

Keluaran

  • Integer, jumlah irisan lingkaran padat.

Contohnya

(pasangan input-output)

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

Ini adalah kode-golf sehingga entri terpendek menang.

randomra
sumber
Apakah hanya saya atau ada orang yang melewatkan solusi yang jelas di sini? Sunting: Tidak apa-apa. Pada awalnya itu terlihat seperti sederhana N^2.
nyuszika7h

Jawaban:

5

Pyth, 27 26

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

Cobalah secara online: Pyth Compiler / Executor

Saya menggunakan 2Nx2Nkotak dan menghitung 2x2kotak yang tumpang tindih . Itu sedikit lebih pendek, karena saya sudah tahu jari-jarinya N.

Dan sebenarnya saya tidak menghitung kotak yang tumpang tindih. Saya menghitung kuadrat non-tumpang tindih kuadran kedua, kalikan jumlahnya dengan 4 dan kurangi hasilnyaN*N .

Penjelasan untuk solusi 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 - ...

Penjelasan untuk solusi 26:

Saya perhatikan bahwa saya menggunakan koordinat hanya sekali dan segera kurangi koordinat dari Q. Mengapa tidak hanya menghasilkan nilai Q - coordssecara langsung?

Ini terjadi di %2_UtQ. Hanya satu char yang lebih besar dari pada solusi sebelumnya dan menghemat 2 karakter, karena saya tidak perlu mengurangi -Q.

Jakube
sumber
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

Tidak Terkumpul:

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

Poin grid untuk sebuah (n+1)*(n+1) kotak. Sebuah sel tumpang tindih lingkaran jika titik grid terdekat pusat berada di dalam lingkaran. Jadi, kita dapat menghitung titik kisi, kecuali ini melewatkan 2*n+1titik kisi pada sumbu (baik untuk genap dan ganjil n), jadi kami memperbaikinya secara manual.

Kode menyimpan karakter dengan menggunakan jarak kompleks untuk menghitung jarak ke pusat dan loop runtuh untuk beralih pada indeks tunggal.

Tidak
sumber
6

CJam, 36 35 34 27 byte

Ini ternyata sama dengan algoritma xnor, tapi saya ingin tahu apakah ada yang lebih baik.

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

Penjelasan kode :

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";

MEMPERBARUI : Menggunakan trik 2N dari Jakube bersama dengan beberapa teknik lain untuk menghemat 7 byte!

Cobalah online di sini

Pengoptimal
sumber
2

Pyth,  44  36

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

Mencoba untuk membersihkannya sedikit kalau-kalau aku bisa mencukur beberapa byte.

Penjelasan

                           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

Saya harus secara eksplisit memeriksa n = 1, karena algoritma saya hanya memeriksa sudut alun-alun terdekat dengan pusat (dan tidak ada yang tercakup dalam n = 1).

PurkkaKoodari
sumber
2

Oktaf (74) (66) (64)

Di sini versi oktaf. Pada dasarnya menemukan semua simpul dalam lingkaran dan kemudian menemukan semua kotak dengan satu atau lebih simpul yang valid melalui konvolusi. 64 Bytes:

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

66 Bytes:

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

74 Bytes:

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

R - 64

function(n)sum(rowSums(expand.grid(i<-0:n-n/2,i)^2)<n^2/4)+2*n-1
flodel
sumber