시퀀스에없는 정수의 합 시퀀스


28

배경

다음과 같이 정의 된 순서를 고려하십시오.

  • 첫 번째 요소는 0입니다.
  • 두 번째 요소는 4입니다.
  • 세 번째 요소부터 다음과 같이 값을 계산할 수 있습니다.
    • 0에서 시퀀스의 이전 요소까지 정수 세트를 가져옵니다 (포함 또는 배타, 중요하지 않음).
    • 시퀀스에서 이미 나타난 정수를 세트에서 제거합니다.
    • 세트의 나머지 요소들을 더하는 것; 그것이 당신이 원하는 가치입니다.

흥미롭게도이 시퀀스는 아직 OEIS 에없는 것 같습니다 .

작업

정수 n 을 입력으로 받아서 시퀀스 의 n 번째 요소를 출력 하는 프로그램 또는 함수를 작성하십시오 .

테스트 사례

시퀀스의 처음 몇 가지 요소는 다음과 같습니다.

  • 0
  • 4
  • 6 (1 + 2 + 3)
  • 11 (1 + 2 + 3 + 5)
  • 45 (1 + 2 + 3 + 5 + 7 + 8 + 9 + 10)
  • 969 (1 + 2 + 3 + 5 + 7… 10 + 12… 44)
  • 468930 (1 + 2 + 3 + 5 + 7… 10 + 12… 44 + 46… 968)

설명

  • 이론적으로 프로그램 은 무한정의 큰 정수를 갖고 무제한의 메모리에 액세스하는 언어의 변형에서 실행되는 경우 임의의 n 을 처리 할 수 ​​있어야합니다 . (큰 숫자가없는 언어는 468930 이상을 얻을 수는 없지만 대답을 하드 코딩 할 이유는 없습니다.)
  • 시퀀스에 대해 0 기반 또는 1 기반 색인을 선택할 수 있습니다 (예 : n = 1이 첫 번째 요소를 반환 하는지 , n = 2가 두 번째 요소를 반환 하는지 등) 또는 n = 0이 첫 번째 요소를 반환 하는지 여부는 사용자에게 달려 있습니다 , N = 1 번째 요소 등)에.
  • 사용하는 알고리즘이나 효율성에 대한 요구 사항은 없습니다. 시퀀스의 정의를 직접 구현할 수도 있지만 (실제로 비효율적 임에도 불구하고) 동일한 결과를 가져 오는 다른 알고리즘을 구현할 수도 있습니다.

승리 조건

이것은 이므로 바이트 단위로 측정 된 가장 짧은 올바른 프로그램이 승리합니다.


1
입력하는 대신 무한 출력을 허용하지 않는 이유는 무엇입니까?
John Dvorak

2
@ JanDvorak : 모든 프로그램이 모든 항을 생성하는 알고리즘을 사용하도록 강요하기 때문입니다. 이 질문을 작성하는 방법은 응답자가 원하는지 또는 닫힌 형식의 수식을 사용할지 여부를 응답자에게 맡깁니다. 따라서 문제를 해결하는 데 더 많은 전략을 선택할 수 있습니다.

1
0,4가 이상한 오프셋이기 때문에 시퀀스가 ​​존재하지 않는다고 가정합니다.
boboquack

1
@boboquack (0,3), (0,2), (1,4) 또는 이와 유사한 변형을 사용하면 몇 번의 용어 후에도 시퀀스가 ​​일정합니다.
Dennis

[math] 태그가 이것에 적합합니까?
mbomb007

답변:


10

젤리 , 13 12 9 바이트

rSạo4¥ð@¡

0 기반 인덱싱을 사용합니다.

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

작동 원리

rSạo4¥ð@¡  Main link. No arguments. Implicit argument: 0

      ð    Collect everything to the left into a chain and start a new, dyadic one.
           The arity of the first chain is unknown at this point, as it isn't
           prefixed by ø, µ, or ð.
       @   Swap the arguments of the first chain. Swapping  arguments is only
           implemented for dyadic links, so this makes the chain dyadic.
        ¡  Read an integer n from STDIN and execute the chain n times. Taking the
           argument swap into account, the chain is executed first with 0 as left
           and right argument, then with the previous right argument as left
           argument and the previous return value as right argument.
           The return value of the last call is the return value of the quicklink
           and becomes the implicit output.

           Let's call the left argument x and the right argument y.
r            Range; yield [x, ..., y].
 S           Compute the sum of all integers in the range.
     ¥       Convert the two atoms to the left into a dyadic chain, and call that
             chain with arguments x and y.
   o4          Take the logical OR of x and 4, replacing a 0 with 4 and leaving
               positive integers untouched.
  ạ          Take the absolute difference of the sum to the left and the result of
             the logical OR to the right.

10

파이썬, 66 60 바이트

6 바이트를 줄인 @Dennis에게 감사드립니다!

