Яке середнє число n, найближче простим простим до n, квадрат n та найближче число Фібоначчі до n?


13

Це математична проблема, яка ставить під сумнів дуже багато речей, що робить її досить складною, і, як ви могли здогадатися, це гольф з кодом, тому він повинен бути як можна коротшим.

Введення , nє будь-який ціле число (має принаймні підтримки цілих чисел, але не обов'язково повинні бути обмежені). Вихід є середнім з:

  • n
  • Площа с n
  • Найближче просте число до n
  • Найближче число до nпослідовності Фібоначчі

Незабаром програма повинна друкувати на стандартний висновок каналу на результат в (n+(n*n)+closestPrime(n)+closestFib(n))/4.

Вам не потрібно дбати про можливі переливи тощо. Нормальна точність з плаваючою точкою також нормальна.

Те, як вводиться вхід, повністю залежить від вас. Найкоротша програма (у символах) виграє, як завжди з кодовими гольфами.

У випадку, якщо краватка виникає, коли ви шукаєте найближчих, виберіть одне з наступних:

  1. Підніматися
  2. Спускайся
  3. Вибирайте один випадковим чином

Визначте "найближчий". Як розриваються зв’язки?
Пітер Тейлор

@ Peter Taylor: рухайтеся вгору, вниз або вибирайте його випадковим чином.
Анто

Дайте зразок вводу / виводу для перевірки рішень.
fR0DDY

Коли ви говорите "не слід обмежуватись", що ще потрібно підтримувати? Або ви мали на увазі "не потрібно обмежуватися"?
Тімві

@Timwi! "Не потрібно", вибачте, це виправить
Анто

Відповіді:


10

Пітон 160 символів

p=lambda n:any(n%x<1for x in range(2,n))
N=input()
a=0;b=1
while b<N:a,b=b,a+b
c=d=N
while p(c)and p(d):c-=1;d+=1
print (N+N*N+[b,a][2*N-a-b<0]+[c,d][p(c)])/4.0

Невелике пояснення щодо найближчої частини Fib:

Коли цикл while закінчується a, менший за N і b дорівнює або більший за N. Тепер [b,a][2*N-a-b<0]частина. Подивіться на це як [b, a] [(Na) - (bN)]. (Na) - різниця між N і a і аналогічно (bN) різниця між b і N. Якщо різниця між цими двома меншою за 0, це означає, що a ближче до N і навпаки.


Чи можете ви додати пояснення, чому це працює?
Кіхотично

@Debanjan Щось конкретне, чого ти не хочеш знати? Я вважав, що все пояснюється само собою. :)
fR0DDY

Просто шматочок найближчої частини фіб [b,a][2*N-a-b<0]:)
Кіхоти

7

GolfScript, 59 символів

