다각형 숫자!


12

소개

수학에서 다각형 숫자는 일반 다각형 모양으로 배열 된 점 또는 자갈로 표시되는 숫자입니다. 점은 알파 (단위)로 생각됩니다. 이들은 2 차원 피구 숫자의 한 유형입니다.

예를 들어 숫자 10은 삼각형으로 배열 할 수 있습니다.

*
**
***
****

그러나 10은 사각형으로 배열 될 수 없습니다. 반면에 숫자 9는 다음과 같습니다.

***
***
***

36과 같은 일부 숫자는 정사각형과 삼각형으로 배열 될 수 있습니다.

******  *
******  **
******  ***
******  ****
******  *****
******  ******

일반적으로 1은 모든면의 첫 번째 다각형 수입니다. 다각형을 다음 크기로 확대하는 규칙은 인접한 두 개의 팔을 한 점씩 확장 한 다음 해당 점 사이에 필요한 여분의 측면을 추가하는 것입니다. 다음 다이어그램에서 각 추가 레이어는 빨간색으로 표시됩니다.

삼각 숫자 :

삼각 숫자

제곱 숫자 :

제곱 숫자

오각형이나 육각형과 같이 더 많은면을 가진 다각형도이 규칙에 따라 구성 할 수 있지만 점은 더 이상 위와 같이 완벽하게 규칙적인 격자를 형성하지 않습니다.

오각형 숫자 :

오각형 숫자

6 각형 숫자 :

육각형 숫자

출처 : Wikipedia

당신의 작업

양의 정수 N (1 <= N <= 1000)이 주어지면 , 모든 유형의 다각형 수 N을 인쇄 하는 것은 삼각형 수에서 시작하여 Icosagonal (20-gon) 숫자를 포함합니다.

예를 들어 숫자 10은 삼각 숫자와 십진수이므로 출력은 다음과 같아야합니다 (자신의 출력 형식을 선택할 수 있지만 다음과 같이 보일 것입니다).

3 10

테스트 사례

1 -> 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 -> (None)
3 -> 3
6 -> 3 6
36 -> 3 4 13

참고로, n번째 k-gonal 수 있습니다 :

(k-2) (n) (n-1) / 2 + n

크레딧 : xnor

이것은 이므로 바이트 수가 가장 적은 코드가 이깁니다.


참고로, nk-gonal 수는 (k-2)*n*(n-1)/2 + n입니다.
xnor

9
샌드 박스의 요점은 질문을 개선하는 것입니다. 샌드 박스에 질문을 게시 한 후 원하는 내용이 확실하지 않은 경우, 올바른 응답은 샌드 박스에 주석을 추가하지 않고 2 시간 동안 기다린 후 수정하지 않은 기본 질문을 게시하고 샌드 박스 질문을 삭제하는 것입니다 , 2 천명 미만의 담당자의 설명 주석을 숨 깁니다. 정답은 문구를 다시 말하거나 문구를 제안하고, 그 문구에 여전히 문제가 있는지 확인하기 위해 하루나 이틀 정도 더주는 것입니다.
피터 테일러

답변:


2

파이썬 3, 68 바이트

lambda R:[s+2for s in range(1,19)if(s-2+(4+s*(s-4+8*R))**.5)/2%s==0]

각 가능한 변의 개수에 대해 결과가 정수인지 확인 하기 위해 s+22 차 공식 R=s*n*(n-1)/2 + n을 해결합니다 n.

비교 (73 바이트) :

lambda R:[s+2for s in range(1,19)if R in[n+s*n*~-n/2for n in range(R+1)]]

에 대한 다른 해결 방법은 sPython 3에서 62 바이트 를 제공하지만 실패합니다 R=1.

lambda R:{(R-n)*2/n/~-n+2for n in range(2,R+1)}&{*range(3,21)}

1

자바 스크립트 (ES6), 90 바이트

n=>[...Array(21).keys(n--)].slice(3).filter(i=>(Math.sqrt(i*i+8*i*n-16*n)+i-4)%(i+i-4)==0)

이차 방정식을 해결합니다. 충분한 새 버전의 Firefox에서 73 바이트 :

n=>[for(i of Array(18).keys())if(((~-i**2+8*n*-~i)**.5+~-i)/2%-~i==0)i+3]

1

> <>, 62 + 3 = 65 바이트

&1v
v0<;?)+8a:+1~~<
1.292:{<>+n}ao^
>:&:&=?^:&:&)?^:@:@$-{:}++

스택 맨 위에있는 입력을 예상하므로 -v플래그 는 +3 바이트입니다 .

이것은 <<>에서 처음으로 프로그래밍되었으므로 코드를 단축하는 몇 가지 확실한 요령이 누락되었을 수 있습니다.

설명:

초기화

&1v
v0<
1

N 을 레지스터로 이동 하고 카운터를 스택으로 푸시하고 (시작은 1삼각형 숫자에 해당함) 값 0과로 시퀀스를 시작합니다 1.

메인 루프

 :&:&=?^:&:&)?^:@:@$-{:}++

스택의 상단을 레지스터와 비교합니다. 같으면 인쇄 루틴으로 이동하십시오. 더 큰 경우 재설정 루틴으로 이동하십시오. 그렇지 않으면 상단 두 스택 항목의 차이를 취하고 카운터를 추가 한 후 이전 상단 스택 항목에 추가하십시오. 다음 다각형 수를 계산합니다.

인쇄

 .292:{<>+n}ao^
       ^

카운터 + 2를 인쇄 한 다음 줄 바꾸기를 인쇄 한 다음 재설정 루틴으로 이동합니다.

초기화

v0<;?)+8a:+1~~<
1             ^

