Терпіння, молодий "Падован"


44

Всім відома послідовність Фібоначчі:
Ви берете квадрат, приєднуєте до нього рівний квадрат, потім багаторазово додаєте квадрат, довжина сторони якого дорівнює найбільшій бічній довжині отриманого прямокутника.
В результаті виходить прекрасна спіраль квадратів, послідовність чисел яких є послідовністю Фібоначчі :

Але що робити, якщо ми не хотіли використовувати квадрати?

Якщо ми використаємо рівносторонні трикутники - замість квадратів - аналогічним чином, ми отримаємо однаково красиву спіраль трикутників та нову послідовність: послідовність Падована , також відома A000931 :

Завдання:

Враховуючи додатне ціле число, , виведіть , й член у послідовності Падована АБО перші доданків.NaNNN

Припустимо, що перші три члени послідовності всі . Таким чином, послідовність розпочнеться наступним чином: 1

1,1,1,2,2,3,...

Вхід:

  • Будь-яке додатне ціле числоN0

  • Недійсне введення не повинно враховуватися

Вихід:

  • - й член в Padovan послідовності АБО перших термінах Padovan послідовності.NNN

  • Якщо перші термінів роздруковані, вихід може бути будь-яким зручним (список / масив, багаторядковий рядок тощо)N

  • Може бути або -індексованим, або -вкладеним01

Випробування:
(0-індексований, й термін)N

Input | Output
--------------
0     | 1
1     | 1
2     | 1
4     | 2
6     | 4
14    | 37
20    | 200
33    | 7739

(1-індексований, перші термінів)N

Input | Output
--------------
1     | 1
3     | 1,1,1
4     | 1,1,1,2
7     | 1,1,1,2,2,3,4
10    | 1,1,1,2,2,3,4,5,7,9
12    | 1,1,1,2,2,3,4,5,7,9,12,16

Правила:


2
14(0-індексовано) показано як вихідний, 28але я вважаю, що він повинен дати результат37
Джонатан Аллан

@JonathanAllan так, ви праві. Я зафіксував останні два тестові випадки за й термін, але не той. Повідомлення відредаговано. N
Тау

@LuisMendo Я так вірю. Я відредагую публікацію.
Тау

1
@sharur це визначення для послідовності Фібоначчі є візуальним визначенням. Кожен послідовно доданий квадрат має довжину цього терміна в послідовності. Послідовність, яку ви описуєте, - це чисельні міркування, що стоять за цим Обидві послідовності працюють так само добре, як і інші.
Тау

1
Зауважте, що послідовність OEIS, яку ви зв'язали, дещо відрізняється, оскільки вона використовує a_0=1, a_1=0, a_2=0. Він закінчується трохи зміщеним, оскільки тодіa_5=a_6=a_7=1
Кармейстер

Відповіді:


59

Желе , 10 байт

9s3’Ẓæ*³FṀ

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

1-індексований. Обчислює найбільший елемент: де двійкова матриця зручно обчислюватися як:

[001101010]n
[isprime(0)isprime(1)isprime(2)isprime(3)isprime(4)isprime(5)isprime(6)isprime(7)isprime(8)]

(це повний збіг.)

9s3         [[1,2,3],[4,5,6],[7,8,9]]    9 split 3
   ’        [[0,1,2],[3,4,5],[6,7,8]]    decrease
    Ẓ       [[0,0,1],[1,0,1],[0,1,0]]    isprime
     æ*³    [[0,0,1],[1,0,1],[0,1,0]]^n  matrix power by input
        FṀ                               flatten, maximum

33
це явно якась вуду
Пуреферрет

7
Це слід опублікувати.
YSC

6
@YSC Це вже було опубліковано в A000931 . Я б ніколи не здогадався про трюк
прима

1
... зробіть це, "якщо хтось не може переграти два байти від цього" :) (тепер, коли у мене є 9 байт )
Джонатан Аллан

1
Я настільки звик бачити тут абсурдно малі відповіді, що я вважав, що кома після «желе» насправді є кодом цієї проблеми
Тасос Папастиліноу,


26

Желе ,  10 9  8 байт

ŻṚm2Jc$S

Монадічна Посилання, що приймає n(0-індексовану), яка дає P(n).

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

Як?

РеалізуєP(n)=i=0n2(i+1n2i)