f=lambda n:n>2and(f(n-1)-~f(n-2))*(f(n-1)-f(n-2))/2or(5-n)*n

가장 골치 아픈 코드는 아니지만 내가 만든 공식을 사용합니다.

여기에 이미지 설명을 입력하십시오

어디 x오른쪽은에 f(n - 1)하고 y있다 f(n - 2).

설명:

연속하는 정수의 합 a으로 b(포함)는이 식에 의해 설명 될 수있다 :

amount * average

어디 amount(숫자의 양)과 같이 설명되어 있습니다 :

((a - b) - 1)

그리고 average(모든 수의 평균)은 다음과 같이 설명됩니다 :

(a + b) / 2

이제 전체 공식은 다음과 같습니다.

  ((a - b) - 1)(a + b) / 2
= (a - b - 1)(a + b) / 2

이 공식을 최종 공식에 구현하는 방법은를 대신하는 것 a입니다 f(n - 1). bfor f(n - 2)는 기본적으로 모든 새 용어의 합계를 계산하고 다른 모든 용어 f(n - 1)(현재는 a)를 추가합니다 ( 이전의 모든 용어의 합계).

이를 결합하면 다음과 같은 이점이 있습니다.

  a + ((a - b - 1)(a + b) / 2)
= a + ((a^2 + ab - ab - b^2 - a - b) / 2)
= a + ((a^2 - b^2 - a - b) / 2)
= (a^2 - b^2 - a - b + 2a) / 2
= (a^2 - b^2 + a - b) / 2
= ((a + b)(a - b) + (a - b)) / 2
= (a + b + 1)(a - b) / 2

교체 axby와 헤이 프레스토, 당신은 위의 공식에 있습니다.



9

Mathematica, 49 48 바이트

