N, n'ye en yakın asal, n'nin karesi ve n'ye en yakın Fibonacci sayısı nedir?


13

Bu, oldukça fazla şeyi sorgulayan, oldukça zorlaştıran bir matematik problemidir ve tahmin edebileceğiniz gibi, bir kod golfüdür, bu yüzden mümkün olduğunca kısa olmalıdır.

Giriş , nherhangi bir tam sayı sayısı (en destek tamsayı az, ancak gerek sınırlı olmamalıdır). Çıkış olan ortalama bir:

  • n
  • Meydanı n
  • En yakın asal sayı n
  • nFibonacci dizisindeki en yakın sayı

Kısaca, program olmalıdır kanal standart çıkışa yazdırmak sonucu arasında (n+(n*n)+closestPrime(n)+closestFib(n))/4.

Sen yok olası taşmalar vb Normal duyarlılığında umurumda zorunda da Tamam.

Giriş yapma şekli tamamen size kalmış. Kod golflerinde her zaman olduğu gibi en kısa program (karakterlerle) kazanır.

En yakınını ararken bir kravat oluşması durumunda, aşağıdakilerden birini seçin:

  1. Yukarı git
  2. Aşağı in
  3. Rastgele birini seçin

"En yakın" ı tanımlayın. Bağlar nasıl kopar?
Peter Taylor

@Peter Taylor: Yukarı, aşağı hareket edin veya rastgele birini seçin.
Anto

Çözümleri doğrulamak için bazı örnek giriş / çıkışları verin.
fR0DDY

“Sınırlandırılmamalı” derseniz, başka neler desteklenmelidir? Yoksa “sınırlandırılması gerekmiyor” mu demek istediniz?
Timwi

@Timwi! "gerek yok", üzgünüm, düzeltir
Anto

Yanıtlar:


10

Python 160 Karakter

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

En yakınFib kısmı hakkında küçük bir açıklama:

While döngüsü sona erdiğinde a, N'den küçüktür ve b, N'ye eşit veya N'den büyüktür. Şimdi [b,a][2*N-a-b<0]parça. Şuna [b, a] [(Na) - (bN)] olarak bakın. (Na), N ve a arasındaki farktır ve benzer şekilde (bN) b ve N arasındaki farktır. Bu ikisi arasındaki fark 0'dan küçükse a'nın N'ye daha yakın olduğu ve bunun tersi olduğu anlamına gelir.


Bunun neden çalıştığına dair bir açıklama ekleyebilir misiniz?
Quixotic

@Debanjan Özel bir şey, bilmiyor musun? Her şeyin kendini açıklayıcı olduğunu düşündüm. :)
fR0DDY

En yakın fib parçası sadece biraz [b,a][2*N-a-b<0]:)
Quixotic

7

GolfScript, 59 karakter

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

Bu komut dosyası bazı gereksinimleri karşılamıyor:

  • Yalnızca girişler için düzgün çalışır n >= 2, aksi takdirde kilitlenir.
  • Çıktı bir tamsayıya kısaltıldı.
  • Orta derecede büyük olan her şey için korkunç performans n

