N- 보나 치 수열 인쇄


54

이것은 널리 알려져 있지 않지만 피보나치 시퀀스, AKA라고 부르는 것

1, 1, 2, 3, 5, 8, 13, 21, 34...

실제로 Duonacci 시퀀스 라고합니다 . 다음 숫자를 얻으려면 이전 두 숫자를 합산하기 때문입니다. 도있다 Tribonacci의 순서는,

1, 1, 1, 3, 5, 9, 17, 31, 57, 105, 193, 355, 653, 1201...

다음 숫자는 이전 3 개의 숫자의 합이므로 그리고 Quadronacci 시퀀스

1, 1, 1, 1, 4, 7, 13, 25, 49, 94, 181, 349, 673...

그리고 모두가 가장 좋아하는 Pentanacci 시퀀스 :

1, 1, 1, 1, 1, 5, 9, 17, 33, 65, 129...

그리고 Hexanacci 서열, Septanacci 서열, Octonacci 서열 등은 N-Bonacci 서열까지입니다.

N- 보나 치 수열은 항상 연속적으로 N 1로 시작 합니다.

도전

두 개의 숫자 N 과 X 를 취하고 첫 번째 X N- 보나 치 수를 인쇄 하는 함수 나 프로그램을 작성해야합니다 . N은 0보다 큰 정수이며 N-Bonacci 숫자가 사용자 언어의 기본 숫자 유형을 초과하지 않는다고 가정 할 수 있습니다. 출력은 사람이 읽을 수있는 형식 일 수 있으며 합리적인 방식으로 입력 할 수 있습니다. (명령 줄 인수, 함수 인수, STDIN 등)

평소와 같이 이것은 코드 골프이므로 표준 허점이 적용되고 바이트 단위의 최단 답변이 승리합니다!

샘플 IO

#n,  x,     output
 3,  8  --> 1, 1, 1, 3, 5, 9, 17, 31
 7,  13 --> 1, 1, 1, 1, 1, 1, 1, 7, 13, 25, 49, 97, 193
 1,  20 --> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
 30, 4  --> 1, 1, 1, 1       //Since the first 30 are all 1's
 5,  11 --> 1, 1, 1, 1, 1, 5, 9, 17, 33, 65, 129

1
남자, 나는이 아이디어를 얼마 전에 가지고 있었고 결코 그것을 쓰지 않았습니다.
— Morgan Thrapp 2016 년

9
내 투표 버튼 == 아바타
— ETHproductions

3 BONACCI는하지 않을까요 1, 1, 2, 4, 7세 번째 위치가 될 것 같은 0 + 1 + 1? ... 그리고 다른 사람들과 하나?
— 우산

1
@umbrella 아니요, tribonacci는 3 1로 시작합니다. 이 점을 명확히하기 위해 편집을 참조하십시오.
— DJMcMayhem

답변:


23

Boolfuck, 6 바이트

,,[;+]

N-Bonacci 숫자가 사용자 언어의 기본 숫자 유형을 초과하지 않는다고 가정 할 수 있습니다.

Boolfuck의 기본 숫자 유형은 약간입니다. 이것도 입력 번호 N과 X로 확장되고 N> 0이라고 가정하면 10 (아무것도 출력하지 않음)과 11 (1을 출력하는 것)의 두 가지 가능한 입력 만 있습니다.

,현재 메모리 위치로 비트를 읽습니다. N은 1이어야하므로 무시됩니다. X가 0 인 경우 루프 본문 (으로 둘러싸인 [])을 건너 뜁니다. X가 1이면 출력되고 0으로 전환되어 루프가 반복되지 않습니다.


4
이와 같은 표준 허점이 없습니까?
— Stan Strum

1
@StanStrum이 답변 전후에?
— user253751

2
나는 그것이 전에 왔다고 믿습니다, 그것을 확인해 봅시다 ... Meta Link ; 최초 개정 은 2016 년 1 월 31 일 13:44입니다. 와우, 신경 쓰지 마! 나는 이틀 쉬었다. 완고하기는했지만 마지막 편집은 2016 년 1 월 31 일 16:06입니다. Soooooo 네, 제 책에는 괜찮습니다
— Stan Strum