ŻṚm2Jc$S - Link: integer, n       e.g. 20
Ż        - zero range                  [0, 1, 2, 3, 4, ..., 19, 20]
 Ṛ       - reverse                     [20, 19, ..., 4, 3, 2, 1, 0]
  m2     - modulo-slice with 2         [20, 18, 16, 14, 12, 10,  8,  6,  4,  2,  0]  <- n-2i
      $  - last two links as a monad:
    J    -   range of length           [ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]  <- i+1
     c   -   left-choose-right         [ 0,  0,  0,  0,  0,  0,  0, 28,126, 45,  1]
       S - sum                         200

І ось "двафер"
... зовсім інший метод також для 8 байт (цей 1-індексований, але набагато повільніше):

3ḊṗRẎ§ċ‘ - Link: n
3Ḋ       - 3 dequeued = [2,3]
   R     - range = [1,2,3,...,n]
  ṗ      -   Cartesian power         [[[2],[3]],[[2,2],[2,3],[3,2],[3,3]],[[2,2,2],...],...]
    Ẏ    - tighten                   [[2],[3],[2,2],[2,3],[3,2],[3,3],[2,2,2],...]
     §   - sums                      [ 2,  3,   4,    5,    5,    6,     6,...]
       ‘ - increment                 n+1
      ċ  - count occurrences         P(n)

18

Haskell , 26 байт

(l!!)
l=1:1:1:2:scanl(+)2l

Спробуйте в Інтернеті! Виводить n-й член нульового індексу.

Я думав, що "очевидне" рекурсивне рішення нижче буде непереможним, але тоді я знайшов це. Це схоже на класичний виразний вираз l=1:scanl(+)1lдля нескінченного списку Фібоначчі, але тут різниця між суміжними елементами полягає в терміні 4 позиції назад. Ми можемо прямо писати l=1:1:zipWith(+)l(0:l), але це довше.

Якщо цей виклик дозволив нескінченний вихід списку, ми могли б вирізати перший рядок і мати 20 байт.

27 байт

f n|n<3=1|1>0=f(n-2)+f(n-3)

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




6

Октава / MATLAB, 35 33 байт

@(n)[1 filter(1,'cbaa'-98,2:n<5)]

Виводить перші n доданків.

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

Як це працює

Анонімна функція, яка реалізує рекурсивний фільтр .

'cbaa'-98є коротшою формою для виробництва [1 0 -1 -1].

2:n<5є коротшою формою для отримання [1 1 1 0 0 ··· 0]( n −1 термін).

filter(1,[1 0 -1 -1],[1 1 1 0 0 ··· 0])передає вхід [1 1 1 0 0 ··· 0]через фільтр дискретного часу, визначений передавальною функцією з коефіцієнтом чисельника 1та знаменника [1 0 -1 -1].


6

J , 22 байти

-2 байти завдяки ngn та Галену

закрита форма, 26 байт

0.5<.@+1.04535%~1.32472^<:

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

ітеративний, 22 байти

(],1#._2 _3{ ::1])^:[#

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


1
Ще одне 24-байтове рішення (нудне): (1 # .2 3 $: @ - ~]) `1: @. (3 &>) Спробуйте в Інтернеті!
Гален Іванов

23 байти завдяки ngn 1:-> #: Спробуйте в Інтернеті!
Гален Іванов

@GalenIvanov tyvm, це чудова хитрість.
Йона

2
1:-> 1. "несприятливий" працює з іменником праворуч, мабуть
ngn

@ngn TIL ... знову!
Йона

5

Сітківка , 47 42 байт

K`0¶1¶0
"$+"+`.+¶(.+)¶.+$
$&¶$.(*_$1*
6,G`

Спробуйте в Інтернеті! Виводить перші nчлени в окремі рядки. Пояснення:

K`0¶1¶0

Замінити вхід з умовами для -2, -1і 0.

"$+"+`.+¶(.+)¶.+$
$&¶$.(*_$1*

Створіть наступні nдоданки, використовуючи відношення повторення. *_тут короткий, $&*_який перетворює (перше) число в матчі в одинакове, а $1*коротке, $1*_яке перетворює середнє число в одинакове. У $.(повертає десяткову суму його одинарних аргументів, тобто суми першого та середнього числа.

6,G`

Відмовтеся від перших шести символів, тобто перших трьох рядків.


5

Cubix , 20 байт

Це 0 індексується і виводить N- й член

;@UOI010+p?/sqq;W.\(

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

Намотується на куб довжиною сторони 2

    ; @
    U O
I 0 1 0 + p ? /
s q q ; W . \ (
    . .
    . .

Дивіться, як це працює

  • I010 - Ініціює стек
  • +p? - Додає верхню частину стека, витягує лічильник з нижньої частини стека і тестує
  • /;UO@ - Якщо лічильник дорівнює 0, відбивайтеся на верхній частині обличчя, зніміть TOS, поворот у поворот, вихід та зупинку
  • \(sqq;W - Якщо лічильник позитивний, відбийте, лічильник зменшення, поміняйте TOS, двічі натисніть зверху вниз, вийміть TOS і змістіть смугу назад в основну петлю.


4

Perl 6 , 24 байти

{(1,1,1,*+*+!*...*)[$_]}

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

Досить стандартна генерована послідовність, при цьому кожен новий елемент генерується виразом * + * + !*. Це додає третій попередній елемент, другий попередній елемент та логічне заперечення попереднього елемента, який завжди Falseє числовим числом.


Чому ця вікі спільноти?
Джо Кінг

@JoKing б'є мене. Якби я це робив якось, це було не задумано.
Шон

4

05AB1E , 8 байт

1Ð)λ£₂₃+

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

1Ð)1D)3Å1n£

Як?

1Ð)λ£₂₃+ | Full program.
1Ð)      | Initialize the stack with [1, 1, 1].
   λ     | Begin the recursive generation of a list: Starting from some base case,
         | this command generates an infinite list with the pattern function given.
    £    | Flag for λ. Instead of outputting an infinite stream, only print the first n.
     ₂₃+ | Add a(n-2) and a(n-3).

