Stampa la sequenza N-bonacci


54

Questo non è molto conosciuto, ma ciò che chiamiamo sequenza di Fibonacci, AKA

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

in realtà si chiama sequenza Duonacci . Questo perché per ottenere il numero successivo, si sommano i 2 numeri precedenti. C'è anche la sequenza Tribonacci ,

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

perché il numero successivo è la somma dei 3 numeri precedenti. E la sequenza di Quadronacci

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

E la preferita di tutti, la sequenza Pentanacci :

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

E la sequenza Hexanacci , la sequenza Septanacci , la sequenza Octonacci e così via e così via fino alla sequenza N-Bonacci.

La sequenza N-bonacci inizierà sempre con N 1 di fila.

La sfida

È necessario scrivere una funzione o un programma che accetta due numeri N e X e stampa i primi numeri X N-Bonacci. N sarà un numero intero maggiore di 0 e puoi tranquillamente supporre che nessun numero N-Bonacci superi il tipo di numero predefinito nella tua lingua. L'output può essere in qualsiasi formato leggibile dall'uomo e puoi prendere input in qualsiasi modo ragionevole. (Argomenti della riga di comando, argomenti delle funzioni, STDIN, ecc.)

Come al solito, si tratta di Code-golf, quindi si applicano scappatoie standard e vince la risposta più breve in byte!

IO di esempio

#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
Amico, ho avuto questa idea poco fa e non sono mai riuscito a scriverlo.
Morgan Thrapp,

9
Il mio pulsante di voto == il tuo avatar
ETHproductions

Il 3-bonacci non sarebbe 1, 1, 2, 4, 7come la terza posizione 0 + 1 + 1? ... e così uno con gli altri?
Ombrello

1
@umbrella No, il tribonacci inizia con 3 1s. Vedi la mia modifica per chiarire questo punto.
DJMcMayhem

Risposte:


23

Boolfuck, 6 byte

,,[;+]

Puoi tranquillamente supporre che nessun numero N-Bonacci superi il tipo di numero predefinito nella tua lingua.

Il tipo di numero predefinito in Boolfuck è un po '. Supponendo che ciò si estenda anche ai numeri di ingresso N e X e dato che N> 0, ci sono solo due possibili ingressi: 10 (che non genera nulla) e 11 (che produce 1).

,legge un po 'nella posizione di memoria corrente. N viene ignorato come deve essere 1. Se X è 0, il corpo del loop (circondato da []) viene ignorato. Se X è 1, viene emesso e quindi ruotato su 0 in modo che il ciclo non si ripeta.


4
Non esiste una scappatoia standard ESATTAMENTE come questa?
Stan Strum,

1
@StanStrum Da prima o dopo questa risposta?
user253751

2
Credo che sia venuto prima, fammi dare un'occhiata ... Meta Link ; La prima revisione è stata il 31 gennaio 2016 alle 13:44. Wow, non importa! Avevo due giorni liberi. Anche se, per essere testardo, l'ultima modifica è stata il 31 gennaio 2016 alle 16:06. Quindi sì, va bene nel mio libro
Stan Strum,

9

Python 2, 79 byte

n,x=input()
i,f=0,[]
while i<x:v=[sum(f[i-n:]),1][i<n];f.append(v);print v;i+=1

Provalo online


Prova a sostituire l'ultima riga conexec"v=[sum(f[i-n:]),1][i<n];f+=[v];print v;i+=1;"*x
Cyoce

8

Pyth, 13

<Qu+Gs>QGEm1Q

Test Suite

Prende l'input newline separato, con il nprimo.

Spiegazione:

<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
Wow, è stato veloce. Ho appena avuto il tempo di chiudere il browser prima che tu lo avessi già pubblicato!
DJMcMayhem

5

Haskell, 56 byte

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

Esempio di utilizzo: 3 # 8-> [1,1,1,3,5,9,17,31].

Come funziona

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

Non dovrebbe essere tail linvece di init l?
orgoglioso haskeller il

@proudhaskeller: non importa. manteniamo gli ultimi nelementi nella lista. Non c'è alcuna differenza tra la rimozione dalla fine e l'aggiunta alla parte anteriore e viceversa, vale a dire la rimozione dalla parte anteriore e l'aggiunta alla fine, perché l'elenco iniziale è composto solo da 1s.
nimi,

Ah, ho capito. Questo è un modo ingegnoso per sostituire ++[]da :!
orgoglioso haskeller il

@proudhaskeller: sì, esattamente!
nimi

5

Python 2, 55 byte

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

Tiene traccia di una nfinestra di lunghezza della sequenza nell'elenco l, aggiornata aggiungendo la somma e rimuovendo il primo elemento. Stampa il primo elemento ogni iterazione per xiterazioni.

Un approccio diverso nel memorizzare tutti gli elementi e sommare gli ultimi nvalori ha dato la stessa lunghezza (55).

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

5