8

피스, 13

<Qu+Gs>QGEm1Q

테스트 스위트

입력 줄 바꿈을 n먼저 분리 합니다.

설명:

<Qu+Gs>QGEm1Q  ##  implicit: Q = eval(input)
  u      Em1Q  ##  read a line of input, and reduce that many times starting with
               ##  Q 1s in a list, with a lambda G,H
               ##  where G is the old value and H is the new one
   +G          ##  append to the old value
     s>QG      ##  the sum of the last Q values of the old value
<Q             ##  discard the last Q values of this list

1
와우, 그것은 빠르다. 이미 게시하기 전에 브라우저를 닫을 시간이 거의 없었습니다!
— DJMcMayhem

5

하스켈, 56 바이트

g l=sum l:g(sum l:init l)
n#x|i<-1<$[1..n]=take x$i++g i

사용 예 : 3 # 8-> [1,1,1,3,5,9,17,31].

작동 원리

i<-1<$[1..n]           -- bind i to n copies of 1
take x                 -- take the first x elements of
       i++g i          -- the list starting with i followed by (g i), which is
sum l:                 -- the sum of it's argument followed by
      g(sum l:init l)  -- a recursive call to itself with the the first element
                       -- of the argument list replaced by the sum

tail l대신 해서는 안 init l됩니까?
— 자부심을 가진 haskeller

@proudhaskeller : 중요하지 않습니다. 우리는 마지막 n요소를 목록에 유지합니다 . 초기 목록이 1s 로만 구성되어 있기 때문에 끝에서 제거하고 앞면에 추가하는 것과 반대 방향으로 차이를 두지 않습니다 .
— nimi

아 알겠다. 대체 ++[]하는 좋은 방법입니다 :!
— 자부심을 가진 haskeller

@ proudhaskeller : 그렇습니다!
— nimi

5

파이썬 2, 55 바이트

def f(x,n):l=[1]*n;exec"print l[0];l=l[1:]+[sum(l)];"*x

합계를 추가하고 첫 번째 요소를 제거하여 업데이트 된 n목록에서 시퀀스 의 길이 창을 추적합니다 l. 각 반복마다 첫 번째 요소를 인쇄합니다 x.

모든 요소를 ​​저장하고 마지막 n값을 합산하는 다른 접근 방식은 동일한 길이 (55)를 제공했습니다.

def f(x,n):l=[1]*n;exec"l+=sum(l[-n:]),;"*x;print l[:x]

5

자바 스크립트 ES6 / ES2015 107 97 85 80 바이트

바이트를 절약하기위한 @ user81655, @Neil 및 @ETHproductions 덕분에


(i,n)=>eval("for(l=Array(i).fill(1);n-->i;)l.push(eval(l.slice(-i).join`+`));l")

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


테스트 사례 :

console.log(f(3,  8))// 1, 1, 1, 3, 5, 9, 17, 31
console.log(f(7,  13))// 1, 1, 1, 1, 1, 1, 1, 7, 13, 25, 49, 97, 193
console.log(f(5,  11))// 1, 1, 1, 1, 1, 5, 9, 17, 33, 65, 129

1
좋은. 몇 가지 골프 팁 : for항상 전체 기능 본문을 묶을 필요가없는 경우 while, x.split('')-> [...x], ~~a-> +a, n-=1-> 보다 낫습니다 . 또한,보다 더 짧은 이고 당신은 제거 할 수 있습니다 에서 와 . 그리고를 제거 할 수 있습니다. n--evalreturn[...'1'.repeat(i)]Array(i).fill(1)~~abf=
— user81655

2
이것은 내 팁 (85 바이트)에서 보이는 모양입니다 (i,n)=>eval("for(l=Array(i).fill(1);n-->i;)l.push(l.slice(-i).reduce((a,b)=>a+b));l"). 나는, 문장의 순서를 변경 결합 n--에를 n-i제거 l몇 가지 추가 바이트를 저장하기 위해 인수에서.
— user81655