Я не думаю, що це 1Ð)може бути 2 байти tbh. Я можу придумати шість різних 3 -байтних альтернатив , але жодних 2-байтних.
Кевін Круїссен

4

APL (Dyalog Unicode) , 20 18 17 байт SBCS

Цей код є 1-індексованим. Це стільки ж байтів, щоб отримати nелементи послідовності Padovan, як і ви повинні скинути останні кілька зайвих членів. Це також така ж кількість байтів, щоб отримати 0-індексацію.

Редагувати: -2 байти завдяки ngn. -1 байт завдяки ngn

4⌷2(⊢,⍨2⌷+/)⍣⎕×⍳3

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

Пояснення

4⌷2(⊢,⍨2⌷+/)⍣⎕×⍳3

  ⍺(. . . .)⍣⎕⍵   This format simply takes the input ⎕ and applies the function
                   inside the brackets (...) to its operands (here marked ⍵ and ⍺).
  2(. . .+/)⍣⎕×⍳3  In this case, our ⍵, the left argument, is the array 1 1 1,
                   where we save our results as the function is repeatedly applied
                   and our ⍺, 2, is our right argument and is immediately applied to +/,
                   so that we have 2+/ which will return the pairwise sums of our array.
       2⌷          We take the second pairwise sum, f(n-2) + f(n-3)
    ⊢,⍨            And add it to the head of our array.
4⌷                 When we've finished adding Padovan numbers to the end of our list,
                   the n-th Padovan number (1-indexed) is the 4th member of that list,
                   and so, we implicitly return that.

4

K (нг / к) , 24 20 байт

-4 байти завдяки ngn!

