겹치는 원


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.
nyuszika7 시간

답변:


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. 이전 솔루션보다 하나의 문자 만 더 크고 2 문자를 절약 할 수 있습니다 -Q.


6

파이썬 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

피스,  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)

1

제 64 화

function(n)sum(rowSums(expand.grid(i<-0:n-n/2,i)^2)<n^2/4)+2*n-1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.