Рассмотрим три последовательности чисел A
, B
и C
:
A
: Последовательность, основанная на рекуррентных отношенияхf(n) = f(n-1)+f(n-2)
, начиная сf(1) = 3, f(2) = 4
. Итак, последовательность начинается так:3 4 7 11 18 29 47 76 ...
B
: Составные числа , то есть все целые числа, которые не являются простыми числами (или 1):4 6 8 9 10 12 14 15 16 ...
C
Цифры Пи:3 1 4 1 5 9 2 6 5 ...
Если задано положительное целое число в N < 50
качестве аргумента функции или STDIN, вернуть десятичное значение дроби A(N)/B(N)
с C(N)
цифрами после десятичной точки. Применяются обычные правила округления (округление в большую сторону, если цифра N + 1 - 5 или выше). Если N-ая цифра pi
равна нулю, должно быть напечатано целое число. научная нотация / Стандартная форма принимается для номеров выше 1000.
Это код гольфа, поэтому выигрывает самый короткий ответ в байтах.
Несколько примеров:
N = 1: 0.750
N = 2: 0.7
N = 3: 0.8750
N = 4: 1.2
N = 6: 2.416666667
N = 10: 11.056
N = 20: 764.8750
Конечно, применяются стандартные правила игры в гольф.
Функция должна завершиться менее чем за две минуты на любом современном ноутбуке.
C(n)
цифры, мы должны включить конечные 0?N
? Если так, то до N = 49. Или что-то еще?Ответы:
Pyth,
605758 байтовИспытательный жгут
Это довольно просто - вычислить число Пи, ряд Фибоначчи и композиты, округлить до C (n) цифр, дополнить до C (n) цифр плюс расположение цифр десятичной точки.
А (п):
hu,eGsGQjT7
В (п):
e.ftPZQ)
С (п):
e/u+/*GHhyHy^TQr99ZZT
60 -> 57: Очистить n = 1 особый случай в вычислениях пи.
57 -> 58: Не использовалось достаточно высокое прецизионное значение для pi для всего входного диапазона - увеличено с 99 итераций до 1000 итераций.
Примечание по округлению: при этом используется система округления Python «ближайшая четность», а не OP, заданная система «к бесконечности». Однако разница имеет значение только в том случае, если цифры, следующие сразу за точкой округления
5000...
, например, 1,25 округлены до 1 цифры. Я проверил входной диапазон, и этого никогда не происходит, поэтому всегда возвращается правильный результат.источник
PowerShell,
420 байт (айыыыыыыы)378 байтСпасибо isaacg за сохранение 41 байта, за вычисление, как вопрос выполняет округление. Означает, что я не должен был включать ужасные
[MidpointRounding]::AwayFromZero
и не нужно явно использовать как[double]
.Это было очень весело!
Expanded:
Рекурсия в PowerShell ... медленная, скажем так, поэтому мы должны построить
A(N)
другое направление и сохранить его в массиве, а затем проиндексировать.OLD
Кроме того, святая корова, требования к выходу убили это. По умолчанию PowerShell использует округление до ближайшего округления / k / a банкира, что требует использования чрезвычайно многословного
[MidpointRounding]::AwayFromZero
для переключения стилей округления . Кроме того, нам нужно дополнить конечные нули, если таковые имеются. Эти два требования объединены, чтобы превратить последние пару строк из 20 байтов[math]::Round($r,$q)
в 102 байта (от$s=""
до+$s)
) ... вау.источник
[MidpointRounding]::AwayFromZero
одиночку почти слишком хороши / плохи, чтобы быть правдой ... =)Javascript (ES6), 302 байта
Одно слово: незаконченное.
Первые 49 цифр числа пи хранятся в строке, а две другие последовательности генерируются автоматически. Это было в гольф примерно на полпути; Я (почти) уверен, что смогу выжать из нее еще 50 байтов.
Работает для всех тестовых случаев, и должен работать для остальных. Сбои при значениях больше 49 или меньше 0 (в любом случае, они никогда не должны сталкиваться с этими ситуациями). Мне особенно нравится его результат для 0:
источник
Октав,
276236 байтПрежде всего, я подумал, что было бы здорово использовать некоторую неограниченную точность в этих математических инструментах (и освежить некоторые знания об этом), поэтому я начал писать некоторые алгоритмы, а затем, наконец, обнаружил, что
pi
значение не настолько точно, что я Придется снова использовать массив. Итак, еще раз, нет большого успехаВсе еще вполне читабельно, не так ли?
использование
скопировать-вставить функцию в октаву, вызвать функцию
c
с аргументом требуемого значения:Оптимизации:
endif
,endfor
и аналогичные сend
которой работает таким же образом ,i
на единицу, сохранение одного байтаnum2str(str2num(p(A)))
ерунду :)источник
end
неendif
так много сохраненных байтов. Если вы посчастливилось иметь символический набор инструментов для MATLAB, вы можете использовать ,vpa
чтобы получить достаточное количество десятичных точек для пи:vpa(sym(pi),49)
. У меня его нет на этом ноутбуке, так что я не уверенsym
, нужно ли там, но в любом случае следует сохранить немало байтов =) И читабельность не обязательно хорошая вещь в коде гольф =)while
изendwhile
и аналогичные работают отлично, поэтому я обновляю ответ,