Vòng tròn chồng chéo


16

Bạn nên viết một chương trình hoặc hàm được cung cấp Nbởi một Nô vuông cách đều nhau và một đầu ra hình tròn được khắc đặc hoặc trả về số lượng hình vuông lưới được chồng lên một phần hoặc toàn bộ bởi hình tròn rắn.

Các lớp phủ có kích thước 0 (nghĩa là khi vòng tròn chỉ chạm vào một đường) không được tính. (Những sự chồng chéo này xảy ra tại ví dụ N = 10.)

Thí dụ

N = 8 (64 squares), Slices = 60

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

Đầu vào

  • Một số nguyên N > 0. (Lưới sẽ có N * Nhình vuông.)

Đầu ra

  • Một số nguyên, số lát tròn rắn.

Ví dụ

(cặp đầu vào-đầu ra)

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

Đây là mã golf để chiến thắng ngắn nhất.


Có phải chỉ có tôi hoặc mọi người đang thiếu giải pháp rõ ràng ở đây? Chỉnh sửa: Đừng bận tâm. Lúc đầu trông như đơn giản N^2.
nyuszika7h

Câu trả lời:


5

Bình thường, 27 26

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

Dùng thử trực tuyến: Trình biên dịch / thực thi Pyth

Tôi sử dụng một 2Nx2Nlưới và đếm các 2x2ô vuông chồng lên nhau . Đó là một chút ngắn hơn, vì tôi đã biết bán kính N.

Và thực sự tôi không đếm các ô vuông chồng lên nhau. Tôi đếm các ô vuông không chồng chéo của góc phần tư thứ hai, nhân số đó với 4 và trừ kết quả N*N.

Giải thích cho giải pháp 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 - ...

Giải thích cho giải pháp 26:

Tôi nhận thấy rằng tôi chỉ sử dụng tọa độ một lần và trừ ngay tọa độ Q. Tại sao không chỉ đơn giản là tạo ra các giá trị Q - coordstrực tiếp?

Điều này xảy ra trong %2_UtQ. Chỉ có một char lớn hơn trong giải pháp trước đó và tiết kiệm được 2 ký tự, vì tôi không phải trừ -Q.


6

Con trăn 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

Ung dung:

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

Các điểm lưới cho một (n+1)*(n+1)hình vuông. Một ô chồng lên vòng tròn nếu điểm lưới của nó gần tâm nhất nằm trong vòng tròn. Vì vậy, chúng ta có thể đếm các điểm lưới, ngoại trừ việc bỏ lỡ 2*n+1các điểm lưới tại các trục (cả chẵn và lẻ n), vì vậy chúng tôi sửa lỗi cho thủ công.

Mã lưu các ký tự bằng cách sử dụng các khoảng cách phức tạp để tính khoảng cách đến trung tâm và thu gọn vòng lặp để lặp lại qua một chỉ mục.


6

CJam, 36 35 34 27 byte

Điều này hóa ra là cùng một thuật toán với xnor, nhưng tôi tự hỏi liệu có cái nào tốt hơn không.

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

Mã giải thích :

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

CẬP NHẬT : Sử dụng thủ thuật 2N từ Jakube cùng với một số kỹ thuật khác để tiết kiệm 7 byte!

Dùng thử trực tuyến tại đây


2

Bình thường  44  36

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

Cố gắng làm sạch nó một chút trong trường hợp tôi có thể cạo một số byte.

Giải trình

                           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

Tôi phải kiểm tra một cách rõ ràng n = 1, vì thuật toán của tôi chỉ kiểm tra góc của hình vuông gần trung tâm nhất (và không có cái nào được che trong n = 1).


2

Octave (74) (66) (64)

Đây là phiên bản quãng tám. Về cơ bản tìm tất cả các đỉnh trong vòng tròn và sau đó tìm tất cả các hình vuông có một hoặc nhiều đỉnh hợp lệ thông qua tích chập. 64 byte:

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

66 byte:

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

74 byte:

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

1

R - 64

function(n)sum(rowSums(expand.grid(i<-0:n-n/2,i)^2)<n^2/4)+2*n-1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.