Kodun kısa bir açıklaması:

  1. ~:N..*Giriş N'de saklanır ve her ikisini nde kareyi n*nhemen iteriz.
  2. .,2>Diziyi filtreleyerek bir primler listesi oluşturacağız [2..n*n]. Önceki hesaplamamızı n*nn'den büyük bir asal bulmak için (çok kötü!) Bir üst sınır olarak kullanıyoruz.
  3. {:P{(.P\%}do(!},Önceki dizimiz deneme bölümüne göre filtrelendi. Her tamsayı P her tamsayıya karşı test edilir [P-1..1].
  4. {{N-.*}$0=}:C~Önceki diziyi mesafeye göre sıralar ve nilk öğeyi yakalar. Şimdi en yakın prime sahibiz.
  5. [1.{.@+.N<}do]CBiz daha büyük olana kadar Fibonnacis üretiyoruz n. Neyse ki, bu algoritma doğal olarak önceki Fibonnaci'yi takip ediyor, bu yüzden ikisini de bir diziye atıyoruz ve önceki mesafe sıralamamızı kullanıyoruz. Şimdi en yakın Fibonnaci'ye sahibiz.
  6. +++4/Ortalama. GolfScript'in şamandıralar için desteği olmadığını unutmayın, bu nedenle sonuç kesilir.

GolfScript, 81 karakter

İşte tüm gereksinimleri karşılayan bir varyant.

~:N..*2N*,3,|2,^{:P{(.P\%}do(!},{{N-.*}$0=}:C~[0.1{.@+.N<}do]C+++100:E*4/.E/'.'@E%

Uygun davranış sağlamak için n<2, kaçının 2<(dizi küçük olduğunda çöküyor) ve bunun yerine kullanın 3,|2,^. Bu baş adayı dizisi adildir emin olur [2]zaman n < 2. Ben üst sonraki asal gitmekte değişti n*nüzere 2*n( Bertrand'ın önermesiyle ). Ayrıca, 0 bir Fibonnaci sayısı olarak kabul edilir. Sonuç, sonunda sabit nokta matematiğinde hesaplanır. İlginçtir, sonuç her zaman dördüncü sıradadır (0, .25, .5, .75), bu yüzden umarım 2 ondalık kesinlik yeri yeterlidir.

GolfScript kullanmaktaki ilk çatlak, eminim iyileştirme için yer var!


7
Bilirsiniz, 4'e böldüğünüzde dördüncü olsun ;-) şaşırtıcı
Joey

...aslında! +1;)
Mike Welsh

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}

sıkıştırılmamış:

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;
}

En yakın temel işleviniz için: Adil kullanırsanız a=0ve artırarak kullanırsanız yerden tasarruf edebilirsiniz . Bunun yerine kontrol etmeyi isPrimeiçin ave bsadece kontrol isPrime(n+a)ve isPrime(n-a). Muhtemelen hepsini çılgın üçlü bir ifadeye ezebilirsiniz, ama javascript ile korkunçum.
Bay Llama

Aşağıdaki oldukça iyi çalışması gibi görünüyor: function closestPrime(n,o){return isPrime(n+o)?n+o:isPrime(n-o)?n-o:closestPrime(n,o+1);}. Olarak adlandırın closestPrime(n,0)ve kendi kendine çalışacaktır. Gerektiği kadar kısaltın.
Bay Llama

1

Mathematica, 70 69 bayt

Sp3000 sayesinde bir bayt kaydedildi (bazen yerleşik olanlar en iyi yol değildir).

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

Bu, tamsayı alan ve tam ortalamayı rasyonel bir sayı olarak üreten, adlandırılmamış bir işlevi tanımlar. Bağlar söz konusu olduğunda, daha küçük asal / Fibonacci sayısı seçilir.

Bu büyük girdiler için çok verimsizdir, çünkü aslında 2nen yakını seçmeden önce ilk asal sayıları ve Fibonacci sayılarını üretir .


#&@@#.. Ha?
seequ

@Sieg Sağdan başlayarak: #saf işlevin (/ f) argümanıdır . Çünkü bu durum, bu aslında bir işlev kendisidir fuygulanır Primeve Fibonacci. Böylece #@Range@...verilen fonksiyon aralıktaki her tamsayıya uygulanır. Sonra #&@@sadece bir listenin ilk elemanını çıkarmak için golf bir yoludur . Yalnızca #&ilk argümanını döndüren bir işlev olan listeye başvurarak çalışır .
Martin Ender

0

Q, 119

En verimli değil.

{%[;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

MATLAB 88 Karakter

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 tamsayı

Tam sayı olmayanlarla çalışır, test ettiğim kadarıyla çok büyük sayılarla da çalışır, çok hızlı bir şekilde çalışır.


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)}

Test ve çağırma:

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

Soru hakkında konuşuyor any Integerama sorun 0'ın altındaki değerler için ilginç değil. Ancak - nasıl başlayacağız? 0'da mı? 1'de? Ve 11 için bir sonraki başbakan nedir? 11 kendisi?

Beraberlik durumunda bir sonraki büyük veya daha düşük seviyeye izin verme fikri kötüdür, çünkü karşılaştırmayı gereksiz hale getirir. Sonuçlarınız farklıysa, diğer fiberi, diğer prime, diğer fib ve diğer prime'yi seçtiniz veya sizinki yanlış veya diğer kişinin sonucu yanlış veya bir kombinasyon: farklı seçim, ancak yanlış olsa da, belki ikisi de yanlış.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.