Учитывая положительный целочисленный ввод N , выведите два неотрицательных числа a и b , где a <b , с наименьшим возможным средним значением, которое приведет к тому, что число N будет частью повторяющейся последовательности отношений:
f(0) = a
f(1) = b
f(n) = f(n-2)+f(n-1)
Если существует более одного решения, где среднее значение a и b минимально, вы должны вывести решение с наименьшим b .
Вы можете предположить, что N находится в репрезентативном диапазоне целых чисел в вашем языке / системе.
Контрольные примеры
N = 1
a = 0, b = 1
N = 15
a = 0, b = 3
N = 21
a = 0, b = 1
N = 27
a = 0, b = 9 <- Tricky test case. [3, 7] is not optimal and [4, 3] is not valid
N = 100
a = 4, b = 10
N = 101
a = 1, b = 12
N = 102
a = 0, b = 3
N = 1000
a = 2, b = 10
a>=0
иa<b
есть когда - либо несколько решений?1,4
и другое2,3
дадут5
, и они имеют одинаковое значение. Я предполагаю, что можно найти случаи, подобные этому, где это самые низкие средние значения. Если вы можете показать / доказать, что не существует нескольких решений, вам не нужно проверять это условие.Ответы:
Шелуха ,
191816141315 байтСпасибо Згарбу за сохранение 1 байта.
Попробуйте онлайн!
Объяснение:
Отказ от ответственности: я действительно не понимаю
ȯƒẊ++
раздел кода.Редактировать: По-видимому, это переводит на Haskell
fix.(mapad2(+).).(++)
, гдеmapad2
применяется функция для всех смежных пар в списке. (Хотя, зная Husk, в контексте этой программы это может означать нечто иное)источник
JavaScript (Node.js) ,
92 90 89 91 8382 байта-3 байта-1 байт благодаря ThePirateBay-8-9 байт благодаря Нейлу.Попробуйте онлайн!
Примечание: это решение основано на том факте, что никогда не бывает нескольких минимальных решений.
Доказательство того, что никогда не бывает нескольких решений:
Позвольте
FIB(a,b,k)
быть Fibonacci-как последовательность, начинающаяся сa,b
:Лемма 1
Разница между Фибоначчи-подобных последовательностей сама по себе Фибоначчи , как, например
FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)
. Доказательство оставлено читателю.Лемма 2
Для
n >= 5
существует решение,a,b
удовлетворяющееa+b < n
:если
n
даже,FIB(0,n/2,3) = n
если
n
странно,FIB(1,(n-1)/2,3) = n
доказательство
Случаи, когда
n < 5
можно проверить исчерпывающе.Предположим, у нас есть два минимальных решения для
n >= 5
,a0,b0
иa1,b1
сa0 + b0 = a1 + b1
иa0 != a1
.Тогда существуют
k0,k1
такие, чтоFIB(a0,b0,k0) = FIB(a1,b1,k1) = n
.Случай 1:
k0 = k1
WLOG предполагает
b0 < b1
(и, следовательно,a0 > a1
)Позвольте
DIFF(k)
быть разница между Fibonnaci-как последовательности, начиная сa1,b1
иa0,b0
:DIFF(k) = FIB(a1,b1,k) - FIB(a0,b0,k) = FIB(a1-a0,b1-b0,k)
(Лемма 1)DIFF(0) = a1 - a0 < 0
DIFF(1) = b1 - b0 > 0
DIFF(2) = (a1+b1) - (a0+b0) = 0
DIFF(3) = DIFF(1) + DIFF(2) = DIFF(1) > 0
DIFF(4) = DIFF(2) + DIFF(3) = DIFF(3) > 0
Как только последовательность, подобная Фибоначчи, имеет 2 положительных члена, все последующие члены являются положительными.
Таким образом, единственный раз
DIFF(k) = 0
, когдаk = 2
, так что единственный выбор дляk0 = k1
это2
.Следовательно
n = FIB(a0,b0,2) = a0 + b0 = a1 + b1
Минимальность этих решений противоречит лемме 2.
Случай 2
k0 != k1
:Предположим, WLOG
k0 < k1
.У нас есть
FIB(a1,b1,k1) = n
Позволять
a2 = FIB(a1,b1,k1-k0)
Позволять
b2 = FIB(a1,b1,k1-k0+1)
Тогда
FIB(a2,b2,k0) = FIB(a1,b1,k1) = FIB(a0,b0,k0)
(упражнение для читателя)Поскольку
FIB(a1,b1,k)
неотрицателен дляk >= 0
, он также не убывает.Это дает нам
a2 >= b1 > a0
иb2 >= a1+b1 = a0+b0
.Тогда пусть
DIFF(k) = FIB(a2,b2,k) - FIB(a0,b0,k) = FIB(a2-a0,b2-b0,k)
(лемма 1)DIFF(0) = a2 - a0 > 0
DIFF(1) = b2 - b0 >= (a0 + b0) - b0 = a0 >= 0
DIFF(2) = DIFF(0) + DIFF(1) >= DIFF(0) > 0
DIFF(3) = DIFF(1) + DIFF(2) >= DIFF(2) > 0
Еще раз,
DIFF
имеет 2 положительных условия и, следовательно, все последующие условия являются положительными.Таким образом, единственный раз , когда это возможно , что
DIFF(k) = 0
этоk = 1
, так что единственный выбор дляk0
это1
.FIB(a0,b0,1) = n
b0 = n
Это противоречит лемме 2.
источник
b
а не минимизируетa+b
, и, следовательно, ваше решение дает,f(27) = [3,7]
но оптимальное решение естьf(27)=[0,9]
. После отмены критических изменений мы сократили до 83 байтов.b-~a
вместоa+b+1
.a2 >= a1 + b1
есть небольшая ошибка: не правильно, когдаk1-k0=1
. Вместо этого вы можете использоватьa2 >= b1 > a0
иb2 >= a1+b1 = a0+b0
, а затем остальное следует.Haskell ,
76 7274 байтаРЕДАКТИРОВАТЬ:
/
вместоdiv
, хотя для этого требуется использовать тип дробного числа.Enum
диапазонами при добавлении-1
.f
принимает значениеDouble
илиRational
тип и возвращает кортеж с таким же.Double
должно быть достаточно для всех значений, которые недостаточно велики, чтобы вызвать ошибки округления, хотяRational
теоретически не ограничены.Попробуйте онлайн! (с корректировками заголовка H.PWiz для ввода / вывода
Rational
s в целочисленном формате)Как это работает
?
является локально вложенным оператором в областиf
.a?b
рекурсивная шаги через Фибоначчи, как последовательность , начиная сa,b
доb>=n
, возвращаясьTrue
тогда и только тогда она попадаетn
точно.s
перебирает все числа1
сверху вниз, представляя суммуa
иb
.a
перебирает числа от0
доs/2-1
. (Еслиs
нечетно, конец диапазона округляется.)a?(s-a)
проверяет, если последовательность начинается сa,s-a
попаданийn
. Если это так, понимание списка включает в себя кортеж(a,s-a)
. (То есть,b=s-a
хотя он был слишком коротким, чтобы его можно было назвать.)!!0
выбирает первый элемент (хит) в понимании.источник
APL (Dyalog) ,
7571645953484443 байта2 байта сохранены благодаря @ Adám
12 байтов сохранено благодаря @ngn
Попробуйте онлайн!
Использует
⎕IO←0
.Как? Это сошло с ума.
k←⎕
- назначить вход дляk
⍳2⍴1+k←⎕
- декартово произведение диапазона0
наk
сам с собой|-\¨
- вычесть каждый элемент правой пары слева и получить абсолютные значенияa←,⍉
- транспонировать, выравнивать и присваиватьa
o←a/⍨</¨a
- сохранить только пары, где левый элемент меньше правого, и назначитьo
o
теперь содержит список всех парa < b
, упорядоченных по их среднему арифметическому+\∘⌽⍣{k≤⊃⍺}¨o
- для каждой парыo
применять фибоначчи (поменять местами пару и сперму), пока неk
будет достигнут или более высокий срокk∊¨
- затем решите,k
является ли этот последний термин (имеется в виду, что он содержится в последовательности)o/⍨
- и держите парыo
там, где применяется предыдущая проверка⊃
- вернуть первый результат.источник
Python 2 ,
127109107 байт-2 байта благодаря ovs (меняется
and
на*
)Попробуйте онлайн!
Есть ли бонусные баллы за
n,a,s-a
?Объяснение:
g
которая проверяет,a, b
достигнет ли расширение как последовательность Фибоначчиx
. Это также проверяетa <= b
, один из критериев вопроса. (Это позволило бы случаи, когдаa == b
, но в таком случае0, a
уже были бы обнаружены и возвращены).a<=b<x
выполняет сразу две полезные задачи: проверкаa <= b
и так далееb < x
.b < x
доходностьTrue
, то функция вызывает себя снова следующих двух чисел в последовательности Фибоначчи:b, a+b
. Это означает, что функция будет продолжать разрабатывать новые условия, пока ...b < x
даетFalse
, то мы достигли точки, где мы должны проверить, еслиb==x
. Если это так, это вернетсяTrue
, означая, что начальная пара вa, b
конечном итоге достигнетx
. В противном случае, еслиb > x
пара недействительна.f
которая находит решение для данного значенияn
. Он рекурсивно пробует новые начальные парыa, b
, пока неg(n, a, b)
получитTrue
. Это решение затем возвращается.s
(первоначально 1) иa
(первоначально 0). На каждой итерацииa
увеличивается иa, s-a
используется в качестве первой пары. Однако приa
попаданииs
он сбрасывается обратно в 0 иs
увеличивается. Это означает, что пары подсчитываются по следующей схеме: Очевидно, что он содержит несколько недопустимых пар, однако они мгновенно удаляются при передачеg
(см. Первый пункт маркированного списка).a
иs
найдены таковыg(n, a, s-a) == True
, то это значение возвращается. Поскольку возможные решения подсчитываются в порядке «размера» (отсортированного по среднему значению, а затем по минимальному значению), первое найденное решение всегда будет наименьшим, как требует запрос.источник
R ,
183 байт160 байтПопробуйте онлайн!
Спасибо Джузеппе за игру в гольф на 23 байта
Объяснение кода
источник
Mathematica, 117 байт
Попробуйте онлайн!
источник
Желе , 19 байт
Попробуйте онлайн!
-1 байт благодаря доказательства по cardboard_box . В случае, если это опровергнуто, вы можете добавить
UṂṚ
в конец второй строки в общей сложности 22 байта.источник
Ḣ
x
последним. Если бы онx
был найден в третьем индексе для множественного числа, то он работает0,x
и, следовательно, будет работать либо в1,(x-1)/2
(x
нечетном), либо2,x/2-1
(x
четном), после чегоx
в результате появится позже, так что этого не произойдет. Для более позднего столкновения среднее значение может быть таким же, только если третьи слагаемые тоже одинаковы, но тогда нужно иметь меньшую разницу между начальными слагаемыми (иначе они будут одинаковыми) и, следовательно, будетx
найдено по более позднему индексу , Таким образом, мы можемṫ-Sṭµ¡i³¶ḶŒcÇÐṀ
сэкономить четыре байта.ṫ-Sṭµ¡i³¶‘ḶŒcÇÐṀ
GolfScript -
8877 байтЯ не проверял множественные решения, благодаря картонная коробка!
объяснение
источник
Пакетное,
160158 байтисточник
3 7
на входе27
. Правильное решение есть0 9
.