새 주문 # 3 : 5 8 6


16

소개 (무시 될 수 있음)

모든 양수를 규칙적인 순서 (1, 2, 3, ...)로 넣는 것은 약간 지루하지 않습니까? 그래서 여기 모든 양수의 순열 (순환)에 관한 일련의 도전이 있습니다. 이것이이 시리즈의 세 번째 과제입니다 ( 첫 번째두 번째 과제에 연결).

이 도전에서, 우리는 각 행의 합이 소수가되도록 길이가 증가하는 행에 자연수를 배열 할 것입니다. 내가 이것에 대해 정말로 놀라운 것은 모든 자연수는이 배열에 자리를 잡고 있다는 것입니다. 숫자를 건너 뛰지 않습니다!

이 배열의 시각화는 다음과 같습니다.

row             numbers             sum
1                  1                  1
2                2   3                5
3              4   5   8             17
4            6   7   9  15           37
5          10 11  12  13  21         67
6        14  16 17  18  19  23      107
etc.

이 삼각형의 행에서 요소를 읽을 수 있습니다. 처음 20 개 요소는 1, 2, 3, 4, 5, 8, 6 , 7, 9, 15, 10, 11, 12, 13, 21, 14, 16, 17, 18, 19입니다 ( 예, 있습니다. 이 순서에 숨겨진 새 주문 노래 ).

이는 "순수한 시퀀스"문제이므로, 주어진 n에 대한 a ( n ) 을 입력 으로 출력 a(n) 것이 좋습니다 . 여기서 a ( n )A162371 입니다.na(n)

직무

정수 입력 주어지면 정수 형식으로 () 을 출력 하십시오 .

() 은자연수의 사 전형적으로 가장 빠른 순열의 번째 요소로 정의되므로행이 읽은 삼각형으로 볼 때 n> 1의 경우 행의 합은 소수입니다. 자연수의 첫 사전 사전 순열은 1로 시작하므로(1) 은 1입니다.이 정의에 의해(1)=1 이고(1) 이소수 일 필요는없습니다. OEIS 시퀀스A162371입니다.

참고 : 여기서는 1 기반 색인 작성이 가정됩니다. 0 기반 인덱싱을 사용할 수 있으므로 (0)=1;(1)=2 등이 있습니다. 이것을 사용하기로 선택한 경우 답에 언급하십시오.

테스트 사례

Input | Output
---------------
1     |  1
5     |  5
20    |  19
50    |  50
78    |  87
123   |  123
1234  |  1233
3000  |  3000
9999  |  9999
29890 |  29913

규칙

  • 입력 및 출력은 정수입니다 (프로그램은 1에서 32767까지의 입력 및 출력을 지원해야합니다).
  • 유효하지 않은 입력 (0, 부동, 문자열, 음수 값 등)으로 인해 예기치 않은 출력, 오류 또는 (정의되지 않은) 동작이 발생할 수 있습니다.
  • 기본 I / O 규칙이 적용됩니다.
  • 기본 허점 은 금지되어 있습니다.
  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.

시퀀스를 무한대로 출력하거나 발전기를 대신 반환 할 수 있습니까?
Jo King

2
Err, 1은 소수가 아닙니다
Jo King

1
a (1) = 1에 대한 @JoKing : 추가하겠습니다. 그것은 실제로 예외입니다. 이것은 OEIS 항목에 명확하게 언급되어 있습니다. 질문에 추가하겠습니다. 감사.
agtoever

@JoKing은 시퀀스의 정의는 n> 1에 대해 행의 합이 소수 여야한다는 점에 유의하십시오. 시퀀스는 자연수의 첫 사전 사전 순열이므로 a (1)은 1로 나타납니다. 따라서 실제로 1은 소수는 아니지만 시퀀스의 도전이나 정의는 1을 소수라고 말하거나 요구하지 않습니다. .
agtoever

4
관련 순서 : A075348 .
jimmy23013

답변:



3

펄 6 , 80 77 바이트

{({$!=@_;+(1...{$_$!&&(|$!,$_).rotor(1..*).one.sum.is-prime-1})}...*)[$_]}

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

설명:

{                                  }  # Anonymous code block
 (                        ...*)[$_]   # Index into the infinite sequence
  {                      }   # Where each element is
   $!=@_;  # Save the list of previous elements into $!
   +(1...{             })    # Return the first number that
          $_$!         # Has not appeared in the list so far
          &&            # And
          (|$!,$_)      # The new sequence
          .rotor(1..*)  # Split into rows of increasing length
                        # And ignoring incomplete rows
          .one          # Have exactly one row
          .sum          # Where the sum
          .is-prime-1   # Is not prime (i.e. just the first row)

3

하스켈 , 122120 바이트

import Data.Numbers.Primes
l%a|(p,q)<-splitAt l a,(s,k:t)<-span(not.isPrime.(+sum p))q=p++k:(l+1)%(s++t)
((1:1%[2..])!!)

온라인으로 사용해보십시오! (에 대한 추가 2 바이트가 있음 f=)

편집 : 이제 0 기반 인덱싱을 사용하여 2 바이트를 절약합니다. 그것을 지적 해 주셔서 감사합니다 @wastl, 나는 OP에서 그것을 놓 쳤어 야합니다.

이것은 매우 재미있었습니다! 도우미 함수 %는 사용할 수있는 길이 l와 값 목록을 사용 a합니다. 시퀀스에 대한 무한 값 목록을 반환합니다. 길이는 현재 삼각형 행의 길이보다 1이 적으며 목록은 무한하고 미리 정렬되어 있습니다. 먼저 첫 번째 l값을 얻은 a다음 합계를 만드는 첫 번째 (가장 작은) 값을 찾을 때까지 나머지를 살펴보십시오. span패턴 일치를 사용하여 해당 값을 중심으로 목록을 나눕니다. 이제 우리는 그 새로운 값을 산출하고 다음 줄 길이 l+1와의 나머지 값으로 반복 합니다 a. 최종 결과를 위해 우리는 1을 앞에 붙이고 (n = 0의 경우 특별한 경우)로 색인을 생성합니다 !!.


1
0:챌린지 상태에서 0 기반 인덱싱을 사용할 수 있으므로를 제거 할 수 있다고 생각 합니다.
wastl



0

루아 , 242 228 226 211 바이트

s={}u={}i=0 n=0+...while i<n do
n=n-i
x,S=1,0
for j=1,i do
while u[x]do x=x+1 end
s[j]=x
S=S+x
u[x]=0
end
while u[x]or p do
x=x+1
d=S+x
p=F
for c=2,d-1 do
p=p or d%c<1
end
end
i=i+1
s[i]=x
u[x]=0
end
print(s[n])

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

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