나선 순열 시퀀스


17

자연수를 직사각형 나선으로 감을 수 있습니다.

 17--16--15--14--13
  |               |
 18   5---4---3  12
  |   |       |   |
 19   6   1---2  11
  |   |           |
 20   7---8---9--10
  |
 21--22--23--24--25

그러나 이제 직사각형 그리드에 배치 했으므로 북쪽을 시작으로 시계 방향으로 이동하는 등 다른 순서로 나선을 풀 수 있습니다.

 17  16--15--14--13
  |   |           |
 18   5   4---3  12
  |   |   |   |   |
 19   6   1   2  11
  |   |       |   |
 20   7---8---9  10
  |               |
 21--22--23--24--25

결과 시퀀스는 자연수의 순열입니다.

1, 4, 3, 2, 9, 8, 7, 6, 5, 16, 15, 14, 13, 12, 11, 10, 25, 24, 23, 22, 21, 20, 19, 18, 17, ...

당신의 임무는이 순서를 계산하는 것입니다. ( OEIS A020703 , 그러나 스포일러 경고 : 여기에는 또 다른 흥미로운 정의와 몇 가지 공식이 포함되어 있습니다.)

재미있는 사실 : 풀릴 수있는 8 개의 주문은 모두 고유 한 OEIS 항목이 있습니다.

도전

양의 정수가 주어지면 위 시퀀스 nnth 요소를 반환합니다 .

STDIN (또는 가장 가까운 대안), 명령 행 인수 또는 함수 인수를 통해 입력을 받고 STDOUT (또는 가장 가까운 대안), 함수 리턴 값 또는 함수 (out) 매개 변수를 통해 결과를 출력하는 프로그램 또는 함수를 작성할 수 있습니다.

표준 규칙이 적용됩니다.

테스트 사례

1       1
2       4
3       3
4       2
5       9
6       8
7       7
8       6
9       5
100     82
111     111
633     669
1000    986
5000    4942
9802    10000
10000   9802

포함 된 전체 목록 n = 11131 은 OEIS의 b 파일을 참조하십시오 .

답변:


6

젤리, 11 10 바이트

’ƽð²+ḷ‘Ḥ_

제 전화에 또 다른 젤리가 있습니다.

’ƽð²+ḷ‘Ḥ_   A monadic hook:
’ƽ          Helper link. Input: n
’             n-1
 ƽ            Atop integer square root. Call this m.
   ð         Start a new dyadic link. Inputs: m, n
    ²+ḷ‘Ḥ_    Main link:
    ²+ḷ       Square m, add it to itself,
       ‘      and add one.
        Ḥ     Double the result
         _    and subtract n.

여기에서 시도 하십시오 .


젤리 시작에 대한 팁? 포크 / 후크가 어떻게 파싱되는지 알 수 없습니다.
Lynn

APL 또는 J를 먼저 배우십시오. 기능은 모두 고정 된 특성을 가지고 있기 때문에 체인은 실제로 열차보다 쉽습니다.
lirtosiast

내가 참조. 네, J 경험이 있습니다. jelly.py지원되는 체인 을 읽고 파악 하려고한다고 가정 합니다.
Lynn

2
전화기에 어떻게 입력 했어?! 코드 자체보다 더 인상적입니다!
DJMcMayhem

8

Japt, 20 19 16 바이트

V=U¬c)²-V *2-U+2

온라인으로 테스트하십시오!

관찰 결과에 따르면

F (N) = ceil (N ^ .5) * (ceil (N ^ .5) -1)-N + 2

아니면 오히려

F (N) = N보다 크거나 같은 첫 번째 제곱에서 제곱근을 뺀 N에 2를 더한 값.

아직 설명하지 않았으므로이 설명이 OEIS 페이지에 있는지 모르겠습니다.


5

줄리아, 28 바이트

n->2((m=isqrt(n-1))^2+m+1)-n

정수를 받아들이고 정수를 반환하는 람다 함수입니다. 호출하려면 변수에 지정하십시오.

m 2n -1, 즉 n -1 ( ) 의 정수 제곱근 과 같이 m 을 가장 큰 정수로 정의 합니다. 그런 다음 OEIS 표현식 2 ( m + 1) m - n + 2를 간단히 2 ( m 2 + m + 1) -n으로 단순화 할 수 있습니다 .isqrt

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


4

CJam, 14 바이트

qi_(mQ7Ybb2*\-

Alex의 접근 방식 사용 : 2*(m^2+m+1)-nwhere m = isqrt(n-1).


2

ES7, 31 28 26 바이트

n=>(m=--n**.5|0)*++m*2-~-n

나는 Alex의 공식을 독립적으로 발견했지만 그 당시 컴퓨터 근처에 있지 않았기 때문에 그것을 증명할 수 없습니다.

편집 : @ETHproductions 덕분에 부분적으로 3 바이트가 절약되었습니다. 추가 2 바이트를 저장했습니다.


n=>((m=--n**.5|0)+m*m)*2-n+1작동한다고 생각합니다.
ETHproductions

@ETHproductions 고마워, 나는 --n거기에 그것을 얻는 방법을 나 자신에게 궁금해했다
Neil

@ETHproductions 어, 나는 당신의 대답에서 2 바이트를 면도했습니다.
Neil


1

MATL , 16 13 바이트

qX^Y[tQ*Q2*G-

Lynn의 CJam 답변을 기반으로 합니다.

온라인으로 사용해보십시오! (언어 변경에 따라Y[대체되었습니다k)

q       % input n. Subtract 1
X^      % square root
Y[      % floor
tQ      % duplicate and add 1
*       % multiply
Q       % add 1
2*      % multiply by 2
G-      % subtract n

이것은 다른 답변 ( 16 바이트 )과 다른 접근법을 사용합니다 .

6Y3iQG2\+YLt!G=)

그것은 두 개의 나선형 행렬을 명시 적으로 생성합니다 (실제로 수직으로 뒤집힌 버전이지만 출력에는 영향을 미치지 않습니다). 첫 번째는

17    16    15    14    13
18     5     4     3    12
19     6     1     2    11
20     7     8     9    10
21    22    23    24    25

두 번째 경로는 수정 된 경로를 추적합니다.

25    10    11    12    13
24     9     2     3    14
23     8     1     4    15
22     7     6     5    16
21    20    19    18    17

n시퀀스 의- 번째 숫자를 찾으 n려면 두 번째 행렬에서 찾아서 첫 번째에서 해당 숫자를 선택하면됩니다. 행렬은 n나타나 도록 충분히 커야 하며 원점 (number )이 두 위치에서 동일한 위치에 있도록 홀수 크기 여야 1합니다.

온라인으로 시도하십시오 ! (6Y3언어 변경에 따라 이동되었습니다)

6Y3      % 'spiral' string
i        % input n
QG2\+    % round up to an odd number large enough
YL       % generate spiral matrix of that size: first matrix
t!       % duplicate and transpose: second matrix
G=       % logical index that locates n in the second matrix
)        % use that index into first matrix

0

Brachylog , 20 바이트

-1$r$[I*I+I+1=*2-?=.

이것은 거의 모든 다른 답변과 동일한 기술을 사용합니다.

설명

-1                   § Build the expression Input - 1
  $r                 § Square root of Input - 1
    $[I              § Unify I with the floor of this square root
       *I+I+1        § Build the expression I * I + I + 1
             =*2-?   § Evaluate the previous expression (say, M) and build the expression
                     § M * 2 - Input
                  =. § Unify the output with the evaluation of M * 2 - Input

이 답변에 대한 흥미로운 사실은 =괄호보다 사용 하기 가 쉽고 짧다는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.