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

Python 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の差です。これら2つの差が0より小さい場合、aはNに近く、逆も同様です。


これがなぜ機能しているのか説明を追加できますか?
キクソチック

@Debanjan何か特別なことはありませんか?私はすべてが一目瞭然だと思った。:)
fR0DDY

最も近いfib部分のほんの少し[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]C1を超えるまでフィボナシスを生成しnます。幸いなことに、このアルゴリズムは以前のFibonnaciを自然に追跡するので、それらを配列に入れて、以前の距離ソートを使用します。今、最も近いフィボナッチがあります。
  6. +++4/平均。GolfScriptはfloatをサポートしていないため、結果は切り捨てられることに注意してください。

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はフィボナッチ数と見なされます。結果は、最後に固定小数点演算で計算されます。興味深いことに、結果は常に4分の1(0、.25、.5、.75)であるように見えるため、小数点以下2桁の精度で十分であることを願っています。

GolfScriptを使用した最初のクラックは、改善の余地があると確信しています!


7
4で割ると、4分の1が得られるのは驚くほどのことではありません;
ジョーイ

...確かに!+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、積極的に増加すればスペースを節約できると考えています。and をチェックする代わりにisPrimeaand bをチェックisPrime(n+a)isPrime(n-a)ます。おそらくそれを1つのクレイジーな3項ステートメントにマッシュすることができますが、私はjavascriptがひどいです。
ミスターラマ

以下はかなりうまく動作するようです:function closestPrime(n,o){return isPrime(n+o)?n+o:isPrime(n-o)?n-o:closestPrime(n,o+1);}。としてそれを呼び出すとclosestPrime(n,0)、それ自体がうまくいくでしょう。必要に応じて短くします。
ラマ氏

1

Mathematica、70 69バイト

Sp3000のおかげで1バイト節約されました(組み込みが最適な方法ではない場合があります)。

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

これは、整数を取り、有理数として正確な平均を生成する名前のない関数を定義します。同数の場合、より小さい素数/フィボナッチ数が選択されます。

これは2n、最も近いものを選択する前に最初の素数とフィボナッチ数を実際に生成するため、大きな入力に対しては非常に非効率的です。


#&@@#..え?
seequ

@Sieg右から始まる:#は(のf)純関数の引数です。ので、この場合には、それは、実際には機能そのものだfに適用されるPrimeFibonacci。その#@Range@...ため、指定された関数が範囲内の各整数に適用されます。そして、#&@@ちょうどあるgolfed方法リストの最初の要素を抽出します。#&リストに適用することで機能します。リストは、最初の引数を返すだけの関数です。
マーティンエンダー

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

MATLAB 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自体?

ネクタイの場合に次に大きいまたは小さいものを許可するという考えは、それが不必要な比較を困難にするため、悪いです。結果が異なる場合、他のfib、他の素数、他のfib、他の素数を選択したか、あなたの結果が間違っているか、他の人の結果が間違っているか、組み合わせです:間違っていますが、おそらく両方とも間違っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.