1
@ user81655 eval저축 하지 않습니다 ; (i,n)=>{for(l=Array(i).fill(1);n-->i;)l.push(l.slice(-i).reduce((a,b)=>a+b));return l}여전히 85 바이트입니다.
— Neil


3
l.slice(-i).reduce((a,b)=>a+b)=>eval(l.slice(-i).join`+`)
— ETHproductions

4

ES6, 66 바이트

(i,n)=>[...Array(n)].map((_,j,a)=>a[j]=j<i?1:j-i?s+=s-a[j+~i]:s=i)

슬프게도 map콜백에서 결과 배열에 액세스 할 수 없습니다.


1
매개 변수를 카레하여 바이트를 저장하십시오.
— Shaggy

4

젤리, 12 바이트

ḣ³S;
b1Ç⁴¡Uḣ

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

작동 원리

b1Ç⁴¡Uḣ  Main link. Left input: n. Right input: x.

b1       Convert n to base 1.
    ¡    Call...
  Ç        the helper link...
   ⁴       x times.
     U   Reverse the resulting array.
      ḣ  Take its first x elements.


ḣ³S;     Helper link. Argument: A (list)

ḣ³       Take the first n elements of A.
  S      Compute their sum.
   ;     Prepend the sum to A.

3

C ++ 11, 360 바이트

안녕하세요, 저는이 질문을 좋아합니다. 저는 C ++이이 경쟁에서 이기기에는 매우 어려운 언어라는 것을 알고 있습니다. 그러나 나는 어떤 식 으로든 한푼도 던질 것입니다.

#include<vector>
#include<numeric>
#include<iostream>
using namespace std;typedef vector<int>v;void p(v& i) {for(auto&v:i)cout<<v<<" ";cout<<endl;}v b(int s,int n){v r(n<s?n:s,1);r.reserve(n);for(auto i=r.begin();r.size()<n;i++){r.push_back(accumulate(i,i+s,0));}return r;}int main(int c, char** a){if(c<3)return 1;v s=b(atoi(a[1]),atoi(a[2]));p(s);return 0;}

이 코드를 위의 코드에 대한 읽기 쉬운 설명으로 남겨 두겠습니다.

#include <vector>
#include <numeric>
#include <iostream>

using namespace std;
typedef vector<int> vi;

void p(const vi& in) {
    for (auto& v : in )
        cout << v << " ";
    cout << endl;
}

vi bonacci(int se, int n) {
    vi s(n < se? n : se, 1);
    s.reserve(n);
    for (auto it = s.begin(); s.size() < n; it++){
        s.push_back(accumulate(it, it + se, 0));
    }
    return s;
}

int main (int c, char** v) {
    if (c < 3) return 1;
    vi s = bonacci(atoi(v[1]), atoi(v[2]));
    p(s);
    return 0;
}

프로그래밍 퍼즐 및 코드 골프에 오신 것을 환영합니다. 이것은 좋은 대답이지만 공백 문자가 많고 1 문자보다 긴 변수 및 함수 이름이 있음을 알았습니다. 그대로, 이것은 코드를 읽을 수 있는 좋은 버전 이지만 골프 버전을 추가해야합니다. 당신이 할 때, 나는 당신에게 공감대를 줄 것입니다, 그러나 그것이 골프 때까지 나는하지 않습니다.
— wizzwizz4

@ wizzwizz4 안녕, 위 코드의 골프 버전을 추가했습니다. 사람들이 내가 어떻게했는지 볼 수 있도록 ungolfed 코드를 남겼습니다. 게다가 나는 vibonacci처럼 들리는 vi를 반환하는 함수 bonacci를 읽고 싶습니다. 표준 입력이 int main (int, char **)을 프로그램의 진입 점으로 사용하므로 기본 기능을 짧게해서는 안된다고 생각합니다. 또한 모든 변수의 길이는 최대 1 자이며 중요하지 않은 모든 공백은 제거됩니다.
— hetepeperfan

