계수 단위 제곱 원 통과


24

정수 반경 r 이 주어진 프로그램 또는 함수를 작성 하면 원점이 중심에 반지름 r이 있는 원의 제곱 수를 반환합니다 . 원이 그리드의 점을 정확하게 통과하면 인접한 단위 사각형을 통과하는 것으로 계산되지 않습니다.

다음은 r = 5에 대한 그림입니다 .

삽화 OEIS에서 발견 된 Kival Ngaokrajang의 삽화

예 :

0 → 0
1 → 4
4 → 28
5 → 28
49 → 388
50 → 380325
→ 2540
5524 → 44180
5525 → 44020



@Luke 방금 이것을 찾았지만 약간 다른 정의를 사용하는 것 같습니다 (적어도 동의하지 않습니다 N = 50).
Martin Ender 2012 년

1
@smls 경계 사각형에서 계산합니다. 원이 모퉁이에만 닿는 제곱을 세지 마십시오. OEIS의 숫자가 잘못되었습니다. 지금 검토 중입니다.
orlp

2
나는 ... 다시 마인 크래프트에서 빌드 돔에 갑자기 충동이
패트릭 로버츠

2
동료 3Blue1Brown 뷰어입니까?
nitro2k01

답변:


12

파이썬 2 , 54 바이트

f=lambda r,x=0:r-x and-~((r*r-x*x)**.5%1>0)*4+f(r,x+1)

온라인으로 사용해보십시오!

덜 골프 (55 바이트) ( TIO )

lambda r:8*r-4*sum((r*r-x*x)**.5%1==0for x in range(r))

출력을로 추정 8*r한 다음 정점 교차를 수정합니다. 결과는입니다 8*r-g(r*r). 여기서 두 제곱의 합으로 쓰는 방법g(x)수를x 계산합니다 (제외 g(0)=0).

원이 꼭짓점을 통과하지 않으면 터치 한 셀 수는 교차 된 가장자리 수와 같습니다. 원은 2*r세로 눈금 선과 2*r가로 눈금 선을 통과하여 각 방향을 양방향으로 통과합니다 8*r.

그러나 정점에서 각각의 교차점은 하나의 새 셀에만 들어가는 동안 두 개의 교차점으로 계산됩니다. 따라서 정점 교차 수를 빼서 보상합니다. 이 축에 포인트를 원하는 포함 (r,0)피타고라스 같이 세배뿐만 아니라 (4,3)위한 r=5.

우리는 하나의 사분면의 점을 계산 (x,y)x>=0y>0함께 x*x+y*y==n다음 곱하기 4로 우리의 numer에 계산하여이 작업을 수행 sqrt(r*r-x*x)하기위한 그 정수를하는 x간격 [0,r).


5

매스 매 티카, 48 바이트

4Count[Range@#~Tuples~2,l_/;Norm[l-1]<#<Norm@l]&

1 사분면을보고 입력이 셀의 왼쪽 아래 오른쪽 위 모서리의 규범 사이에있는 그리드 셀 수를 계산합니다 (물론 결과에 4를 곱함).


또 다른 방법은 8#-SquaresR[2,#^2]Sign@#&xnor의 게시물을 기반으로합니다.
마일

@ 마일 오, 와우, 실마리 SquaresR가 없었습니다 . 직접 게시하거나 xnor에 게시하십시오.
Martin Ender


3

젤리 , 21 13 12 11 바이트

R²ạ²Æ²SạḤ×4

온라인으로 사용해보십시오!

작동 원리

R²ạ²Æ²SạḤ×4  Main link. Argument: r

R            Range; yield [1, 2, ..., r].
 ²           Square; yield [1², 2², ..., r²].
   ²         Square; yield r².
  ạ          Absolute difference; yield [r²-1², r²-2², ..., r²-r²].
    Ʋ       Test if each of the differences is a perfect square.
      S      Sum, counting the number of perfect squares and thus the integer
             solutions of the equation x² + y² = r² with x > 0 and y ≥ 0.
        Ḥ    Un-halve; yield 2r.
       ạ     Subtract the result to the left from the result to the right.
         ×4  Multiply by 4.

2

펄 6, 61 바이트

->\r{4*grep {my &n={[+] $_»²};n(1 X+$_)>r²>.&n},(^r X ^r)}

작동 원리

->\r{                                                    } # Lambda (accepts the radius).
                                                (^r X ^r)  # Pairs from (0,0) to (r-1,r-1),
                                                           #   representing the bottom-left
                                                           #   corners of all squares in
                                                           #   the top-right quadrant.
       grep {                                 }            # Filter the ones matching:
             my &n={[+] $_»²};                             #   Lambda to calculate the norm.
                              n(1 X+$_)>r²                 #   Top-right corner is outside,
                                          >.&n             #   and bottom-left is inside.
     4*                                                    # Return length of list times 4.

1

AWK, 90 바이트

{z=$1*$1
for(x=$1;x>=0;x--)for(y=0;y<=$1;y++){d=z-x*x-y*y
if(d>0&&d<2*(x+y)+2)c++}$0=4*c}1

용법:

awk '{z=$1*$1
    for(x=$1;x>=0;x--)for(y=0;y<=$1;y++){d=z-x*x-y*y
    if(d>0&&d<2*(x+y)+2)c++}$0=4*c}1' <<< 5525

