Роздрукуйте послідовність N-бобон


54

Це не дуже широко відомо, але те, що ми називаємо послідовністю Фібоначчі, AKA

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

насправді називається послідовністю Дуоначчі . Це тому, що для отримання наступного числа ви підсумовуєте попередні 2 числа. Існує також послідовність Трибоначчі ,

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

тому що наступне число - це сума попередніх 3 чисел. І послідовність Квадронахіна

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

І всім улюблений, послідовність Пентакона :

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

І послідовність Гексанач, послідовність Септаканко, послідовність Октонахіна тощо, і так далі до послідовності N-Боханьч.

Послідовність N-бобоніків завжди починатиметься з N 1s підряд.

Змагання

Ви повинні написати функцію або програму, яка приймає два числа N і X , і виводить перші X номери X -Бохань. N буде цілим числом більше 0, і ви можете сміливо припускати, що жодні N-бонакі не перевищуватимуть типовий номер у вашій мові. Вихід може бути у будь-якому читаному для людини форматі, і ви можете приймати дані будь-яким розумним чином. (Аргументи командного рядка, аргументи функції, STDIN тощо)

Як завжди, це Code-golf, тому застосовуються стандартні лазівки і найкоротша відповідь у байтах виграє!

Зразок 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
Людина, у мене була така ідея давно, і я ніколи не задумувався над її написанням.
Морган Трапп

9
Моя кнопка голосування == твій аватар
ETHproductions

Чи не буде 3-боханки такою 1, 1, 2, 4, 7, якою була б третя позиція 0 + 1 + 1? ... і так одне з іншими?
Парасолька

1
@umbrella Ні, трибочніки починаються з 3 1s. Дивіться мою редакцію для уточнення цього пункту.
DJMcMayhem

Відповіді:


23

Болфук, 6 байт

,,[;+]

Ви можете з упевненістю припустити, що жоден номер N-Bojeca не перевищить типовий номер у вашій мові.

Тип номера за замовчуванням у Boolfuck - це трохи. Якщо припустити, це також поширюється на вхідні числа N і X, а враховуючи, що N> 0, є лише два можливі входи - 10 (що нічого не видає) і 11 (які виводить 1).

,трохи читає поточне місце в пам'яті. N ігнорується як має бути 1. Якщо X дорівнює 0, тіло циклу (оточене []) пропускається. Якщо X дорівнює 1, він виводиться, а потім перевертається на 0, щоб цикл не повторювався.


4
Хіба не існує стандартної лазівки ТОЧНО такої?
Стен Струм

1
@StanStrum Від початку або після цієї відповіді?
користувач253751

2
Я вірю, що це було раніше, дозвольте це перевірити ... Meta Link ; Перша редакція була 31 січня 2016 року о 13:44. Нічого собі, ніколи! У мене були два вихідні дні. Хоча, щоб бути впертим, остання редакція для цього була 31 січня 2016 року о 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

Haskell, 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.
німі

О, я розумію. Це чудовий спосіб замінити ++[]на :!
гордий haskeller

@proudhaskeller: так, точно!
німі

5

Python 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

Javascript 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--, якщо ви укладете все тіло функції в записі, evalвам не потрібно писати return. Крім того, навіть коротше, ніж [...'1'.repeat(i)]є, Array(i).fill(1)і ви можете видалити ~~з aі b. І вам дозволяється видалити f=.
користувач81655

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з аргументів, щоб зберегти кілька зайвих байт.
користувач81655

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 Мені схоже на 86 байт ...
user81655

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
Збережіть байт, викрививши параметри.
Кудлатий

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 Привіт, додав вищезгадану версію коду для гольфу. Я залишив код без вовків, щоб люди побачили, як я це зробив. Крім того, мені подобається читати функцію bobog, яка повертає vi, який все ще звучить як vibach. Я вважаю, що я не повинен робити основну функцію коротшою, оскільки стандартний мандат використовує int main (int, char **) в якості точки входу в програму. Далі я вважаю, що всі змінні мають довжину не більше 1 символу, а всі несуттєві пробіли видаляються.
hetepeperfan