Javascript ES6 / ES2015, 107 97 85 80 byte

Grazie a @ user81655, @Neil e @ETHproductions per salvare alcuni byte


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

provalo online


Casi test:

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
Bello. Un paio di consigli sul golf: forè sempre meglio di while, x.split('')-> [...x], ~~a-> +a, n-=1-> n--, se racchiudi l'intero corpo della funzione in un evalnon è necessario scrivere return. Inoltre, anche più corto di quello che [...'1'.repeat(i)]è Array(i).fill(1)e puoi rimuovere ~~da ae b. E ti è permesso rimuovere il f=.
user81655

2
Questo è ciò che sembra con i miei consigli (85 byte): (i,n)=>eval("for(l=Array(i).fill(1);n-->i;)l.push(l.slice(-i).reduce((a,b)=>a+b));l"). Ho cambiato l'ordine delle istruzioni, combinato n--in n-ie rimosso ldagli argomenti per salvare qualche byte in più.
user81655

1
@ user81655 Non ho il evalsalvataggio; (i,n)=>{for(l=Array(i).fill(1);n-->i;)l.push(l.slice(-i).reduce((a,b)=>a+b));return l}è ancora 85 byte.
Neil,

@Neil Mi sembrano 86 byte ...
user81655

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

4

ES6, 66 byte

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

Purtroppo mapnon ti consente di accedere all'array dei risultati nel callback.


1
Salvare un byte valutando i parametri.
Shaggy,

4

Gelatina, 12 byte

ḣ³S;
b1Ç⁴¡Uḣ

Provalo online!

Come funziona

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 byte

Ciao, mi piace solo questa domanda. So che c ++ è un linguaggio molto difficile per vincere questa competizione. Ma proverò comunque un centesimo.

#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;}

Lascio questo come spiegazione leggibile del codice sopra.

#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;
}

Benvenuti in Programming Puzzle and Code Golf. Questa è una buona risposta, tuttavia ho notato che hai un sacco di spazi bianchi e nomi di variabili e funzioni che sono più lunghi di 1 carattere. Allo stato attuale, questa è una buona versione leggibile del tuo codice, ma dovresti aggiungere una versione giocata a golf. Quando lo farai, ti darò un voto, ma finché non sarà golfato non lo farò.
wizzwizz4,

@ wizzwizz4 Ciao, ho aggiunto una versione giocata a golf del codice sopra. Ho lasciato in giro il codice ungolfed per far vedere alla gente come l'ho fatto. Inoltre mi piace leggere una funzione bonacci che restituisce vi che suona ancora come vibonacci. Sento che non dovrei accorciare la funzione principale perché lo standardard impone l'utilizzo di int main (int, char **) come punto di ingresso del programma. Inoltre, credo che tutte le variabili abbiano una lunghezza massima di 1 carattere e che tutti gli spazi bianchi non significativi vengano rimossi.
hetepeperfan,

3
Questo non è un codice "conforme agli standard". Questo è code-golf . Manipoliamo e sfruttiamo le nostre lingue. Se qualche variabile è ints, rimuovere il int. Se vengono chiamate funzioni foo, chiamale f. Sii brutale; ignora lo standard e sfrutta il compilatore. È così che giochi a golf.
wizzwizz4,

I giochi di parole e il bel codice appartengono solo al codice non golfato . Ma sentiti libero di tenerli lì; in realtà, si consiglia di. Ma sii davvero molto cattivo con il compilatore quando giochi a golf il tuo codice. Prendi il più piccolo possibile, non importa quale . (Oh, ed ecco il +1 che avevo promesso!)
wizzwizz4,

@ wizzwizz4 La rimozione di "int" è valida? Pensavo che int implicito non funzionasse.
DJMcMayhem

3

Haskell , 47 byte

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

Provalo online!

<$ potrebbe essere stato introdotto in Prelude dopo che questa sfida è stata pubblicata.


Haskell , 53 byte

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

Provalo online!

Definisce la funzione binaria ?, utilizzata come 3?8 == [1,1,1,3,5,9,17,31].

La funzione ausiliaria %trova ricorsivamente l' ielemento th della nsequenza -bonacci sommando i nvalori precedenti . Quindi, la funzione ?tabula i primi xvalori di %.


Vecchia risposta, ma intendi "La funzione ausiliaria %"?
Conor O'Brien,

Il cambio delle protezioni si trasformerà i<=nin i>n.
Ørjan Johansen,

@ ØrjanJohansen L'ho notato anche durante la modifica, anche se guardando indietro l'intero metodo sembra male, quindi potrei semplicemente rifare l'intero golf.
xnor

2

APL, 21

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

Questa è una funzione che accetta n come argomento sinistro e x come argomento destro.

Spiegazione:

