Мы все знакомы с последовательностью Фибоначчи :
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765
Однако вместо этого f(n) = f(n-1) + f(n-2)
мы возьмем цифровую сумму предыдущих 2 записей.
Последовательность должна все еще начинаться 0, 1
, после этого различия быстро становятся очевидными. Этот список 0-индексирован, вы также можете использовать 1-индексированный, состояние, которое вы использовали.
f(0) = 0
f(1) = 1
f(2) = 1 # 0 + 1
f(3) = 2 # 1 + 1
f(4) = 3 # 1 + 2
f(5) = 5 # 2 + 3
f(6) = 8 # 3 + 5
f(7) = 13 # 8 + 5
f(8) = 12 # 8 + 1 + 3
f(9) = 7 # 1 + 3 + 1 + 2
f(10) = 10 # 1 + 2 + 7
f(11) = 8 # 7 + 1 + 0
f(12) = 9 # 1 + 0 + 8
f(13) = 17 # 8 + 9
f(14) = 17 # 9 + 1 + 7
f(15) = 16 # 1 + 7 + 1 + 7
f(16) = 15 # 1 + 7 + 1 + 6
f(17) = 13 # 1 + 6 + 1 + 5
f(18) = 10 # 1 + 5 + 1 + 3
f(19) = 5 # 1 + 3 + 1 + 0
f(20) = 6 # 1 + 0 + 5
f(21) = 11 # 5 + 6
f(22) = 8 # 6 + 1 + 1
f(23) = 10 # 1 + 1 + 8
f(24) = 9 # 8 + 1 + 0
f(25) = 10 # 1 + 0 + 9
f(26) = 10 # 9 + 1 + 0
f(27) = 2 # 1 + 0 + 1 + 0
(After this point it repeats at the 3rd term, 0-indexed)
Примечание: я не заметил повторения, пока не опубликовал сам вызов, и здесь я думал, что было бы невозможно написать еще один новый вызов Фибоначчи.
Ваша задача, учитывая число n
, вывести n-ую цифру этой последовательности.
Первые 3 цифры: [0,1,1]
,
24-значный повторный шаблон: [2,3,5,8,13,12,7,10,8,9,17,17,16,15,13,10,5,6,11,8,10,9,10,10]
Подсказка: вы можете использовать это повторение в своих интересах.
Это код-гольф , самый низкий счетчик байтов является победителем.
БОНУС: Если вы используете повторение в своем ответе, я присваиваю ответ с наименьшим количеством байтов, который использует преимущество повторения в последовательности, вознаграждение в 100 баллов. Это должно быть представлено как часть вашего исходного ответа, после вашего исходного ответа. Посмотрите этот пост как пример того, о чем я говорю: https://codegolf.stackexchange.com/a/108972/59376
Чтобы получить этот бонус, ваш код должен выполняться в постоянном времени ( O(1)
) с объяснением.
Победитель премии: Деннис https://codegolf.stackexchange.com/a/108967/59376 <Денис выиграл.
Самая уникальная реализация: https://codegolf.stackexchange.com/a/108970/59376
(также получит 100 баллов, завершенных после выбора правильного ответа)
источник
%24
к «нормальному» решению?O(1)
. Ваш код должен работать в постоянном времени, если он действительно использует повторение.Ответы:
Оазис , 5 байт
Код:
Попробуйте онлайн!
Расширенная версия:
Объяснение:
источник
JavaScript (ES6), 45 байт
x
иy
не может быть и того и другого9
, поскольку для этого потребуется предыдущее число0
, поэтому их цифровая сумма не может превышать17
. Это означает, что цифровой корень для чисел больше, чем9
тот же, что и остаток по модулю9
.источник
Python 2, 53 байта
Рекурсивная функция. Базовые случаи
n=0
иn=1
выходомn
, большее число вычислить значение путем вызоваf(n-1)
иf(n-2)
преобразования каждого в строку, конкатенации двух строк, преобразование каждого символа в целое число с помощьюmap
сint
функцией, а затем суммирует результирующий список.Используя информацию по модулю 24, я могу получить 56-байтовую нерекурсивную безымянную функцию:
источник
JavaScript (ES6), 34 байта
Может заморозить ваш браузер для входов выше 27 или около того, но он работает для всех входных значений. Это можно проверить с помощью простого кэша:
Как указано в блестящем ответе Нила , выходной сигнал никогда не может превышать 17, поэтому цифровая сумма любого выходного сигнала выше 9 равна
n%9
. Это также работает с выходами ниже 9; мы можем заставить его работать и для 9, вычитая 1 с~-
до модуля, а затем добавляя обратно в 1 после.Лучшее, что я мог сделать с жестким кодированием - это 50 байт:
источник
Желе , 8 байт
Попробуйте онлайн!
Как это работает
Альтернативное решение, 19 байтов, постоянное время
Попробуйте онлайн!
Как это работает
источник
JavaScript (ES6),
52 4645 байтиспользование
Выход
объяснение
Эта функция проверяет, меньше ли входное значение, чем 2, и если да, то возвращает входное. В противном случае он создает массив из двух значений, которые добавляются друг к другу в виде строк. Эти два значения являются результатом вызова функции с помощью
input - 1
иinput - 2
....
Оператор разбивает эту строку в массив символов, который затем преобразуется в строку еще раз, но теперь с+
эс между значениями. Затем эта строка интерпретируется как код, поэтому вычисляется сумма, которая затем возвращается.Это двойной рекурсивный алгоритм, что делает его довольно неэффективным.
n-2
Для ввода требуется 2 вызова функцийn
. Таким образом, вот более длинное, но более быстрое решение. Спасибо ETHproductions за то, что придумали.источник
[..._(--$)+[_(--$)]]
:-)05AB1E , 8 байтов
Попробуйте онлайн!
объяснение
источник
CJam,
2220 байтСохранено 2 байта благодаря Мартину Эндеру
Простой рекурсивный алгоритм, ничего особенного. 0 индексированные.
Попробуйте онлайн! или тест на 0-50 (на самом деле работает довольно быстро).
объяснение
CJam, 42 байта
Решение с помощью повторения. Аналогичен алгоритму решения Джонатана Аллана.
Попробуйте онлайн!
источник
Perl 6 ,
4137 байтПопытайся
Попытайся
источник
*.comb.sum+*.comb.sum
.MATL , 15 байт
Попробуйте онлайн!
источник
Python 2 ,
5446 байтСильно вдохновлен ответом @ETHproductions на ES6 .
Попробуйте онлайн!
источник
C 96 байтов
или 61 байт, считая управляющие коды как 1 байт каждый
0 проиндексировано. Подобно некоторым другим ответам, я индексирую таблицу поиска значений, но я сжал ее в 4-байтовые куски. Я не удосужился исследовать версию мода 24, потому что я не думал, что она была настолько интересной, так как другие уже сделали это, но давайте посмотрим правде в глаза, C все равно не победит.
объяснение:
Попробуйте онлайн!
источник
Japt ,
2725 байтПопробуйте онлайн!
Сохранено 2 байта благодаря ETHproductions.
источник
´
вместо того,--
чтобы сохранить два байта.Haskell , 54 байта
Попробуйте онлайн! Использование:
(g!!) 12
источник
Mathematica, 49 байтов
Простое рекурсивное определение. Становится довольно медленно через некоторое время.
Mathematica,
7971 байтЖесткое кодирование периодической структуры. Молниеносно и приятно оскорбительно для Mathematica :) Спасибо JungHwan Min за сохранение 8 байт!
источник
LetterNumber@"JJBCEHMLGJHIQQPOMJEFKHJ"
на 8 байт короче43626804920391712116157158790~IntegerDigits~18
.LetterNumber
....Python 2 , 56 байт
Простое итеративное решение.
Попробуйте онлайн!
Использование на
(a%9or a)+(b%9or b)
самом деле оказалось корочеsum(map(int(`a`+`b`)))
!источник
sum(map(int,a+b))
(не могу понять, как использовать `в комментариях)PowerShell , 79 байт
Попробуйте онлайн!
Длинное скучное итеративное решение, которое выполняет вычисления с цифрами и суммами в каждом
for
цикле В конце цикла, число, которое мы хотим, находится в$b
, так что это остается на конвейере и вывод неявный. Обратите внимание, что если ввод0
, то цикл не будет введен, так как условие ложно, поэтому$b
остается0
.источник
Пакетная, 85 байт
Мне было интересно, как я собирался перенести мой ответ JavaScript на пакет, но ключ был в решении Python от @ Dennis.
источник
Pyth, 20 байтов
Программа, которая принимает входные данные с нулевым индексом и печатает результат.
Набор тестов (Первая часть для форматирования)
Как это работает
[Объяснение будет позже]
источник
Рубин, 58 байт
Простое жестко закодированное решение.
источник
сложено , 40 байтов
Эта лямбда эквивалентна следующей лямбде:
Попробуйте онлайн!
источник
Октава, 148 байт
источник
Haskell, 151 байт
Вызовите функцию
f 123456789012345678901234567890123456789012345678
, например.Код работает также с очень большими индексами. Благодаря реализованной функциональности по модулю 24 это очень быстро.
Несжатый код:
источник
R, 90 байт
Ужасно длинное решение, но оно лучше, чем те 108, которые у меня были изначально. Я подозреваю, что есть намного лучший способ сделать это, но я не могу видеть это в настоящее время.
Это безымянная функция, которая использует
gsub
иscan(t=
для разделения чисел в векторе на цифры. Их сумма добавляется к вектору, когда первый элемент отбрасывается.repeat
используется для пошагового выполнения последовательностиn
а результатом является первый элемент вектора.источник
PHP, 80 байт
Онлайн версия
источник
Mathematica, 67 байт
источник