±2=4;±1=0;±n_:=Tr@Range@±(n-1)-Tr@Array[±#&,n-1]
(* or *)
±2=4;±1=0;±n_:=-Tr@Array[(k=±#)&,n-1]+Tr@Range@k

CP-1252 인코딩을 사용합니다. 기능을 정의합니다 PlusMinus (±). 1- 색인.

설명

±2=4;±1=0;±n_:=Tr@Range@±(n-1)-Tr@Array[±#&,n-1]

±2=4;±1=0;                                        (* Define ±1 and ±2 *)
          ±n_:=                                   (* ±n equals ... *)
               Tr@Range@±(n-1)                    (* Sum of (1, 2, ..., ±(n-1)) ... *)
                              -Tr@Array[±#&,n-1]  (* Minus the sum of previous terms *)

8

오아시스 , 11 바이트

암호:

+>bc-*2/640


설명:

f n 의 관계를 시각화하기 위해 f 5 예제를 살펴 보겠습니다 . f 5 를 계산하려면 다음 합계를 살펴 보겠습니다.

1 + 2 + 3 + 5 + 7 + 8 + 9 + 10

굵은 체 부분은 f 4 와 동일 합니다. 7 + 8 + 9 + 10 부분의 범위 인 [F N-2 + 1, F , N-1 - 1] . 수식 f n-1 + Σ [f n-2 + 1 ... f n- 1-1 ] ( Wolfram link ) :

f n = 0.5 × (f n-1 2 -f n-2 2 + f n-1 -f n-2 )

다음과 같이 다시 작성할 수 있습니다.

f n = 0.5 × ((f n-1 -f n-2 ) (f n-1 + f n-2 ) + (f n-1 -f n-2 ))

f n = 0.5 × ((f n-1 -f n-2 ) (f n-1 + f n-2 + 1))

코드에서 사용할 공식은 다음과 같습니다.


코드 설명

640부분은 우리에게 기본 사례를 제공합니다.

a(0) = 0
a(1) = 4
a(2) = 6

실행될 코드 ( a (n) 정의 ) :

+>bc-*2/

+          # Add a(n + 1) and a(n + 2) implicitly
 >         # Add one to get a(n + 1) + a(n + 2) + 1
  b        # Push a(n + 1)
   c       # Push a(n + 2)
    -      # Subtract from each other
     *     # Multiply with the previous result
      2/   # Halve the result

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


3
설명? 이것은 다른 많은 답변보다 호기심이 생겼습니다.

@ ais523 설명을 추가했습니다.
Adnan

5

줄리아, 39 33 32 바이트

!n=n<3?5n-n^2:sum(!(n-2)+1:!~-n)

0부터 시작합니다.

@Dennis 덕분에 6 바이트가 절약되었습니다.

@GlenO 덕분에 바이트가 절약되었습니다.

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

이전 답변 1 기반 :

!n=n<4?2(n>1)n:sum(!(n-2)+1:!~-n)

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

이전 ungolfed 답변 1 기반 :

f(n)=n<4?n<2?0:n*2:sum(f(n-2)+1:f(n-1))

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


1
여분의 바이트를 저장하려면 n<3?5n-n^2:대신 사용 n<4?2(n>1)n:하십시오. 그러나 0 기반 색인 사용으로 전환한다는 점에 유의하십시오.
Glen O

@GlenO 감사합니다. 1 바이트가 절약되었습니다!
rahnema1 2012

4

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

f=(n,b=4,a=6)=>n?--n?f(n,a,(a+b+1)*(a-b)/2):b:0

f(n) = sum(range(f(n-2) + 1, f(n-1) + 1))n> 2 의 재귀 관계를 사용합니다 .


4

PowerShell , 84 89 88 87 바이트

$OFS='+'
for($a=0,4;$a.Count-le($n="$args")){$a+=("$(1..$a[-1])"|iex)-("$a"|iex)}$a[$n]

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

설명

0 기반 인덱싱 n = 6내 컴퓨터 에서만 작동합니다 (내 Windows 시스템에서는 스택 오버플로로 충돌합니다 n = 7).

JungHwan Min의 답변 과 동일한 방법을 사용합니다 (범위의 합계에서 이전 항의 합계를 뺀 값).

PowerShell에서 범위 / 배열을 합산하는 것은 길기 때문에 배열을 결합하는 트릭을 사용하고 있습니다. + 긴 식 (같은 1+2+3+4...etc)을 만든 다음 iex( Invoke-Expression)을 통해 보내는 있습니다 .

사용하지 않고 두 번해야하므로 -join$OFS 출력 필드 구분 기호를 나타내는 특수 변수를 설정하고 있습니다. 배열을 문자열화할 때 이것은 요소를 결합하는 데 사용되는 문자입니다. 기본값은 공백입니다. 그래서으로 설정하여 +(한 번), 내가 좋아하는 뭔가를 대체 할 수있는 $a-join'+'|iex과를 "$a"|iex.

간단한 for루프는 시퀀스 카운트가 입력 정수보다 작거나 같을 때까지 계속 진행 한 다음 $nth 요소를 반환합니다 .


트윗 담아 가기 나는 그것이 분명한 대답에 합당하다고 생각합니다. 그 방법은 내가 사용한다면 내 자신처럼 느껴지지 않을 정도로 다릅니다.
briantist

1
@AdmBorkBork nice, +1, 그리고 루프에서 ;필요 없는 한 가지를 배웠습니다 for. 한 번도 그 사실을 깨닫지 못했습니다.
briantist

3

MATL , 17 16 바이트

OKi:"tP:yX-sv]G)

1기반 인덱싱이 사용됩니다. 코드는 매우 비효율적입니다. 에 대한n = 6 그것은 이미 온라인 컴파일러의 메모리 제한을 초과합니다.

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

작동 원리

O       % Push 0
K       % Push 4
i       % Input n
:"      % Do the following n times
  t     %   Push a copy of the top array (or number)
  P:    %   Range from 1 to the last element of array
  y     %   Push a copy of the second-top number/array
  X-    %   Set difference
  s     %   Sum
  v     %   Concatenate everything into a column vector
]       % End
G)      % Get n-th entry of the array. Implicity display

들어 20 바이트 , 다음 버전은 메모리 제한을 피할 수 있습니다. 그러나 여전히 데이터 유형 제한이 있습니다 ( double유형은 정수가 정확하게 표현되는 것만 보장 할 수 있음 2^53). 결과는 유효합니다 n = 8.

OKi:"t0)tQ*2/ys-v]G)

온라인으로 시도하십시오 !


2

하스켈 , 42 바이트

f 0=0
f 1=4
f 2=6
f n=sum[1+f(n-2)..f$n-1]

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

이것은 바로 그 대한 재발 구현 n>2, f(n)동일 f(n-1)플러스의 개방 구간의 합 f(n-2)f(n-1)다시에서 반 개방 구간의 합과 동일하다 f(n-2)f(n-1)포함한다.

f(0) = 0
f(1) = 4
f(2) = 6 = 1+2+3
f(3) = 11 = 1+2+3+5 = 6 + 5 = 6 + sum]4,6[ = f(2)+ sum]f(1),f(2)[ = sum]f(1),f(2)]
...
f(n) = sum]f(n-2),f(n-1)] = sum[f(n-2)+1,f(n-1)]

2

하스켈, 31 바이트