{⍵↑⍺{⍵,+/⍺↑⌽⍵}⍣⍵+⍺/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

Casi test:

      ↑⍕¨ {⍵↑⍺{⍵,+/⍺↑⌽⍵}⍣⍵+⍺/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

Python 3, 59

Risparmiato 20 byte grazie a FryAmTheEggman.

Non è un'ottima soluzione, ma per ora funzionerà.

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

Inoltre, ecco i casi di test:

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

Java, 82 + 58 = 140 byte

Funzione per trovare l'esima n numero di -bonacci ( 82 byte ):

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;}

Funzione per stampare il primo numero k n -bonacci ( 58 byte ):

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

2

Brain-Flak , 144 124 122 byte

-20 byte grazie a Nitroden

Questa è la mia prima risposta Brain-Flak e sono sicuro che può essere migliorata. Qualsiasi aiuto è apprezzato.

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

Provalo online!


2

Pari / GP , 46 byte

La funzione generatrice della sequenza è:

(n1)xnxn+12x+11x1

(n,m)->Vec(n--/(x-(2-1/x)/x^n)-1/(x-1)+O(x^m))

Provalo online!


1

Julia, 78 byte

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

Questa è una funzione che accetta due numeri interi e restituisce un array di numeri interi. L'approccio è semplice: genera un array di quelli di lunghezza n, quindi aumenta l'array aggiungendo la somma degli nelementi precedenti fino a quando l'array ha lunghezza x.

Ungolfed:

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 byte

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

Questo utilizza l' attuale versione (10.2.1) del linguaggio / compilatore.

Provalo online!

Alcuni byte extra :-( a causa di un bug nella Gfunzione (incolla input; ora corretto per la prossima versione)

Spiegazione

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

Perl 6 , 38 byte

->\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
}

Uso:

# 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 byte

L'approccio ricorsivo è più breve di un paio di byte.

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));}

Ungolfed

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

Buccia , 9 byte

↑§¡ȯΣ↑_B1

Provalo online!

Inizia dalla rappresentazione Basimmetrica 1di N (semplicemente un elenco di N ) e ¡somma in modo terribile ( Σ) gli ultimi ( ↑_) elementi N e aggiunge il risultato all'elenco. Infine, prende ( ) i primi numeri X in questo elenco e li restituisce.





0

Perl 6, 52 ~ 72 47 ~ 67 byte

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

Richiede il modulo MONKEY-SEE-NO-EVAL, a causa del seguente errore:

=== PREOCCUPATO! === Errore durante la compilazione -e
EVAL è una funzione molto pericolosa !!! (usa MONKEY-SEE-NO-EVAL per sovrascrivere,
ma solo se sei MOLTO sicuro che i tuoi dati non contengano attacchi di iniezione)
a -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)

Qualcuno sa come disattivare la modalità rigorosa, ecc.?
Andlrc,

Penso che se usi una versione Perl 6 del periodo pre-natalizio 2015, non imporrà la scimmia-vedi-no-eval.
Batman,


0

Jq 1,5 , 67 byte

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

Presuppone input forniti da N e X ad es

def N: 5;
def X: 11;

allargato

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

Provalo online!


0

J, 31 byte

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

Ungolfed:

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

spiegazione

Tempi divertenti con il verbo del potere nella sua forma gerundio :

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

Dettaglio dettagliato:

  • ] {. ...Prendi i primi <right arg>elementi da tutta questa roba a destra che fa il lavoro ...
  • <left> ^: <right>applica il verbo <left>ripetutamente <right>volte ... dove <right>è specificato dal gerundio centrale in (-@[] (1 #~ [), cioè ], cioè, l'arg giusto è passato alla funzione stessa. Quindi cos'è <left>? ...
  • (] , [: +/ [ {. ])L'argomento sinistro dell'intera frase viene prima trasformato dal primo gerundio, ovvero -@[. Ciò significa che l'argomento sinistro di questa frase è il negativo dell'argomento sinistro della funzione generale. Questo è necessario affinché la frase [ {. ]prenda gli ultimi elementi dalla lista di ritorno che stiamo costruendo. Coloro che vengono poi sommati: +/. E, infine, allegato alla medesima lista di ritorno: ] ,.
  • Quindi, come viene inizializzata la lista dei resi? Questo è ciò che realizza il terzo gerundio di pre-elaborazione: (1 #~ [)- ripetere 1 volta "left arg" numero di volte.

Provalo online!


0

Mathematica, 59 byte

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

Probabilmente vorrai Clear@ftra le chiamate di funzione. Gli argomenti sono n,x, proprio come i casi di test.


0

Ordinato , 36 byte

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

Provalo online!

Spiegazione

{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`

0

Japt , 18 byte

@ZsVn)x}gK=Vì1;K¯U

Provalo online!

Spiegazione:

         K=Vì1        :Start with n 1s in an array K
@      }gK            :Extend K to at least x elements by setting each new element to:
      x               : The sum of
 ZsVn                 : The previous n elements
              ;       :Then
               K¯U    :Return the first n elements of K
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.