3
이것은 코드 표준이 아닙니다. 이것은 code-golf 입니다. 우리는 언어를 조작하고 활용합니다. 변수가 int있으면를 제거하십시오 int. 함수가 호출 foo되면 호출하십시오 f. 잔인하게 행동하십시오. 표준을 무시하고 컴파일러를 활용하십시오. 그렇게 골프를칩니다.
— wizzwizz4

Puns와 nice 코드는 ungolfed 코드 에만 속합니다 . 그러나 자유롭게 그곳에 보관하십시오. 실제로 권장합니다. 그러나 실제로 코드를 골프화 할 때 컴파일러에게 의미가 있어야합니다. 무엇이든 상관없이 가능한 한 작게 만드십시오 . (아, 여기에 내가 약속 한 +1이있다!)
— wizzwizz4

@ wizzwizz4 "int"제거가 유효합니까? int가 실행되지 않을 것이라고 생각했습니다.
— DJMcMayhem

3

하스켈 , 47 바이트

q(h:t)=h:q(t++[h+sum t])
n?x=take x$q$1<$[1..n]

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

<$ 이 챌린지가 게시 된 후 Prelude에 소개되었을 수 있습니다.


하스켈 , 53 바이트

n%i|i>n=sum$map(n%)[i-n..i-1]|0<1=1
n?x=map(n%)[1..x]

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

?처럼 사용되는 이진 함수를 정의합니다 3?8 == [1,1,1,3,5,9,17,31].

보조 함수 는 이전 값 을 합산하여 -bonacci 시퀀스 %의 ith 요소를 재귀 적으로 찾습니다 . 그런 다음이 함수 는의 첫 번째 값을 표로 표시합니다 .nn?x%


오래된 대답이지만 "보조 기능 %" 을 의미 합니까?
— Conor O'Brien 1

가드를 전환하면 i<=n로 바뀝니다 i>n.
— Ørjan Johansen

@ ØrjanJohansen 나는 모든 방법을 되돌아 보는 것이 좋지만 편집 할 때도 알았으므로 전체 골프를 다시 할 수 있습니다.
— xnor

2

APL, 21

{⍵↑⍺{⍵,+/⍺↑⌽⍵}⍣⍵+⍺/1}

이것은 왼쪽 인수로 n 을, 오른쪽 인수로 x 를 취하는 함수입니다 .

설명:

{⍵↑⍺{⍵,+/⍺↑⌽⍵}⍣⍵+⍺/1}
                   ⍺/1  ⍝ begin state: X ones    
                  +     ⍝ identity function (to separate it from the ⍵)
    ⍺{         }⍣⍵     ⍝ apply this function N times to it with X as left argument
      ⍵,               ⍝ result of the previous iteration, followed by...
        +/              ⍝ the sum of
          ⍺↑            ⍝ the first X of
            ⌽          ⍝ the reverse of
             ⍵         ⍝ the previous iteration
 ⍵↑                    ⍝ take the first X numbers of the result

테스트 사례 :

      ↑⍕¨ {⍵↑⍺{⍵,+/⍺↑⌽⍵}⍣⍵+⍺/1} /¨ (3 8)(7 13)(1 20)(30 4)(5 11)
 1 1 1 3 5 9 17 31                       
 1 1 1 1 1 1 1 7 13 25 49 97 193         
 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
 1 1 1 1                                 
 1 1 1 1 1 5 9 17 33 65 129              

2

파이썬 3, 59

FryAmTheEggman 덕분에 20 바이트를 절약했습니다.

훌륭한 해결책은 아니지만 지금은 효과가 있습니다.

def r(n,x):f=[1]*n;exec('f+=[sum(f[-n:])];'*x);return f[:x]

또한 테스트 사례는 다음과 같습니다.

assert r(3, 8) == [1, 1, 1, 3, 5, 9, 17, 31]
assert r(7, 13) == [1, 1, 1, 1, 1, 1, 1, 7, 13, 25, 49, 97, 193]
assert r(30, 4) == [1, 1, 1, 1]

2

자바, 82 + 58 = 140 바이트

ith n -bonacci 수 ( 82 바이트 ) 를 찾는 기능 :