사분면 1을 통한 간단한 검색만으로 원을 교차하는 모든 상자를 찾습니다. 대칭을 사용하면 4를 곱할 수 있습니다.에서 갈 수 -$1 to $1있지만 더 많은 바이트가 필요하고 효율성이 떨어집니다. 분명히 이것은 가장 효율적인 알고리즘은 아니지만 내 컴퓨터에서 5525 케이스를 실행하는 데 약 16 초 밖에 걸리지 않습니다.


1

하스켈, 74 바이트

f n=sum[4|x<-[0..n],y<-[0..n],(1+n-x)^2+(1+n-y)^2>n^2,(n-x)^2+(n-y)^2<n^2]

매우 간단하게, 왼쪽 하단이 원 안에 있고 오른쪽 상단이 원 밖에있는 (0,0)과 (n, n) 사이의 제곱 수를 세고 4를 곱하십시오.


0

Pyth , 29 바이트

Lsm*ddb*4lf}*QQrhyTym+1dT^UQ2

시도 해봐!

설명

Lsm*ddb*4lf}*QQrhyTym+1dT^UQ2  # implicit input: Q
Lsm*ddb                        # define norm function
 s                             # sum
  m   b                        #     map each coordinate to
   *dd                         #                            its square
                         ^UQ2  # cartesian square of [0, 1, ..., Q - 1]
                               #     -> list of coordinates of all relevant grid points
          f                    # filter the list of coordinates T where:
           }*QQ                # square of Q is in
               r               #     the range [
                hyT            #         1 + norm(T),
                               #                  ^ coordinate of lower left corner
                   ym+1dT      #         norm(map({add 1}, T))
                               #              ^^^^^^^^^^^^^^^ coordinate of upper right corner
                               #     ) <- half-open range
         l                     # size of the filtered list
                               #     -> number of passed-through squares in the first quadrant
       *4                      # multiply by 4
                               # implicit print

0

배치, 147 바이트

@set/an=0,r=%1*%1
@for /l %%i in (0,1,%1)do @for /l %%j in (0,1,%1)do @set/a"i=%%i,j=%%j,a=i*i+j*j-r,i+=1,j+=1,a&=r-i*i-j*j,n-=a>>31<<2
@echo %n%

AWK와 Haskell의 답변에서 영감을 얻었습니다.


누군가에게 영감을 줄 수있어서 기쁘다 :)
Robert Benson

0

Bash + Unix 유틸리티, 127 바이트

c()(d=$[(n/r+$1)**2+(n%r+$1)**2-r*r];((d))&&echo -n $[d<0])
r=$1
bc<<<`for((n=0;n<r*r;n++));{ c 0;c 1;echo;}|egrep -c 01\|10`*4

온라인으로 사용해보십시오!

1 사분면의 모든 점을 훑어보고, 4를 곱하면 매우 느려질 수 있지만 작동합니다.


0

자바 스크립트 (ES7), 76 바이트

n=>4*(G=k=>k<n?Math.ceil((n**2-k++**2)**0.5)-(0|(n**2-k**2)**0.5)+G(k):0)(0)

n아래로 반복하여 몇 바이트를 줄일 수 0있습니까?
Neil

@ Neil 시도했지만 방법을 찾지 못했습니다. 하나의 함수 만 사용 n하고 k싶었지만 여전히 반지름과 반복을 모두 저장해야 하며 모든 시도가 동일한 바이트로 나왔습니다
George Reith

@Neil Ah 나는 당신이 말하는 것을 k<n?...알지만 n**2-k++**2역순으로 갈 때 연산자 우선 순위가 잘못되고 빼기가 비 환산 적이므로 왼쪽에 항상 k-1괄호 가 필요하고 필요 하기 때문에 바이트 순서를 잃습니다 . 방법을 찾지 않았다면?
George Reith

아, 뺄셈을 간과했습니다 ... 어쩌면 당신은 그 문제를 해결하기 위해 4 대신 4를 곱할 수 있습니까? (아직도 절약 할 수는 있지만 ...)
Neil
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.