Новий порядок №5: де Фібоначчі та Бітті зустрічаються у Вайтофа


16

Вступ (може бути проігноровано)

Розміщення всіх позитивних чисел у звичайному порядку (1, 2, 3, ...) трохи нудне, чи не так? Отже, ось низка викликів навколо перестановок (перестановок) усіх позитивних чисел. Це п’яте завдання в цій серії (посилання на перший , другий , третій та четвертий виклики).

У цьому виклику ми зустрінемо масив Wythoff, який є переплетеною лавиною послідовностей Фібоначчі та послідовностей Бітті!

Ці числа Фібоначчі , ймовірно , для більшості з вас добре відомої послідовності. З урахуванням двох вихідних чисел і , наступні задаються: для .F0F1FnFn=F(n1)+F(n2)n>2

Послідовність Бітті , задана параметром становить: для . Однією з властивостей послідовності Бітті є те, що для кожного параметра існує точно один параметр , такий, що послідовності Бітті для цих параметрів від'єднуються і з'єднуються разом, вони охоплюють усі натуральні числа, виключаючи 0 (наприклад: ).rBnr=rnn1rs=r/(r1)BrBr/(r1)=N{0}

Тепер тут випливає мисляча частина: ви можете створити масив, де кожен рядок є послідовністю Фібоначчі, а кожен стовпець - послідовністю Бітті. Цей масив є масивом Wythoff . Найкраще: кожне додатне число з’являється рівно один раз у цьому масиві! Масив виглядає приблизно так:

   1    2    3    5    8   13   21   34   55   89  144 ...
   4    7   11   18   29   47   76  123  199  322  521 ...
   6   10   16   26   42   68  110  178  288  466  754 ...
   9   15   24   39   63  102  165  267  432  699 1131 ...
  12   20   32   52   84  136  220  356  576  932 1508 ...
  14   23   37   60   97  157  254  411  665 1076 1741 ...
  17   28   45   73  118  191  309  500  809 1309 2118 ...
  19   31   50   81  131  212  343  555  898 1453 2351 ...
  22   36   58   94  152  246  398  644 1042 1686 2728 ...
  25   41   66  107  173  280  453  733 1186 1919 3105 ...
  27   44   71  115  186  301  487  788 1275 2063 3338 ...
  ...

Елемент у рядку та стовпці визначається як:mн

Am,n={mφφ if n=1mφφ2 if n=2Am,n2+Am,n1 if n>2

де - золоте співвідношення: .φφ=1+52

Якщо ми будемо слідувати антидіагоналі цього масиву, ми отримаємо A035513 , яка є цільовою послідовністю для цього виклику (зауважте, що цю послідовність додав до OEIS самим Нілом Слоаном !). Оскільки це завдання "чистої послідовності", завдання полягає у виведенні для заданого якості вхідного сигналу, де - A035513 .a(n)na(n)

Існують різні стратегії, які ви можете дотримуватися, щоб дістатися до , що робить цей виклик (на мій погляд) справді цікавим.a(n)

Завдання

З урахуванням цілого вводу , виведіть у форматі, де - A035513 .na(n)a(n)

Примітка: тут передбачається індексація на основі 1; ви можете використовувати індексацію на основі 0, тож і т. д. Будь ласка, зазначте це у своїй відповіді, якщо ви вирішили скористатися цим.a(0)=1;a(1)=2

Тестові справи

Input | Output
---------------
1     |  1
5     |  7
20    |  20
50    |  136
78    |  30
123   |  3194
1234  |  8212236486
3000  |  814
9999  |  108240
29890 |  637

Можливо, буде цікаво дізнатись, що найбільший a(n) для 1n32767 - a(32642)=512653048485188394162163283930413917147479973138989971=F(256)2φ+F(255).

Правила

  • Вхід і вихід - цілі числа
  • Ваша програма повинна хоча б підтримувати введення в межах від 1 до 32767). Зверніть увагу , що ( п ) доходить до 30 значних чисел в цьому діапазоні ...а(н)
  • Неправильний вхід (0, плавці, рядки, негативні значення тощо) може призвести до непередбачуваного виводу, помилок або (не) визначеної поведінки.
  • Застосовуються правила вводу / виводу за замовчуванням .
  • Бійниці за замовчуванням заборонені.
  • Це , тому найкоротші відповіді в байтах виграють

2
То яка тут посилання на Нове замовлення?
Луїс Мендо

2
@LuisMendo: лавина послідовностей Фібоначчі та Бітті, які утворюють масив
Вайтофа

Ах, я це зовсім пропустив! Тепер я шкодую ...
Луїс Мендо

1
Чи відповідає представлення плаваючої точки phi (або rt (5)) та застосування повторення задовольняє вимогу діапазону?
Джонатан Аллан

1
Виправте 9 тестовий випадок: це 999не так9999
J42161217

Відповіді:


4

Желе , 27 24 байт