int f(int i,int n){if(i<=n)return 1;int s=0,q=0;while(q++<n)s+=f(i-q,n);return s;}

첫 번째 k n -bonacci 수 ( 58 바이트 ) 를 인쇄하는 기능 :

(k,n)->{for(int i=0;i<k;i++){System.out.println(f(i,n));}}

2

뇌 플랙 , 144 (124) 122 바이트

Nitroden 덕분에 -20 바이트

이것이 내 첫 Brain-Flak 답변이며 개선 될 수 있다고 확신합니다. 도움을 주시면 감사하겠습니다.

(([{}]<>)<{({}(()))}{}>)<>{({}[()]<<>({<({}<({}<>)<>>())>[()]}{})({}<><({({}<>)<>}<>)>)<>>)}{}<>{({}<{}>())}{}{({}<>)<>}<>

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



1

줄리아, 78 바이트

f(n,x)=(z=ones(Int,n);while endof(z)<x push!(z,sum(z[end-n+1:end]))end;z[1:x])

두 개의 정수를 허용하고 정수 배열을 리턴하는 함수입니다. 접근 방식은 간단합니다. length의 배열을 생성 한 n다음 n배열이 length가 될 때까지 이전 요소 의 합을 추가하여 배열을 확장하십시오 x.

언 골프 드 :

function f(n, x)
    z = ones(Int, n)
    while endof(z) < x
        push!(z, sum(z[end-n+1:end]))
    end
    return z[1:x]
end

1

MATL , 22 26 바이트

1tiXIX"i:XK"tPI:)sh]K)

이 사용하는 현재 릴리스 (10.2.1) 언어 / 컴파일러를.

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

몇 가지 추가 바이트 :-( G함수 의 버그로 인해 (붙여 넣기 입력; 이제 다음 릴리스에서 수정되었습니다)

설명

1tiXIX"      % input N. Copy to clipboard I. Build row array of N ones
i:XK         % input X. Build row array [1,2,...X]. Copy to clipboard I
"            % for loop: repeat X times. Consumes array [1,2,...X]
  t          % duplicate (initially array of N ones)
  PI:)       % flip array and take first N elements
  sh         % compute sum and append to array
]            % end
K)           % take the first X elements of array. Implicitly display

1

펄 6 , 38 바이트

->\N,\X{({@_[*-N..*].sum||1}...*)[^X]} # 38 bytes
-> \N, \X {
  (

    {

      @_[
        *-N .. * # previous N values
      ].sum      # added together

      ||     # if that produces 0 or an error
      1      # return 1

    } ... *  # produce an infinite list of such values

  )[^X]      # return the first X values produced
}

용법:

# give it a lexical name
my &n-bonacci = >\N,\X{…}

