소개 (무시 될 수 있음)
모든 양의 정수를 규칙적인 순서 (1, 2, 3, …)로 넣는 것은 약간 지루하지 않습니까? 그래서 여기 모든 양의 정수의 순열 (순환 제거)에 관한 일련의 도전이 있습니다. 이것이이 시리즈의 여섯 번째 도전입니다 ( 첫 번째 , 두 번째 , 세 번째 , 네 번째 및 다섯 번째 도전에 연결됨).
이 도전은 부활절이기 때문에 온화한 부활절 테마가 있습니다. 나는 매우 장식 된 (그리고 개인적인 견해로는 오히려 못생긴) 거위 알에서 영감을 얻었습니다.
그것은 모든 양의 정수가 시계 반대 방향으로 배치되는 Ulam 나선을 생각 나게했습니다 . 이 나선형에는 소수와 관련된 몇 가지 흥미로운 기능이 있지만이 문제와 관련이 없습니다.
Ulam 나선에서 숫자를 취하고 1부터 시작 하여 시계 방향으로 돌리는 나선 에서 모든 정수를 추적하면 양수 정수의 순열에이 도전이 적용됩니다 .
1, 6, 5, 4, 3, 2, 9, 8, 7, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 25, 24, 23, etc.
당신이 나선을 모두 끌어한다면, 당신은 무한의 일종 얻을 것 메시 (달걀 껍질) 나선의을 ( 노트 새로운 주문 참조가를 ).
직무
테스트 사례
Input | Output
---------------
1 | 1
5 | 3
20 | 10
50 | 72
78 | 76
123 | 155
1234 | 1324
3000 | 2996
9999 | 9903
29890 | 29796
규칙
답변
젤리 , 16 14 11 10 9 8 바이트
-1 린 덕분에 (MOD-2 논리적 NOT, 자기에 추가 : Ḃ¬+
-> 비트 또는 1 : |1
)
|1×r)ẎQi
정수를 받아들이는 monadic Link는 정수 n
를 산출합니다 a(n)
.
11 바이트 버전 ½‘|1×rƲ€ẎQi
은 30 초 미만의 가장 큰 테스트 사례를 모두 완료 합니다. TIO에서 시도해보십시오. 이는 사용 된 계층을 제한합니다.
어떻게?
순열은 길이가 반대 인 슬라이스에서 자연수를 취합니다 [1,5,3,11,5,17,7,23,9,29,11,35,13,...]
. 홀수 양의 정수는 5 개의 모듈로 6과 일치하는 양의 정수와 산재합니다 [1, 2*3-1, 3, 4*3-1, 5, 6*3-1, 7, 8*3-1, 9, ...]
.
이 역전 범위 중복 제거 후 연접과 동일하다 [1..x]
어디에 x
– (즉, 각각의 슬라이스의 최대 값)이 슬라이스 길이의 누적 합 인 [1,6,9,20,25,42,49,72,81,110,121,156,169,...]
홀수 정수 자체가 증가함으로써, 즉, 승산 짝수 산재 제곱 어느 [1*1, 2*3, 3*3, 4*5, 5*5, 6*7, 7*7,...]
.
차이가 모두 1보다 크므로 범위를 [x..k]
직접 작성 하여 바이트 (반전)를 절약 할 수 있습니다. 여기서 k
슬라이스의 1 인덱스 인덱스는 어디 입니까?
n
|1×r)ẎQị@
n
|1×r)ẎQi
|1×r)ẎQi - Link: integer, n e.g. 10
) - for each k in [1..n]: vs = [ 1, 2, 3, 4, 5, 6, 7, 8, 9,10]
|1 - bitwise-OR (k) with 1 [ 1, 3, 3, 5, 5, 7, 7, 9, 9,11]
× - multiply (by k) [ 1, 6, 9,20,25,42,49,72,81,110]
r - inclusive range (to k) [[1],[6..2],[9..3],[20..4],...,[110..10]]
Ẏ - tighten [1,6,5,4,3,2,9,8,7,6,5,4,3,20,...,4,......,110,...,10]
Q - de-duplicate [1,6,5,4,3,2,9,8,7,20,...,10,......,110,...82]
i - first index with value (n) 20
답변
자바 스크립트 (ES7), 46 45 41 바이트
인덱스가 0입니다.
n=>((x=n**.5+1&~1)*2-(n<x*x+x)*4+3)*x+1-n
어떻게?
이것은 A090861 의 예제 프로그램에서 사용 된 1- 색인 공식을 기반으로합니다 .
다음과 같이 번역 될 수 있습니다.
n=>8*(x=(n-1)**.5+1>>1)*x+(n<=4*x*x+2*x?-2:6)*x+2-n
0 인덱싱하면 5 바이트가 즉시 절약됩니다.
n=>8*(x=n**.5+1>>1)*x+(n<4*x*x+2*x?-2:6)*x+1-n
다음을 사용하여 공식을 더 단순화 할 수 있습니다.
다음과 같이 표현할 수 있습니다.
x=n**.5+1&~1
이어지는 :
n=>2*(x=n**.5+1&~1)*x+(n<x*x+x?-1:3)*x+1-n
그리고 마지막으로:
n=>((x=n**.5+1&~1)*2-(n<x*x+x)*4+3)*x+1-n
답변
Wolfram Language (Mathematica) , 60 바이트
8(s=⌊(⌊Sqrt[#-1]⌋+1)/2⌋)^2-#+2+If[#<=4s^2+2s,-2,6]s&
답변
답변
C # (Visual C # 대화식 컴파일러) , 67 바이트
n=>8*(x=(int)Math.Sqrt(--n)+1>>1)*x+(n<4*x*x+2*x?-2:6)*x+1-n;int x;
답변
Python 3.8, 104 74 65 60 57 바이트
lambda n:(-2,6)[n>4*(x:=(n**.5+1)//2)*x+2*x]*x+2+~n+8*x*x
편집 : 74에서 57 바이트까지 가져 와서 Johnathan Allan에게 감사드립니다!
이 솔루션은 0 기반 인덱싱을 사용합니다.
답변
Python 3.8 (시험판) , 53 바이트
Arnauld의 JavaScript 답변의 직접 포트 , 투표 및 J42161217의 Mathematica answer 및 / 또는 Kapocsi의 Python 답변 🙂
lambda n:((x:=int(n**.5+1)&-2)*2-(n<x*x+x)*4+3)*x+1-n
인덱스가 0입니다.