상위 2 개의 스택 항목을 제거하고 카운터를 증가시킵니다. 카운터가 18보다 크면 프로그램을 종료하고, 그렇지 않으면 시작 번호 01스택을 푸시 하고 메인 루프로 돌아갑니다.


1

젤리 , 22 바이트

18pȷµḢ×’×H+µ€_³¬FT:ȷ+3

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

설명

18pȷµḢ×’×H+µ€_³¬FT:ȷ+3
18pȷ                   - All possible (k-2,n) pairs
    µ      µ€          - to each pair compute the corresponding polygonal number:
     Ḣ                 -   retrieve k-2
      ×’               -   multiply by n-1
        ×H             -   multiply by half of n
          +            -   add n
             _³        - subtract the input. There will now be 0's at (k-2,n) pairs which produce the input
               ¬FT     - retrieve all indices of 0's. The indices are now (k-2)*1000+n
                  :ȷ   - floor division by 1000, returning k-3
                    +3 - add 3 to get all possible k.

1

공리 203 바이트

 l(x)==(local q,m,a;v:List INT:=[];for i in 3..20 repeat(q:=solve((i-2)*n*(n-1)+2*n-2*x=0,n);if #q>1 then(m:=rhs q.1;a:=rhs q.2;if(m>0 and denom(m)=1)or(a>0 and denom(a)=1)then v:=cons(i,v)));v:=sort v;v)

숫자가 적은 골프 및 일상

 l(x)==
  local q,m,a
  v:List INT:=[]
  for i in 3..20 repeat 
     q:=solve((i-2)*n*(n-1)+2*n-2*x=0,n)  -- this would find only rational solutions as r/s with r,s INT
     if #q>1 then -- if exist rational solution and denominator =1=> add to list of result
        m:=rhs q.1;a:=rhs q.2;
        if(m>0 and denom(m)=1)or(a>0 and denom(a)=1)then v:=cons(i,v) 
  v:=sort v
  v

 (2) ->  [[i,l(i)]  for i in 1..45]
    Compiling function l with type PositiveInteger -> List Integer

    (2)
    [[1,[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]], [2,[]], [3,[3]],
     [4,[4]], [5,[5]], [6,[3,6]], [7,[7]], [8,[8]], [9,[4,9]], [10,[3,10]],
     [11,[11]], [12,[5,12]], [13,[13]], [14,[14]], [15,[3,6,15]], [16,[4,16]],
     [17,[17]], [18,[7,18]], [19,[19]], [20,[20]], [21,[3,8]], [22,[5]],
     [23,[]], [24,[9]], [25,[4]], [26,[]], [27,[10]], [28,[3,6]], [29,[]],
     [30,[11]], [31,[]], [32,[]], [33,[12]], [34,[7]], [35,[5]], [36,[3,4,13]],
     [37,[]], [38,[]], [39,[14]], [40,[8]], [41,[]], [42,[15]], [43,[]],
     [44,[]], [45,[3,6,16]]]
                                                           Type: List List Any


0

R, 68 66 바이트

N=scan();m=expand.grid(k=1:18,1:N);n=m$V;m$k[m$k*n*(n-1)/2+n==N]+2

Nstdin에서 읽습니다 . xnor의 공식을 사용하여 첫 번째 Nk-gonal 수를 계산하고 k동일한 위치를 얻습니다 N. 그러나 1:18대신 에을 3:20추가 2하고 끝에 추가 하여 괄호에 바이트를 저장합니다 .

expand.grid이름이 지정되지 않은 경우 기본적으로 열 Var1,, Var2...의 이름을 지정합니다. $부분 일치로 인덱스하므로 두 번째 열에 m$V해당합니다 m$Var2,.

구 버전:

N=scan();m=expand.grid(k=3:20,1:N);n=m$V;m$k[(m$k-2)*n*(n-1)/2+n==N]

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



0

젤리 , 20 바이트

나는이 도전에 대한 효과적인 속임수를 쓰기 시작했다.

Ṫð’××H+⁸
18pÇċ¥Ðf⁸+2

결과의 젤리리스트 표현을 인쇄하는 전체 프로그램 *

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

* 결과가 없으면 아무것도 인쇄되지 않습니다.
  단일 결과는 해당 숫자 만 인쇄합니다.
  여러 결과 는 숫자 로 []둘러싸인 , 구분 된 목록을 인쇄 합니다

어떻게?

Ṫð’××H+⁸ - Link 1, ith (x+2)-gonal number: list [x,i]   e.g. [3,4] (for 4th Pentagonal)
Ṫ        - tail & modify (i.e. yield i & make input [x])     4
 ð       - new dyadic chain, i.e. left = i, right = [x]
  ’      - decrement i                                       3
   ×     - multiply by [x]                                   [9]
     H   - halve [x]                                         [2]
    ×    - multiply                                          [18]
       ⁸ - chain's left argument, i                          4
      +  - add                                               [22]

18pÇċ¥Ðf⁸+2 - Main link: number, n                      e.g. 36
18p         - Cartesian product of range [1,18] with n       [[1,1],[1,2],...,[1,36],[2,1],...,[18,1],[18,2],[18,36]]
            -   (all pairs of [(k-2),i] which could result in the ith k-gonal number being n)
      Ðf    - filter keep if this is truthy:
        ⁸   -   chain's left argument, n                     36
     ¥      -   last two links as a dyad:
   Ç        -     call the last link as a monad (note this removes the tail of each)
    ċ       -     count (this is 1 if the result is [n] and 0 otherwise)
            -                            filter keep result: [[1],[2],[11]]
         +2 - add two                                        [[3],[4],[13]]
            - implicit print ...due to Jelly representation: [3, 4, 13]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.