Последовательность Фибоначчи - это хорошо известная последовательность, в которой каждая запись является суммой предыдущих двух, а первые две записи равны 1. Если мы возьмем по модулю каждого члена константу, последовательность станет периодической. Например, если бы мы решили вычислить последовательность мод 7, мы получили бы следующее:
1 1 2 3 5 1 6 0 6 6 5 4 2 6 1 0 1 1 ...
Это имеет период 16. Связанная последовательность, называемая последовательностью Пизано , определяется так, что a(n)
это период последовательности Фибоначчи при вычислении по модулю n.
задача
Вы должны написать программу или функцию, которая при получении n
будет вычислять и выводить период мод последовательности Фибоначчи n
. Это n-й член в последовательности Пизано.
Вы должны поддерживать только целые числа в диапазоне 0 < n < 2^30
Это соревнование по коду для игры в гольф, поэтому вы должны стремиться минимизировать размер исходного кода, измеряемый байтами.
Контрольные примеры
1 -> 1
2 -> 3
3 -> 8
4 -> 6
5 -> 20
6 -> 24
7 -> 16
8 -> 12
9 -> 24
10 -> 60
11 -> 10
12 -> 24
f(i),f(i+1)
может принимать не болееn^2
значений модn
. Таким образом,n
ограничение2^30
может закончиться, производя период до2^60
. Ограничениеn <= 2^16
дало быP(n) <= 2^32
.f(i+2) = f(i+1)+f(i)
, что «состояние» машины, зацикливающейся на период, можно описать с помощью пары целых чисел модn
. Есть в большинствеn^2
штатов, поэтому период не болееn^2
. Ой! Википедия утверждает, что период не более6n
. Не берите в голову мою мелочь.Ответы:
GolfScript (
28 25 2423 символов)Принимает ввод в stdin, оставляет его в stdout (или в стеке, если вы хотите продолжить его обрабатывать ...)
Это правильно обрабатывает угловые случаи ( Демо ).
Как интерес для программистов GolfScript, я думаю, что это первая программа, которую я написал с развёртыванием, которая на самом деле оказалась короче, чем другие подходы, которые я пробовал.
источник
GolfScript, 24 символа
Следующая итерация реализации GolfScript. Вторая версия теперь также обрабатывает 1 правильно. Это стало довольно долго, но, возможно, кто-то может найти способ сократить эту версию. Вы можете попробовать вышеуказанную версию онлайн .
источник
1
Правильно ли это обрабатывает ввод ?1
- и все еще только 24 символа.Python,
1881321019587 символовиспользование
Например:
источник
cat
тин , чтобыwc -c
и я получаю тот же номер.if k>0 and s[0:k]==s[k:]:break
можно изменить наif s and s[:k]==s[k:]:break
. Вы также можете существенно сократить, удалив итератор, изменивfor
циклwhile 1:
и выполнив егоa,b=a,a+b
в конце цикла while.питон
908596949082Редактировать: Реализованные предложения от beary и primo
источник
a.append(c) -> a+=[c]
хотя цикл можно поместить в одну строку,((n>1)>>(c in a)) -> (n>1)>>(c in a)
append
на самом деле имеет другую функциональность, чем+=
. Спасибо за советы, хотя.(n>1)>>(c in a)
->
(c in a)<1%n
за 3 байта. И я согласен с Беари в добавлении. Независимо от того, добавляете ли вы ссылкуc
или расширяете ееa
по значениюc
, это в любом случае одинаково (так как вы немедленно уничтожаете свою ссылкуc
).a+=c
вместоa+=[c]
Mathematica 73
источник
PHP -
6157 байтЭтот сценарий будет ошибочно сообщать
2
дляn=1
, но все остальные значения являются правильными.Пример ввода / вывода, усекаемый слева ряд, где π (n) = 2n + 2:
источник
1<$a.$b=+$a+$a=!$i+++$b%$n+=fgets(STDIN)
О боже, это какой-то порядок эксплуатации операции прямо там.PowerShell: 98
Гольф-код:
Ungolfed, с комментариями:
Примечания:
Я не уверен точно, что максимальный надежный предел для $ n с этим сценарием. Вполне возможно, что меньше 2 ^ 30, так как $ x может переполнить int32 до того, как туда попадет $ n. Кроме того, я не проверял верхний предел самостоятельно, потому что время выполнения сценария уже достигло 30 секунд в моей системе для $ n = 1e7 (что чуть больше 2 ^ 23). По той же причине я не склонен быстро тестировать и устранять любые дополнительные синтаксисы, которые могут потребоваться для обновления переменных до uint32, int64 или uint64, где это необходимо, чтобы расширить диапазон этого скрипта.
Образец вывода:
Я завернул это в другой цикл:
Затем установите
$n=$i
вместо=read-host
и измените вывод на,"$i | $x"
чтобы получить представление об общей надежности сценария. Вот некоторые из результатов:...
Sidenote:
Я не совсем уверен, что некоторые периоды Пизано значительно короче, чем $ n. Это нормально или что-то не так с моим скриптом?Неважно - я только что вспомнил, что после 5 числа Фибоначчи быстро становятся намного больше, чем их место в последовательности. Итак, теперь это имеет смысл.источник
Perl,
75,61, 62 + 1 = 63использование
Ungolfed
+1 байт за
-n
флаг. Побрил 13 байтов благодаря Габриэлю Бенами.источник
$n=<>;
(-6) и заменить его-n
флагом (+1), тогда все экземпляры$n
можно заменить на$_
. Вы можете использовать-M5.010
бесплатно, что позволяет использоватьsay
команду вместоprint
(-2).while
Операторы- модификаторы не нуждаются в скобках вокруг условия (-2). Вместо этого@{[%h]}/2
вы можете иметь счетчик$a++,
до,($m,$k)=
а затем просто иметьsay$a-1
в конце (-2). Вместо"$m,$k"
использования$m.$k
(-2). Это должно получиться$k=1%$_;$a++,($m,$k)=($k,($m+$k)%$_)while!$h{$m.$k}++;say$a-1
с-n
флагом, для 61 + 1 = 62 байта."$m,$k"
вместо$m.$k
(+2), но вы можете сэкономить 1 байт, изменивwhile!$h
наuntil$h
(-1). Сожалею!$m.$k
сбой? Казалось, сработало на моем конце.Clojure, 102 байта
Не слишком захватывающе, итерация формулы, пока мы не вернемся
[1 1]
(я надеюсь, что это всегда так). Специальная обработка,(f 1)
поскольку это сходится к[0 0]
.источник