Терпение, молодой «Падован»


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-indexed) отображается как вывод, в 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
Carmeister

Ответы:


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
это явно какой-то вуду
Pureferret

7
Это должно быть опубликовано.
YSC

6
@ YSC Это уже было опубликовано в A000931 . Я бы никогда не угадал трюк с простыми числами :)
flawr

1
... сделать это, "если кто-то не может сыграть в гольф два байта от этого" :) (теперь, когда у меня есть 9 байтов )
Джонатан Аллан

1
Я так привык видеть здесь абсурдно маленькие ответы, что я подумал, что запятая после «Желе» на самом деле является кодом для этой проблемы
Тасос Папастилиану,


26

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

ŻṚm2Jc$S

Монадическая ссылка, принимающая n(0-indexed), которая дает 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

А вот "twofer"
... совершенно другой метод также для 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 и Galen

закрытая форма, 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Å1т. Д., Но ни один из них не сохраняет байтов). Выводит первые членов последовательности. Или без него он вывел бы бесконечный поток членов последовательности.n£

Как?

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 байта ТБХ. Я могу думать о шести различных 3 -байтовых альтернативах , но не о 2-байтовых.
Кевин Круйссен

4

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

Этот код 1 проиндексирован. Это то же количество байтов, чтобы получить nэлементы последовательности Падована, так как вам нужно отбросить последние несколько дополнительных членов. Это также то же количество байтов, чтобы получить 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( ois "
recur

@ngn Спасибо! Я попробовал это (без успеха) в J; здесь элегантно
Гален Иванов

@ngn На самом деле есть одна возможность, как это выглядит в J: (1 #. 2 3 $: @ - ~]) `1: @. (3 &>)
Гален Иванов

ну, правильно, декодирование базы-1 - это удобный способ подвести итог :)
ngn

2
1:-> #в решении j
нгн

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-проиндексирована, как и все Lua. Эта 1orчасть должна быть изменена на 1 orLua 5.1, в которой по-разному используются лексические числа.



3

JavaScript (ES6), 23 байта

Реализует рекурсивное определение A000931 , но с , как указано в задании.a(0)=a(1)=a(2)=1

Возвращает й член, 0-проиндексированный.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

0-индексированный й член последовательности.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? Хотя объявление массива из 2 элементов является дорогостоящим. yL-Lb2,3длиннее :(
Ven

@Ven я был в состоянии заменить +y-b2y-b3с smy-bdhB2которой одно и то же количество байтов; hB2результаты в массиве[2, 3]
рк.

Хорошо сделано на hB2. Жаль, что это тот же счетчик байтов.
Вен

Да, хотя мне интересно, есть ли способ избавиться от dкарты.
РК.

2

Java, 41 байт

Не могу использовать лямбду (ошибка времени выполнения). Порт этого Javascript ответа

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

TIO


Я думаю, что вы пропускаете некоторые требования: посмотрите на мою модификацию здесь .
Шак

Пожалуйста, не обращайте внимания на комментарий Шака: ваш ответ правильный и самый короткий из возможных ответов Java (начиная с Java 12).
Оливье Грегуар

Хорошо, тогда. Я не уверен, что я "пропустил", но хорошо. Редактировать: Н.В.М. Я прочитал ответ 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 байтов
Джузеппе

@ Джузеппе спасибо! Обновлено сейчас.
rturnbull





Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.