~:N..*.,2>{:P{(.P\%}do(!},{{N-.*}$0=}:C~[1.{.@+.N<}do]C+++4/

Цей сценарій не відповідає деяким вимогам:

  • Він працює правильно лише для входів n >= 2, інакше він виходить з ладу.
  • Вихід обрізається цілим числом.
  • Жахлива продуктивність для будь-яких помірно великих розмірів n

Короткий опис коду:

  1. ~:N..*Вхід зберігається в N, і ми натискаємо і обидва, nі квадрат n*nвідразу.
  2. .,2>Ми створимо список простих чисел, фільтруючи масив [2..n*n]. Ми використовуємо наш попередній обчислення n*nяк (дуже погано!) Верхньої межі для пошуку простого числа, що перевищує n.
  3. {:P{(.P\%}do(!},Наш попередній масив фільтрується пробним поділом. Кожне ціле число P тестується на кожне ціле число [P-1..1].
  4. {{N-.*}$0=}:C~Сортує попередній масив на основі відстані до nта захоплює перший елемент. Зараз у нас найближчий розквіт.
  5. [1.{.@+.N<}do]CМи генеруємо Fibonnacis, поки не отримаємо один більший, ніж n. На щастя, цей алгоритм, природно, відслідковує попередні Fibonnaci, тому ми їх кидаємо в масив і використовуємо наш попередній сортування відстані. Зараз у нас є найближчі Фібонначі.
  6. +++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, я впевнений, що є можливість для вдосконалення!


7
Знаєте, при поділі на 4 це не страшно дивно, ви отримуєте четверті ;-)
Joey

... справді! +1;)
Майк Уельський

3

JavaScript, 190

function n(n)
{z=i(n)?n:0
for(x=y=n;!z;x--,y++)z=i(x)?x:i(y)?y:0
for(a=b=1;b<n;c=a+b,a=b,b=c);
return(n+n*n+(2*n-a-b<0?a:b)+z)/4}
function i(n)
{for(j=2;j<n;j++)
if(!(n%j))return 0
return 1}

[257]

function n(n)
{return(n+n*n+p(n)+f(n))/4}
function p(n)
{if(i(n))return n
for(a=b=n;;a--,b++){if(i(a))return a
if(i(b))return b}}
function i(n)
{for(j=2;j<n;j++)
if(!(n%j))return 0
return 1}
function f(n)
{for(a=b=1;b<n;c=a+b,a=b,b=c);
return 2*n-a-b<0?a:b}

Без стиску:

function closest( a, b, c )
{
  return 2*a-b-c < 0 ? b : c;
}

function closestPrime( n )
{
  a=b=n;
  if (isPrime( n ) ) return n;
  while ( true )
  {
    a-=1;
    b+=1;
    if (isPrime(a))return a;
    if (isPrime(b))return b;
  }
}

function isPrime( n )
{
  for (i=2;i<n;i++)
  {
    if ( !( n % i ) ) return false;
  }
  return true;
}

function closestFib( n )
{
  for(fib1=0,fib2=1;fib2<n;fib3=fib1+fib2,fib1=fib2,fib2=fib3);
  return closest( n, fib1, fib2 );
}

function navg(n)
{
  n2 = n*n;
  np = closestPrime( n );
  nf = closestFib( n );
  return ( n + n2 + np + nf ) / 4;
}

Що стосується вашої найближчої основної функції: я думаю, ви зможете заощадити простір, якщо ви просто використовуєте a=0та збільшуєте позитивне зростання. Замість перевірки isPrimeна aта b, просто перевірити isPrime(n+a)і isPrime(n-a). Ви, напевно, могли збити це все в одній божевільній потрійній заяві, але я страшенний JavaScript.
Містер Лама

Далі , здається, працює дуже добре: function closestPrime(n,o){return isPrime(n+o)?n+o:isPrime(n-o)?n-o:closestPrime(n,o+1);}. Зателефонуйте як, closestPrime(n,0)і це все вийде. Скоротіть за потребою.
Містер Лама

1

Математика, 70 69 байт

Один байт збережений завдяки Sp3000 (іноді вбудовані модулі - не найкращий шлях).

((n=#)+#^2+(f=#&@@#@Range@Max[1,2n]~Nearest~n&)@Prime+f@Fibonacci)/4&

Це визначає неназвану функцію, яка приймає ціле число і виробляє точне середнє значення як раціональне число. У випадку зв’язків вибирається менший номер прості / Фібоначчі.

Це дуже неефективно для великих входів, оскільки воно фактично генерує перші 2nпрайми та числа Фібоначчі до вибору найближчих.


#&@@#.. А?
seequ

@Sieg Починаючи справа: #це аргумент чистої функції (of f). У цьому випадку це фактично сама функція, оскільки fзастосовується до Primeта Fibonacci. Отже, це #@Range@...застосовує дану функцію до кожного цілого числа в діапазоні. Тоді #&@@це лише гольф спосіб вилучення першого елемента списку. Це працює, застосовуючи #&до списку, що є функцією, яка лише повертає перший аргумент.
Мартін Ендер

0

Q, 119

Не найефективніший.

{%[;4]x+(x*x)+((*:)a(&)b=min b:abs x-a:{x,sum -2#x}/[x-2;1 1])+(*:)d(&)e=min e:x-d:(&)1={(min x mod 2_(!)x)}each(!)x+2}

0

МАТЛАБ 88 символів

C=@(F)(F(abs(F-n)==min(abs(F-n))));(n+n^2+C(primes(n*2))+C(round(1.618.^(1:n)/2.236)))/4

n - ціле число

Працює з не цілими числами, наскільки я тестував, він працює і з дуже великою кількістю, також працює досить чортово швидко.


0

Scala 299

object F extends App{type I=Int
def f(n:I,b:I=1,a:I=1):I=if(a>=n)if(a-n>n-b)b else a else f(n,a,b+a)
def p(n:I)=(2 to n-1).exists(n%_==0)
def i(n:I,v:I):Int=if(!p(n+v))n+v else i(n+v,v)
val a=readInt
println(({val p=Seq(-1,1).map(i(math.max(a,3),_))
if(a-p(0)>p(1)-a)p(1)else p(0)}+f(a)+a+a*a)/4.0)}

Тест та виклик:

a  a² nP(a) nF  ∑   /4.0 
------------------------
-2  4   2   1   5   1.25
-1  1   2   1   3   0.75
0   0   2   1   3   0.75
1   1   2   1   5   1.25
2   4   2   2   10  2.5
3   9   2   3   17  4.25
4   16  3   5   28  7.0
5   25  3   5   38  9.5

Питання говорить про те, any Integerале проблема не є цікавою для значень нижче 0. Однак - як нам почати? У 0? На 1? І який наступний прем'єр для 11? 11 себе?

Ідея дозволити наступний більший чи менший у разі нерівності погана, оскільки це робить порівняння непотрібним складним. Якщо ваші результати відрізняються, вони можуть обрати іншу фібру, іншу прем'єр, іншу фіб та іншу прем'єр-міністр, або ваш помиляється, або результат другої людини невірний, або це комбінація: інший вибір, але неправильно, хоча, можливо, обидва неправильні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.