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
Ми генеруємо Fibonnacis, поки не отримаємо один більший, ніж n
. На щастя, цей алгоритм, природно, відслідковує попередні Fibonnaci, тому ми їх кидаємо в масив і використовуємо наш попередній сортування відстані. Зараз у нас є найближчі Фібонначі.
+++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), тому, сподіваюся, достатньо двох точних точок.
Моя перша тріщина при використанні GolfScript, я впевнений, що є можливість для вдосконалення!