p`SÞ⁸ịð’;×ØpḞ¥×⁹r‘ÆḞ¤Sð/

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

Монадичне посилання за допомогою індексації на основі 1. Дякуємо @JonathanAllan за кращий спосіб отримання рядків та стовпців nта збереження 3 байтів. У найкоротшій формі він занадто повільний, щоб збільшити n на TIO, тому наступне Спробуйте в Інтернеті! зменшує розмір початкового списку рядків і стовпців вартістю трьох байтів.

Пояснення

p`                       | Cartesian product of the range from 1..input with itself   
  SÞ                     | Sort by sum
    ⁸ị                   | Find the tuple at the position indicated by the input - this is the row and column
      ð               ð/ | Start a new dyadic chain using the row as the left and column as the right argument
       ’                 | Increase the row by 1
        ;    ¥           | Concatenate to:
         ×Øp             |   row × φ
            Ḟ            |   rounded down
              ×     ¤    | Multiply this pair by
                  ÆḞ     |   the Fibonacci numbers at positions
               ⁹         |   column index and
                r‘       |   column index plus one
                     S   | sum

Зауважте, що це засноване на описі коду Python на сторінці OEIS.


1
...×⁹r‘ÆḞ¤Sð/зберігає його у вашій версії для
Джонатан Аллан

6

R , 143 130 124 123 байт

function(n){k=0:n+1
`~`=rbind
m=k-1~(k*(1+5^.5)/2)%/%1
for(i in k)m=m~m[i,]+m[i+1,]
m=m[-1:-2,]
m[order(row(m)+col(m))][n]}

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

Т(н,-1)=н-1;Т(н,0)=нϕ;Т(н,к)=Т(н,к-1)+Т(н,к-2)splitskіснує лише для того, щоб запобігти вимушенню drop=Fаргументу у m[-1:-2,]цій справі n=1.

Дякую Нілу за те, що він вказав гольф на 1 байт.

R , 150 138 132 байт

function(n){T[2]=1
for(j in 2:n-1)T=c(T,T[j]+T[j+1])
m=T[-1]%o%((1:n*(.5+5^.5/2))%/%1)+T[-1-n]%o%(1:n-1)
m[order(row(m)+col(m))][n]}

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

T(n,k)=Fib(k+1)nϕ+Fib(k)(n1)splitsnth

Дякуємо Робіну Райдеру за T[2]=1фокус для створення послідовності Фібоначчі.


Обидва рішення вкрай неефективні, створюючи nxnматрицю (швидше за все) doubles, оскільки R сприяє integer(32-бітовому підпису) до doubleавтоматичного переповнення, але друге має бути набагато швидше. Беручи в nякості bignum повинен працювати в автоматичному режимі, з допомогою виклику gmp::as.bigz(n), втрати точності при повинно doubleз бути тривожною, а потім мову буде R + gmp.


Ви можете використовувати (1+5^.5)/2замість (.5+5^.5/2)?
Ніл

@Neil ... так, можу. Дякую! Тільки збираюся відредагувати його у верхньому, якщо я не можу знайти спосіб гольфу по другому набагато більше.
Джузеппе


2

Желе , 30 байт

p`SÞ⁸ịð;Øp,²;\¤×Ḟ¥/;+ƝQƊ⁹¡ị@ð/

Спробуйте в Інтернеті!
Це трохи повільно, але величезне вдосконалення зроблено з префіксомḤ½Ċ(подвійний, квадратний корінь, стеля), як у цьому тестовому наборі .


2
ти правий! 740496902є результатом для999
J42161217

Поєднання першої вашої та другої моєї частини дає 25 байт . Не впевнений, хто з нас повинен мати комбіновану версію!
Нік Кеннеді

@NickKennedy - приємно, продовжуй!
Джонатан Аллан

2

Вугілля деревне , 54 байти

Nθ≔⁰ηW‹ηθ«≦⊕η≧⁻ηθ»⊞υ¹Fθ⊞υ⁻⁺³ι§υ⊖§υι⊞υθF⁺²⁻θη⊞υΣ…⮌υ²I⊟υ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. 0-індексований. Використовує лише цілу арифметику, тому працює для довільно великих значень. Пояснення:

Nθ

Вхідні дані q.

≔⁰ηW‹ηθ«≦⊕η≧⁻ηθ»

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

⊞υ¹Fθ⊞υ⁻⁺³ι§υ⊖§υι

Обчисліть перші m+1умови A019446 , хоча нас цікавить лише тьm .

⊞υθF⁺²⁻θη⊞υΣ…⮌υ²

Обчисліть перші n+4доданки узагальненого ряду Фібоначчі, що починається з [a(m), m]. Умови цієї послідовності - це mтерміни A019446 , A001477 , A000201 , A003622 , A035336 ; ці останні два є першими двома стовпцями масиву Wythoff, і тому ця послідовність триває з рештою mтретього ряду масиву.

I⊟υ

Виведіть потрібний термін.

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