3
Це не код - "відповідати стандартам". Це код-гольф . Ми маніпулюємо та користуємося нашими мовами. Якщо будь-які змінні ints, видаліть int. Якщо якісь функції викликаються foo, зателефонуйте їм f. Будь жорстоким; ігнорувати стандарт і використовувати компілятор. Ось як ви гольфуєте.
wizzwizz4

Каламбури і хороший код належать в ungolfed коди тільки . Але сміливо тримайте їх там; насправді, це рекомендується. Але будьте по-справжньому, по-справжньому майте на увазі компілятор, коли ви займаєтеся кодом. Отримайте його якомога менше, незважаючи ні на що . (О, і ось +1, яку я пообіцяв!)
wizzwizz4

@ wizzwizz4 Чи дійсно видалення "int"? Я думав, мається на увазі, що Int не буде працювати.
DJMcMayhem

3

Haskell , 47 байт

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

Спробуйте в Інтернеті!

<$ можливо, було введено в Прелюді після публікації цього виклику.


Haskell , 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].

Допоміжна функція %рекурсивно знаходить iт-й елемент nпослідовності -бонаборів шляхом підсумовування попередніх nзначень. Потім функція відображає в ?таблиці перші xзначення %.


Стара відповідь, але ти маєш на увазі "Допоміжну функцію %"?
Conor O'Brien

Перемикання охоронців перетвориться 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

Збережено 20 байт завдяки FryAmTheEggman.

Не чудове рішення, але воно працюватиме наразі.

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

Java, 82 + 58 = 140 байт

Функція для знаходження i-го числа n -бобочки ( 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 -бобочного числа ( 58 байт ):

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

2

Мозг-Флак , 144 124 122 байт

-20 байт завдяки Nitroden

Це моя перша відповідь Мозку-Флака, і я впевнений, що її можна вдосконалити. Будь-яка допомога вдячна.

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

Спробуйте в Інтернеті!



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])

Це функція, яка приймає два цілих числа і повертає цілий масив. Підхід простий: Створіть масив з довжини n, а потім зростіть масив, додавши суму попередніх nелементів, поки масив не набере довжину 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

Perl 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

Perl 6, 52 ~ 72 47 ~ 67 байт

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

Потрібен модуль MONKEY-SEE-NO-EVALчерез таку помилку:

=== СОРІЯ! === Помилка під час компіляції -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

Я думаю, що якщо ви використовуєте передріздвяну версію Perl 6, це не примусить застосовувати мавпу бачити-ні-еваль.
Бетмен


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 #~ [))

пояснення

Розважальні часи з дієсловом power у своїй герундійній формі :

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

Детально:

  • ] {. ...Візьміть перші <right arg>елементи з усього цього матеріалу праворуч, що робить роботу ...
  • <left> ^: <right>застосовувати дієслово <left>кілька <right>разів ... там, де <right>вказано середнє герундій у (-@[] (1 #~ [), тобто ], тобто правий арг перейшов у саму функцію. То що таке <left>? ...
  • (] , [: +/ [ {. ])Лівий аргумент до всієї цієї фрази спочатку перетворюється першим герундом, тобто -@[. Це означає, що лівий аргумент цієї фрази є негативним лівим аргументом на загальну функцію. Це потрібно, щоб фраза [ {. ]взяла останні елементи зі списку повернення, який ми створюємо. Ті , які потім сумуються: +/. І , нарешті , додається до цього ж списку повернення: ] ,.
  • То як ініціалізується список повернення? Ось що і виконує третя герунда попередньої обробки: (1 #~ [)- повторити 1 "лівий аргумент" кількість разів.

Спробуйте в Інтернеті!


0

Математика, 59 байт

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

Ймовірно, ви захочете переходити Clear@fміж викликами функцій. Аргументи є n,x, як і тестові справи.



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.