세그먼트 번호


15

세그먼트 번호 또는 소수 측정 순서 ( OEIS A002048 )는 각 멤버가 이전의 연속 숫자의 합으로 만들 수없는 가장 작은 양수 (0보다 큰) 숫자가되도록 숫자의 순서입니다 a(0) = 1.

계산하려면 a(7)먼저 계산 a(0->6) = [1, 2, 4, 5, 8, 10, 14]합니다. 그런 다음 0에서 시작하여 시퀀스에서 하나 이상의 연속 숫자의 합이 아닌 숫자를 찾을 때까지 숫자를 살펴 봅니다.

1  = 1
2  = 2
3  = 1 + 2
4  = 4
5  = 5
6  = 2 + 4
7  = 1 + 2 + 4
8  = 8
9  = 4 + 5
10 = 10
11 = 2 + 4 + 5
12 = 1 + 2 + 4 + 5
13 = 5 + 8
14 = 14
15 = ????

연속적인 서브 시퀀스를 합하여 15 개를 만들 수 없으며, 더 작은 숫자는 15 개가 시퀀스의 다음 숫자 일 수 있습니다. a(7) = 15

직무

당신의 임무는 숫자를 취하고 (표준 방법을 통해)이 순서에서 n 번째 항을 표준 출력 방법을 통해 출력하는 것입니다. 이것은 코드 골프이며 당신은 그렇게 점수가 매겨 질 것입니다.

테스트 사례

0 -> 1
1 -> 2
2 -> 4
3 -> 5
4 -> 8
5 -> 10
6 -> 14
7 -> 15
8 -> 16
9 -> 21

답변:


12

하스켈, 62 58 바이트

@xnor 덕분에 -4 바이트!

(x:y)#z=x:filter(`notElem`scanl(+)x z)y#(x:z)
([1..]#[]!!)

시퀀스는 0 인덱스입니다.


1
나는 당신이 2 바이트를 더 필요 ()로하고 그것을 올바른 기능으로 만들기 위해 마지막 줄을 둘러싸고 있다고 생각합니다 . 적용되는 부분 !!은 운영자 섹션이며 기능을 수행하려면 동봉되어야합니다 (). 그것이 없으면 누락 된 인수가있는 함수 (또는 엄격한 Haskell 용어를 사용하는 "값") 만되는 스 니펫 일뿐입니다.
nimi

1
아름다운 방법! 수입은 과잉처럼 보인다. filter(`notElem`scanl(+)x z)y해야 할 것.
xnor

7

펄, 50 49 바이트

에 +1 포함 -p

STDIN의 입력으로 실행 :

segmented.pl <<< 7

segmented.pl:

#!/usr/bin/perl -p
${$_-=$\}++for@F;1while${-++$\};++$#F<$_&&redo}{

설명

@F현재 마지막 숫자로 끝나는 연속 숫자의 (음수) 합계 목록을 포함합니다. 새로운 숫자가 발견되면 목록은 0으로 확장되고 모든 값은 새로운 숫자로 감소하여 불변성을 유지합니다.

Global %::은 ( @F0을 통해 ) 보이는 모든 (음수) 숫자를 0이 아닌 값으로 매핑하는 해시로 사용됩니다 .

$\는 현재 숫자이며 아직 값에 도달 할 때까지 증가합니다 %::.

초기화가 필요없는 모든 일이 발생하는 순서에 약간주의를 기울이면 1자동으로 첫 번째 숫자가됩니다.

크기는 @F생성 된 숫자의 수이므로 정지 조건으로 사용할 수 있습니다.


4

05AB1E , 17 16 바이트

Xˆ$µ>D¯ŒOså_i¼Dˆ

설명

Xˆ                # initialize global array to [1]
  $               # push 1 and input to stack
   µ              # while counter != input
    >             # increase variable on stack
      ¯ŒO         # list of all sums of consecutive number in global array
     D   så_i     # if current stack value is not in the list
             ¼    # increase counter
              Dˆ  # add current stack value to global array

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

Adnan 덕분에 1 바이트 절약


합니까 $대신 Xs사용할 수 있습니까?
Adnan

@Adnan : 물론입니다. 바보 야 감사!
에미 냐

4

젤리 , 14 13 11 바이트

Ḷ߀Ẇ;ḅ1‘ḟ$Ṃ

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

작동 원리

Ḷ߀Ẇ;ḅ1‘ḟ$Ṃ  Main link. Argument: n

Ḷ            Unlength; yield [0, ..., n - 1].
 ߀          Recursively map the main link over the range.
   Ẇ         Window; yield all subarrays of consecutive elements of the result.
    ;        Append n to the array of subarrays.
     ḅ1      Convert all subarrays from base 1 to integer.
             This is equivalent to S€ (sum each), but it allows ; to hook.
         $   Combine the previous two links into a monadic chain.
       ‘       Increment all sums.
        ḟ      Filter; remove the original sums from the incremented ones.
          Ṃ  Compute the minimum.

2

피스- 19 17 바이트

내 모든 암시를 망치는 사람에 의해 망할. (같은 바이트 수, 리터럴 증가 Q:=hQesmaYf!}TsM.:Y )

esmaYf!}TsM.:Y)1h

테스트 스위트 .


reduce를 사용하면 1 바이트 만 저장됩니다. 더 많은 기대eu+Gf!}TsM.:G))hQY
Jakube

1
@Jakube 맵은 일반적으로 이와 같은 자기 참조 시퀀스에 대해 더 짧습니다
Maltysen

2

자바 스크립트, 125 (112) 110 바이트

@Neil 덕분에 2 바이트 절약

f=n=>{a=[[]];for(i=1,z=0;z<=n;i++)a.some(b=>b.includes(i))||(a[z+1]=[0,...a[z++]||[]].map(v=>i+v));alert(i-1)}

이전 답변

@Neil 덕분에 112 바이트 :

f=n=>{a=[[]];for(i=1,z=0;z<=n;i++)if(!a.some(b=>b.includes(i))){a[z+1]=[0,...a[z++]||[]].map(v=>i+v)}alert(i-1)}

125 바이트 :

f=n=>{a=[[]];for(i=1,k=z=0;z<=n;i++)if(a.every(b=>b.every(c=>c-i))){a[i]=[i].concat((a[k]||[]).map(v=>i+v));k=i,z++}alert(k)}

1
의 경우 대체 할 수도 있지만 b.every(c=>c-i)시도 !b.includes(i)하거나 !a.some(b=>b.includes(i))작동 [0,...a[k]||[]].map(v=>i+v)할 수도 있습니다 [i].concat((a[k]||[]).map(v=>i+v)). 또한 정말로 필요 k합니까?
Neil

1
이제는 if(!...){...}하나의 진술이므로 이제 ...||(...)또는로 대체 할 수 ...?0:...있습니다.
Neil

1

파이썬, (113) 105 92 80 바이트

s=F={1}
x=1
exec"while{x}<=s:x+=1\nF={x+j for j in{0}|F};s|=F\n"*input()
print x

내가 저장 한 마지막 바이트는 Ton 's Perl 답변에서 영감을 얻었 F습니다 @F. 내 s본질적으로 그의 것과 같은 일을 %::합니다.


1

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

(n,a=[],s=a,i=1)=>s[i]?f(n,a,s,i+1):--n?f(n,[0,...a].map(j=>s[j+=i]=j),s,i):i

기본적으로 @TonHospel의 Perl 답변 알고리즘의 재귀 포트.

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