Сегодня ваша цель состоит в том, чтобы найти целые числа a и b, заданные неотрицательным целым числом n, такие, что:
Вы должны написать программу или функцию, которая принимает параметр n и выводит a и b в выбранном вами формате.
Применяются стандартные лазейки. Кроме того, предполагается, что вы решите вышеуказанную проблему, используя базовую арифметику самостоятельно. Поэтому вы не можете использовать встроенные функции точной алгебры, рациональные выражения или функции, реализующие нетривиальные математические конструкции (например, последовательность Лукаса ).
Самый короткий код в байтах побеждает.
Пример ввода / вывода:
0 → 1, 0
1 → 3, 1
2 → 14, 6
3 → 72, 32
4 → 376, 168
5 → 1968, 880
6 → 10304, 4608
7 → 53952, 24128
8 → 282496, 126336
9 → 1479168, 661504
источник
[3 5;1 3]**input('')*[1;0]
это 26 байтов, а не 41.@(n)[3 5;1 3]^n*[1;0]
(дескриптор функции) спасет вас пять символов, хорошая идея!Python 2, 50
Умножается на
3+sqrt(5)
несколько раз его действием на(a,b)
представление парыa+b*sqrt(5)
. Эквивалентно тому, чтобы начинать с вектора столбца[1,0]
и умножать его влевоn
на матрицу[[3,5],[1,3]]
.источник
Юлия,
2220 байтЭто создает лямбда-функцию, которая принимает одно целое число в качестве входных данных и возвращает 2-элементный вектор целых чисел, соответствующий решению [a, b]. Чтобы назвать его, дайте ему имя, например
f=n->...
.Начните с умножения
Затем мы можем перевести правую часть этого уравнения в матрицу из 2 столбцов, где первая соответствует коэффициенту a, а вторая - коэффициенту b :
Умножьте эту матрицу на себя n раз, затем умножьте вправо на вектор столбцов (1, 0), и POOF! Out выскакивает вектор решения.
Примеры:
источник
J, 20 байт
Умножьте вектор
[1 0]
с[[3 5] [1 3]]
n
временами матрицы .2 байта сохранены благодаря @algorithmshark.
Использование и тестирование:
источник
+/ .*(3 5,:1 3&)&1 0
.(+/@:*&(3 5,.1 3)&1 0)
работает а(+/@:*&1 0&(3 5,.1 3))
не? Не должен ли второй связать правильно, а первый поменялся местами?&
питание включается / зацикливается, поэтому вы изменяете вход левой стороны во время включения питания (в отличие от обычной модификации правой стороны).Pyth, 20 байт
u
который в общем случае сокращается, используется здесь как цикл многократного применения. Функция обновленияG
->,+*3sGyeG+sGyeG
, гдеG
2 кортежа. Эта функция переводится как3*sum(G) + 2*G[1], sum(G) + 2*G[1]
.s
естьsum
,y
есть*2
.источник
APL (22)
Объяснение:
{
...}⍣⎕⍨2↑1
: прочитать число и запустить следующую функцию много раз, используя[1,0]
в качестве начального ввода.2 2⍴3 5 1
: матрица[[3,5],[1,3]]
⍵+.×⍨
: умножьте первое число в ⍵ на 3, второе на 5 и сложите их, это новое первое число; затем умножьте первое число в ⍵ на 1, второе на 3 и сложите те, которые являются новым вторым числом.источник
Желе , 13 байт
Попробуйте онлайн!
Как это работает
источник
Математика, 31
источник
CJam, 21 байт
Попробуйте онлайн.
Как это работает
источник
Javascript,
6361 байтЯ использую рекурсивную оценку бинома: (x + y) ^ n = (x + y) (x + y) ^ {n-1}
Новый (спасибо @ edc65)
старый
источник
F=n=>{for(i=y=0,x=1;i++<n;)[x,y]=[3*x+5*y,x+3*y];return[x,y]}
n=>[...Array(n)].map(_=>[x,y]=[3*x+5*y,x+3*y],y=0,x=1)[n-1]
той же длиныC, 114 байтов
Это реализует умножение матриц скучным способом. Для большего удовольствия (цитата: «потрясающе ужасно») 238-байтовое решение, не смотрите дальше!
разгадали:
Это, вероятно, может быть немного сокращено. Попробуйте тестовую программу онлайн !
источник
к2 - 22 символа
Функция принимает один аргумент.
_mul
является умножением матрицы, поэтому мы каррируем ее с матрицей,(3 5;1 3)
а затем нажимаем на нее наречие функциональной мощности:f/[n;x]
применяетсяf
кx
,n
раз. Снова мы его карри, на этот раз с начальным вектором1 0
.Это не будет работать в Kona, потому что по какой-то причине
f/[n;x]
не реализовано правильно.n f/x
Работает только синтаксис, поэтому самое короткое исправление -{x _mul[(3 5;1 3)]/1 0}
23 символа.источник
ised, 25 байтов (20 символов)
Я надеялся на лучшее, но нужно слишком много скобок, чтобы сделать его компетентным, приоритет оператора не оптимален для игры в гольф.
Ожидается, что вход будет в слоте $ 1, так что это работает:
При n = 0 ноль пропускается (выводится 1 вместо 1 0). Если это проблема, замените финал
1
на~[2]
.источник
Серьезно, 32 байта, не конкурирующие
Шестнадцатеричный дамп:
Попробуй Onlline
Очевидно, не претендент на самый короткий, но, по крайней мере, метод является оригинальным. (Отмечая, что такая проблема обязательно указывает последовательность Лукаса, как упомянуто в описании, эта программа генерирует последовательные члены последовательностей, используя рекуррентное соотношение
a_n = 6 * a_ {n-1} - 4 * a_ {n-2}.)
источник
Haskell, 41 байт
Пример использования:
(iterate(\(a,b)->(3*a+5*b,a+3*b))(1,0)!!) 8
->(282496,126336)
.источник
C / C ++ 89 байт
отформатирован:
Та же концепция:
Испытательный стенд:
Выход:
источник
К, 37 байт
или
Они оба одно и то же.
источник
Python 3, 49 байт
хотя на моей машине это дает только правильный ответ для входных данных в диапазоне
0 <= n <= 18
.Это реализует формулу закрытой формы
и использует тот факт, что
v ** n
деталь небольшая и может быть вычислена путем округления, а не прямого вычисления.источник
Схема, 97 байт
источник
C 71 байт (60 с предварительно инициализированными переменными)
Возможности для игры в гольф пока нет, но только для того, чтобы доказать, что C не должен быть «ужасно ужасным».
Если значения в a инициализированы в {1,0}, мы делаем лучше.
Это итеративно использует отображения a-> 3a + 5b, b-> a + 3b, но избегает временной переменной, вычисляя вместо этого новое значение b.
источник
a[*a=1]=0
вместо*a=1,a[1]=0
(неконкурентный) желе, 10 байт
Попробуйте онлайн!
Использует матрицу. Вычисляет ([[3,1], [5,3]] ** input ()) [0].
источник