for ( (3,8), (7,13), (1,20), (30,4), (5,11), ) {
  say n-bonacci |@_
}
(1 1 1 3 5 9 17 31)
(1 1 1 1 1 1 1 7 13 25 49 97 193)
(1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
(1 1 1 1)
(1 1 1 1 1 5 9 17 33 65 129)

1

C, 132 바이트

재귀 접근법은 몇 바이트 더 짧습니다.

k,n;f(i,s,j){for(j=s=0;j<i&j++<n;)s+=f(i-j);return i<n?1:s;}main(_,v)int**v;{for(n=atoi(v[1]);k++<atoi(v[2]);)printf("%d ",f(k-1));}

언 골프

k,n; /* loop index, n */

f(i,s,j) /* recursive function */
{
    for(j=s=0;j<i && j++<n;) /* sum previous n n-bonacci values */
        s+=f(i-j);
    return i<n?1:s; /* return either sum or n, depending on what index we're at */
}

main(_,v) int **v;
{
    for(n=atoi(v[1]);k++<atoi(v[2]);) /* print out n-bonacci numbers */
        printf("%d ", f(k-1));
}

1

껍질 , 9 바이트

↑§¡ȯΣ↑_B1

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

로부터 시작 Base- 1의 표현 N (단순히 목록 N의 것) 및 ¡teratively 합계 ( Σ) (마지막 ↑_) N 요소 목록에 결과를 추가합니다. 마지막 으로이 목록 ↑의 첫 번째 X 숫자를 ( ) 가져 와서 반환합니다.





0

펄 6, 52 ~ 72 47 ~ 67 바이트

sub a($n,$x){EVAL("1,"x$n~"+*"x$n~"...*")[^$x]}

MONKEY-SEE-NO-EVAL다음 오류로 인해 모듈이 필요합니다 .

=== SORRY! === 컴파일 중 오류 -e
EVAL은 매우 위험한 기능입니다 !!! (MONKEY-SEE-NO-EVAL을 사용하여 무시
하지만 데이터에 주입 공격이 없는지 확인한 경우에만)
-e : 1

$ perl6 -MMONKEY-SEE-NO-EVAL -e'a(3,8).say;sub a($n,$x){EVAL("1,"x$n~"+*"x$n~"...*")[^$x]}'
(1 1 1 3 5 9 17 31)

누구나 엄격 모드 등을 끄는 방법을 알고 있습니까?
— andlrc

크리스마스 전 2015 Perl 6 릴리스를 사용하면 monkey-see-no-eval을 강제하지 않습니다.
— 배트맨


0

Jq 1.5 , 67 바이트

def C:if length>X then.[:X]else.+=[.[-N:]|add]|C end;[range(N)|1]|C

N과 X에 의해 제공된 입력을 가정합니다.

def N: 5;
def X: 11;

넓히는

def C:                        # . is current array
    if length>X               # stop when array is as long as X
    then .[:X]                # return first X elements
    else .+=[.[-N:]|add] | C  # recursively add sum of last N elements to array
    end
;
  [range(N)|1]                # initial state
| C

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


0

J, 31 바이트

]{.(],[:+/[{.])^:(-@[`]`(1#~[))

언 골프 드 :

] {. (] , [: +/ [ {. ])^:(-@[`]`(1 #~ [))

설명

거동 형태의 파워 동사 와 함께하는 즐거운 시간 :

(-@[`]`(1 #~ [)) NB. gerund pre-processing

상세 내역 :

  • ] {. ...<right arg>이 모든 것들에서 첫 번째 요소를 올바르게 수행하십시오.
  • <left> ^: <right>동사 적용 <left>반복 <right>배 ... <right>중간 동명사에 의해 지정 (-@[] (1 #~ [), 즉 ], 즉, 함수 자체에 전달 된 권리 인수를. 그래서 무엇 <left>입니까? ...
  • (] , [: +/ [ {. ])이 전체 구에 대한 왼쪽 주장은 먼저 첫 번째 gerund에 의해 변환됩니다 -@[. 즉,이 문구 에 대한 왼쪽 인수는 전체 함수에 대한 왼쪽 인수 의 음수 입니다. 이것은 문구 [ {. ]가 우리가 구축하고있는 반환 목록에서 마지막 요소를 가져 오도록 하기 위해 필요 합니다. 그런 다음 요약 +/됩니다.. 그리고 마지막으로 동일한 반환 목록에 추가되었습니다 ] ,.
  • 그렇다면 반환 목록은 어떻게 초기화됩니까? 이것이 세 번째 전처리 gerund가 달성 한 것입니다 : (1 #~ [)-1 개의 "left arg"를 여러 번 반복하십시오.

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


0

수학, 59 바이트

((f@#=1)&/@Range@#;f@n_:=Tr[f[n-#]&/@Range@#];f/@Range@#2)&

아마도 Clear@f함수 호출 사이를 원할 것입니다 . 인수는 n,x테스트 사례와 같습니다.


0

깔끔한 36 바이트

{x,n:n^recur(*tile(x,c(1)),sum@c,x)}

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

설명

{x,n:n^recur(*tile(x,c(1)),sum@c,x)}
{x,n:                              }   lambda taking parameters `x` and `n`
     n^                                take the first `n` terms of...
       recur(                     )        a recursive function
             *tile(x,c(1)),                whose seed is `x` `1`s
                           sum@c,          taking the sum of each window
                                 x         with a window size of `x`

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