Введение (может быть проигнорировано)
Размещать все положительные числа в обычном порядке (1, 2, 3, ...) немного скучно, не правда ли? Итак, вот серия проблем, связанных с перестановками (перестановками) всех положительных чисел. Это пятая задача в этой серии (ссылки на первый , второй , третий и четвертую задачу).
В этой задаче мы встретим массив Wythoff, который является переплетенной лавиной последовательностей Фибоначчи и последовательностей Битти!
Эти числа Фибоначчи , вероятно , для большинства из вас хорошо известной последовательности. Учитывая два начальных числа и , следующие задаются как: для .
Последовательность Битти , заданная параметром : для . Одним из свойств последовательности Битти является то, что для каждого параметра существует ровно один параметр , так что последовательности Битти для этих параметров не разделены и объединены, они охватывают все натуральные числа, исключая 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 ...
...
Элемент в строке и столбце определяется как:
где - золотое сечение: .
Если мы будем следовать антидиагоналам этого массива, мы получим A035513 , который является целевой последовательностью для этого вызова (обратите внимание, что эта последовательность добавлена в OEIS самим Нилом Слоаном !). Поскольку это задача «чистой последовательности», задача состоит в том, чтобы вывести для заданного качестве входных данных, где равно A035513 .
Существуют различные стратегии , которые вы можете следовать , чтобы добраться до , что делает эту проблему (на мой взгляд) очень интересно.
задача
Учитывая целочисленный ввод , выведите в целочисленном формате, где равноA035513 .
Примечание: здесь предполагается индексирование на основе 1; Вы можете использовать индексирование на основе 0, поэтому и т. д. Пожалуйста, укажите это в своем ответе, если вы решите использовать это.
Контрольные примеры
Input | Output
---------------
1 | 1
5 | 7
20 | 20
50 | 136
78 | 30
123 | 3194
1234 | 8212236486
3000 | 814
9999 | 108240
29890 | 637
Это может быть интересно знать , что самый большой ( п ) для 1 ≤ N ≤ 32767 является ( 32642 ) = 512653048485188394162163283930413917147479973138989971 = F ( 256 ) ⌊ 2 ф ⌋ + F ( 255 ) .
правила
- Вход и выход - целые числа
- Ваша программа должна как минимум поддерживать ввод в диапазоне от 1 до 32767). Обратите внимание, что идет до 30 цифр в этом диапазоне ...
- Неверный ввод (0, значения с плавающей запятой, строки, отрицательные значения и т. Д.) Может привести к непредсказуемому выводу, ошибкам или (не) определенному поведению.
- Применяются правила ввода / вывода по умолчанию .
- Лазейки по умолчанию запрещены.
- Это код-гольф , поэтому самые короткие ответы в байтах выигрывают
999
не так9999
Ответы:
Желе ,
2724 байтаПопробуйте онлайн!
Монадическая ссылка с использованием индексации на основе 1. Спасибо @JonathanAllan за лучший способ получить строки и столбцы
n
и сохранить 3 байта. В самой короткой форме он слишком медленный для больших n на TIO, так что попробуйте следующее ! уменьшает размер исходного списка строк и столбцов за счет трех байтов.объяснение
Обратите внимание, что это основано на описании кода Python на странице OEIS.
источник
...×⁹r‘ÆḞ¤Sð/
сохраняет один в вашей объединенной версии ( TIO )R ,
143130124123 байтПопробуйте онлайн!
Использует формулуT( n , - 1 ) = n - 1 ; T( n , 0 ) = ⌊ n ⋅ ϕ ⌋ ; T( n , k ) = T( n , k - 1 ) + T( n , k - 2 ) построить массив (транспонированный), затем
splits
массив вдоль антидиагоналей.k
просто существует, чтобы предотвратить принуждениеdrop=F
аргумента вm[-1:-2,]
случаеn=1
.Спасибо Нейлу за то, что он указал на 1-байтовый гольф.
R ,
150138132 байтПопробуйте онлайн!
Реализует формулуT( n , k ) = Fя б ( к + 1 ) ⋅ ⌊ п ⋅ ф ⌋ + Рi b ( k ) ⋅ ( n - 1 ) чтобы получить сгенерируйте массив, затем
splits
вдоль антидиагоналей и извлекитеnth
элемент.Спасибо Робину Райдеру за
T[2]=1
трюк для генерации последовательности Фибоначчи.Оба решения крайне неэффективны, создавая
nxn
матрицу (скорее всего)double
s, поскольку R повышаетinteger
(32-битная подпись)double
автоматически при переполнении, но второе должно быть намного быстрее. Принятиеn
в качестве bignum должно работать автоматически, используя вызовgmp::as.bigz(n)
, если потеря точности приdouble
s вызывает беспокойство, и тогда язык будетR + gmp
.источник
(1+5^.5)/2
вместо(.5+5^.5/2)
?Wolfram Language (Mathematica) , 90 байтов
Попробуйте онлайн!
источник
Желе , 30 байт
Попробуйте онлайн!
Это немного медленно, но огромное улучшение сделано с префиксом
Ḥ½Ċ
(двойной, квадратный корень, потолок), как в этом тестовом наборе .источник
740496902
это результат для999
Древесный уголь , 54 байта
Попробуйте онлайн! Ссылка на подробную версию кода. 0 индексированные. Использует только целочисленную арифметику, поэтому работает для произвольно больших значений. Объяснение:
Вход
q
.Вычислите антидиагональ путем вычитания постоянно растущих чисел, из
q
которых получается целевое число строкm
.Рассчитаем первые
m+1
члены A019446 , хотя нас интересуют только теm
.Вычислите первые
n+4
члены обобщенного ряда Фибоначчи, который начинается с[a(m), m]
. Термины этой последовательности представляют собойm
термины A019446 , A001477 , A000201 , A003622 , A035336 ; последние два являются первыми двумя столбцами массива Wythoff, и поэтому эта последовательность продолжается с остальной частьюm
строки массива.Выведите нужный термин.
источник