{$[x<3;1;+/o'x-2 3]}

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

0-індексований, перші N доданків


1
f[x-2]+f[x-3]-> +/o'x-2 3( oє "
повтор

@ngn Спасибі! Я спробував це (без успіху) в J; тут елегантно.
Гален Іванов

@ngn Насправді ось одна можливість, як це виглядає в J: (1 # .2 3 $: @ - ~]) `1: @. (3 &>)
Гален Іванов,

ах, правильно, базовий-1 декодування є зручним для поїздів способом
підрахунку

2
1:-> #у j рішення
ngn

4

32-бітний машинний код x86, 17 байт

53 33 db f7 e3 43 83 c1 04 03 d8 93 92 e2 fa 5b c3

Розбирання:

00CE1250 53                   push        ebx  
00CE1251 33 DB                xor         ebx,ebx  
00CE1253 F7 E3                mul         eax,ebx  
00CE1255 43                   inc         ebx  
00CE1256 83 C1 04             add         ecx,4  
00CE1259 03 D8                add         ebx,eax  
00CE125B 93                   xchg        eax,ebx  
00CE125C 92                   xchg        eax,edx  
00CE125D E2 FA                loop        myloop (0CE1259h)  
00CE125F 5B                   pop         ebx  
00CE1260 C3                   ret

Він 0-індексований. Ініціалізація зручно досягається обчисленням eax * 0. 128-розрядний результат дорівнює 0, і він переходить в edx: eax.

На початку кожної ітерації порядок регістрів ebx, eax, edx. Довелося вибрати правильний порядок, щоб скористатися кодуванням для xchg eaxінструкції - 1 байт.

Мені довелося додати 4 до лічильника циклу, щоб дозволити вихід eax, який утримує зворотне значення функції в fastcallконвенції.

Я міг би скористатися якоюсь іншою умовою виклику, яка не потребує збереження та відновлення ebx, але fastcallвсе одно весела :)


2
Я люблю бачити відповіді на машинні коди на PP&CG! +1
Тау


3

Луа 5.3,49 48 байт

function f(n)return n<4 and 1or f(n-2)+f(n-3)end

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

У Vanilla Lua немає примусу булевих рядків до рівних (навіть tonumber(true)повертається nil), тому вам доведеться використовувати псевдотермінальний оператор. Ця версія є 1-індексованою, як і у всіх Луа. 1orЧастина повинна бути змінена 1 orв Lua 5.1, який має інший спосіб лексичних чисел.



3

JavaScript (ES6), 23 байти

a(0)=a(1)=a(2)=1

N

f=n=>n<3||f(n-2)+f(n-3)

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


Я не думаю, що доцільно говорити, що повернення true- це те саме, що повернення, 1якщо решта результатів - це цифри.
Ніт


Я думаю, вам не вистачає деяких вимог: Подивіться мою модифікацію (версію на Java) тут .
Шак

@Shaq Виклик чітко визначає, що перші три члени послідовності є 1 . Отже, це не послідовність, визначена в A000931 (але формула така ж).
Арнольд

@Arnauld так, я бачу це зараз. Вибачте!
Шак


2

TI-BASIC (TI-84), 34 байти

[[0,1,0][0,0,1][1,1,0]]^(Ans+5:Ans(1,1

N

Введення в Ans.
Вихід є Ansі автоматично роздруковується.

Я подумав, що минуло достатньо часу, а також було опубліковано багато відповідей, з яких було багато, хто цю відповідь переграв.

Приклад:

0
               0
prgmCDGFD
               1
9
               9
prgmCDGFD
               9
16
              16
prgmCDGFD
              65

Пояснення:

[[0,1,0][0,0,1][1,1,0]]^(Ans+5:Ans(1,1      ;full program (example input: 6)

[[0,1,0][0,0,1][1,1,0]]                     ;generate the following matrix:
                                            ; [0 1 0]
                                            ; [0 0 1]
                                            ; [1 1 0]
                       ^(Ans+5              ;then raise it to the power of: input + 5
                                            ; [4  7 5]
                                            ; [5  9 7]
                                            ; [7 12 9]
                               Ans(1,1      ;get the top-left index and leave it in "Ans"
                                            ;implicitly print Ans

2

Pyth, 16 байт

L?<b3!b+y-b2y-b3

Це визначає функцію y. Спробуйте тут!

Ось більш веселе рішення, хоча це на 9 байт довше; байти можна було хоч поголити.

+l{sa.pMf.Am&>d2%d2T./QY!

Для цього використовується визначення, яке дав Девід Каллан на сторінці OEIS: "a (n) = кількість композицій з n на частини, непарні та> = 3." Спробуйте тут! Він приймає введення безпосередньо замість визначення функції.


y-b2y-b3може, можливо, переобладнати або роздвоєним, або L? Хоча оголошення масиву з двох елементів коштує дорого. yL-Lb2,3довше :(
Вересень

@Вен я зміг замінити, +y-b2y-b3на smy-bdhB2яку є однакова кількість байтів; hB2результати в масиві[2, 3]
RK.

Молодці далі hB2. Шкода, що це те саме число байтів.
Вен

Так, хоча мені цікаво, чи є якийсь спосіб позбутися від dкарти.
РК.

2

Java, 41 байт

Неможливо використовувати лямбда (помилка виконання). Порт цієї відповіді Javascript

int f(int n){return n<3?1:f(n-2)+f(n-3);}

ТІО


Я думаю, вам не вистачає деяких вимог: Погляньте на мою модифікацію тут .
Шак

Будь ласка, не враховуйте коментар Шака: ваша відповідь правильна і є найкоротшою можливою відповіддю на Java (як у Java 12).
Олів'є Грегоар

Добре тоді. Я не впевнений, що я "пропустив", але гаразд. Редагувати: nvm Я прочитав відповідь JS.
Бенджамін Уркхарт

2

R + pryr , 38 36 байт

Нульова індексація рекурсивної функції.

f=pryr::f(`if`(n<3,1,f(n-2)+f(n-3)))

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

Завдяки @Giuseppe вказав на два очевидно непотрібні байти.


2
Якщо ви збираєтесь використовувати pryr, мова повинна бути, R + pryrі це може бути 36 байт
Джузеппе

@Giuseppe дякую! Оновлено зараз.
rturnbull





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