m#s=m:s#sum[m+1..s]
((0:4#6)!!)

사용 예 : ((0:4#6)!!) 6-> 468930. 온라인으로 사용해보십시오! .

m지금까지 최대 요소 와 다음 값을 추적하는 간단한 재귀 s.


나는 새로운 도전에 올 때마다, 사람은 항상 내가 XD 만들 수있는 더 잘보다 하스켈 답을 만들어졌다
theonlygusti

나는 항상 약간의 수학 도전에 도달합니다. "이봐 마침내 하스켈을 시험해 볼 수 있습니다!" CMD-F 'Haskell'– 아, 잠깐만 요,이 대답은 ... 잠깐만 요? haskell 포기
theonlygusti


2

펄 6 ,  52 49 44  35 바이트

{(|(0,4 X 0),{[+](^.[0])-.[1],.[0]+.[1]}...*)[$_;0]}

시도 해봐

{(0,(4,0),{[+](^.[0])-.[1],.[0]+.[1]}...*)[$_;0]}

시도 해봐

{(0,(4,0),{[+](^.[0])-.[1],.sum}...*)[$_;0]}

시도 해봐

{(0,4,6,{[+] $^a^..$^b}...*)[$_]}

시도 해봐

넓히는:

{ # bare block lambda with implicit parameter 「$_」

  (
    # generate a sequence

    0, 4, 6,      # seed the sequence

    {             # lambda with placeholder parameters 「$a」 「$b」
      [+]         # reduce with 「&infix:<+>」
          $^a     # n-2
          ^..     # Range that excludes the first value
          $^b     # n-1
    }
    ...           # keep generating values until
    *             # never stop

  )[ $_ ]         # get the value that was asked for (0 based index)
}

2

PowerShell , 77 73 바이트

param($n)$a=0,4;1..$n|%{$a+=(0..$a[-1]|?{$_-notin$a})-join'+'|iex};$a[$n]

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

정의 된대로 알고리즘을 구현하고 0 색인화됩니다. 6TIO가 처리하기에 너무 많은 입력이 있습니다.

$a배열로 설정 합니다 [0,4]. 1입력에서 입력까지 반복 합니다 $n. 루프에서 우리는 0우리가 가진 가장 큰 숫자에서 숫자의 범위를 취하고 절 을 $a[-1]사용하여 아직 존재하지 않는 숫자 만 뽑습니다. 해당 숫자 배열은 s 와 함께 연결 되고 (의 줄임말 과 유사한 )에 공급됩니다 . 그런 다음이 값은의 끝에 배열로 연결 됩니다. 마지막으로 루프를 종료 하고 배열의 숫자를 가져 옵니다. 이 번호는 파이프 라인에 남아 있으며 출력은 암시 적입니다.Where-Object|?{...}-join+iexInvoke-Expressioneval$a$n



1

배치, 108 바이트

@if %1==0 echo 0&exit/b
@set/ab=4,a=6
@for /l %%i in (2,1,%1)do @set/ac=(a+b+1)*(a-b)/2,b=a,a=c
@echo %b%

내 JavaScript 답변의 포트.


1

dc , 47 바이트

?d1-scd/4*dd[d1+*2/r-dsn+dlnlc1-dsc0<x]sxlc0<xp

컴퓨터의 메모리 용량까지 원하는만큼 큰 정수로 작동합니다.

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

0 기반 인덱싱, stdin에 입력, stdout에 출력 (stderr에도 출력이 있으며 무시해야합니다.)

샘플 실행 :

$ for ((j=0;j<12;j++)){ echo -n "$j ";dc -f sumseq.dc <<<"$j";echo;} 2>/dev/null
0 0

1 4

2 6

3 11

4 45

5 969

6 468930

7 109947436950

8 6044219445882138462810

9 18266294354989892462984673364511343859409730

10 166828754731567805766174036610844675771635260155825966927845486666328\
837158267993261860

11 139159167026428037700805570917048711514125048327321592278500415852500\
422178720517080334552793040951056255170819719745908378102737875659900\
61575545777065220385544711322919415

이것은 bash의 다음 솔루션과 동일한 알고리즘을 사용합니다.

순수한 bash, 60 바이트

for((n=s=$1?4:0,k=1;k<$1;k++,s+=(n=n++*n/2-s))){ :;}
echo $n

그러나 bash 프로그램은 그 이상으로 정수 오버플로가 발생하기 때문에 최대 7까지의 입력에 대해서만 작동합니다.



0

C #-74 바이트

int A(int f){int e=4,i=1,s=0;for(;i++<f;)e=e*-~e/2-(s+=e);return f>0?e:0;}

언 골프 드 :

int A(int f)
{
    int e = 4, 
        i = 1, 
        s = 0; // e is the last element, s is the sum of all previous elements
    for (; i++ < f; ) // calculate for indexes 1 through max (don't need the index, just a correct number of loop cycles)
        e = e * -~e / 2 - (s += e); // -~e => (e + 1), higher precedence to remove parentheses
    return f > 0 ? e : 0; //handle input 0 as a special case, which is 0
}

더 많은 것을 저장하기 위해 이것을 람다로 변환하거나 .Aggregate Function을 사용하는 방법이있을 것입니다. 현재 수입품이 없지만 고르지 않습니까?


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