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, я уверен, что есть возможности для улучшения!