GolfScript, 59 символов
~:N..*.,2>{:P{(.P\%}do(!},{{N-.*}$0=}:C~[1.{.@+.N<}do]C+++4/
Этот скрипт не удовлетворяет некоторым требованиям:
- Работает корректно только для входов
n >= 2
, в противном случае происходит сбой.
- Выходные данные усекаются до целого числа.
- Ужасная производительность для любого умеренно большого
n
Краткое описание кода:
~:N..*
Ввод сохраняется в N, и мы сразу же нажимаем n
и квадрат, и квадрат n*n
.
.,2>
Мы сгенерируем список простых чисел путем фильтрации массива [2..n*n]
. Мы использовали наше предыдущее вычисление n*n
в качестве (очень плохой!) Верхней границы для нахождения простого числа, большего чем n.
{:P{(.P\%}do(!},
Наш предыдущий массив фильтруется пробным делением. Каждое целое число P проверяется на каждое целое число [P-1..1].
{{N-.*}$0=}:C~
Сортирует предыдущий массив по расстоянию до n
и получает первый элемент. Теперь у нас есть ближайший штрих.
[1.{.@+.N<}do]C
Мы генерируем Фибоначчи, пока не получим n
. К счастью, этот алгоритм естественным образом отслеживает предыдущие Фибоначчи, поэтому мы бросаем их обоих в массив и используем нашу раннюю сортировку по расстоянию. Теперь у нас есть самые близкие Фибоначчи.
+++4/
Средний. Обратите внимание, что GolfScript не поддерживает поплавки, поэтому результат усекается.
GolfScript, 81 символ
Вот вариант, который отвечает всем требованиям.
~:N..*2N*,3,|2,^{:P{(.P\%}do(!},{{N-.*}$0=}:C~[0.1{.@+.N<}do]C+++100:E*4/.E/'.'@E%
Чтобы обеспечить правильное поведение для n<2
, я избегаю 2<
(сбой, когда массив маленький), и вместо этого использую 3,|2,^
. Это гарантирует, что массив-кандидат будет именно [2]
тогда, когда n < 2
. Я изменил верхнюю границу для следующего простого числа с n*n
на 2*n
( постулат Бертрана ). Также 0 считается числом Фибоначчи. Результат рассчитывается по математике с фиксированной точкой в конце. Интересно, что кажется, что результат всегда в четвертых (0, .25, .5, .75), поэтому я надеюсь, что 2 десятичных знака точности достаточно.
Моя первая попытка использования GolfScript, я уверен, что есть возможности для улучшения!