C(N)桁でA(N)/ B(N)を計算する


15

ABおよびの3つの数値シーケンスを考えCます。

  • Af(n) = f(n-1)+f(n-2)で始まる再帰関係に基づくシーケンスf(1) = 3, f(2) = 4。したがって、シーケンスは次のように始まります。3 4 7 11 18 29 47 76 ...
  • B合成数、つまり素数(または1)ではないすべての整数:4 6 8 9 10 12 14 15 16 ...
  • C:Piの数字: 3 1 4 1 5 9 2 6 5 ...

正の整数を考えるとN < 50、どちらかの関数の引数やSTDINとして、分数の小数の値を返すA(N)/B(N)C(N)小数点以下の桁数。丸めの通常の規則が適用されます(N + 1番目の桁が5以上の場合は切り上げ)。のN桁目piがゼロの場合、整数を出力する必要があります。科学表記法/標準形式は、1000を超える数に対応しています。

これはコードゴルフであるため、バイト単位の最短回答が優先されます。

いくつかの例:

N = 1: 0.750
N = 2: 0.7
N = 3: 0.8750
N = 4: 1.2
N = 6: 2.416666667
N = 10: 11.056
N = 20: 764.8750

もちろん、標準コードのゴルフ規則が適用されます。

この機能は、最新のラップトップで2分以内に終了する必要があります。


C(n)数字を言うとき、末尾の0を含める必要がありますか?
マルティセン

制限時間はどの入力に適用されますか?
デニス

@デニス、あなたはどちらを意味しNますか?もしそうなら、最大N =49。または他に何か?
スティーヴィーグリフィン

JavaScriptの浮動小数点の精度は16に制限されています。これを過ぎると、不正確な結果が得られます。これでいいですか?
ダウンゴート

1
@vihan私のソリューション(未公開ATM)は、piの最初の49桁を文字列に保存します。心配な場合は、結果に9桁を超える精度は必要ありません。
ETHproductions

回答:


9

ピス、60 57 58バイト

.[K`.Rchu,eGsGQjT7e.ftPZQ)Je/u+/*GHhyHy^TQr^T3ZZT\0+xK\.hJ

テストハーネス

それは非常に簡単です-円周率、フィボナッチ数列、および複合体を計算し、C(n)桁に丸め、C(n)桁に加えて小数点桁の位置を埋めます、完了です。

A(n): hu,eGsGQjT7

B(n): e.ftPZQ)

C(n): e/u+/*GHhyHy^TQr99ZZT

60-> 57:pi計算のn = 1の特殊なケースをクリーンアップしました。

57-> 58:入力範囲全体でpiに十分な精度を使用していませんでした-99反復が1000反復に増加しました。

丸めに関する注意:これは、OPが指定する「無限に向かって」システムではなく、Pythonの「最も近い偶数」丸めシステムを使用します。ただし、丸め点の直後の桁がである5000...場合(例えば、1.25が1桁に丸められた場合)にのみ違いが問題になります。入力範囲を確認しましたが、これは決して発生しないため、常に正しい結果が返されます。


2

PowerShell、420バイト(ayyyyyyyy) 378バイト

param($n);[int[]]$p="03141592653589793238462643383279502884197169399375"-Split'';$a=@(0,3,4);for($i=3;$i-lt50;$i++){$a+=$a[$i-1]+$a[$i-2]};$c=[char[]]"00001010111010111010111011111010111110111010111011111011111010111110111";$b=@(0);for($i=4;$i-le70;$i++){if($c[$i]-eq'1'){$b+=$i}};[double]$r=$a[$n]/$b[$n];$q=$p[$n+1];$s="";(0..($q-1))|%{$s+="0"};([math]::Round($r,$q,[MidpointRounding]::AwayFromZero)).ToString("0.$s")

質問の丸め方を計算してくれた41バイトを節約してくれたisaacgに感謝します。恐ろしいものを含める[MidpointRounding]::AwayFromZero必要がなく、明示的にキャストする必要がないことを意味します[double]

これはとても楽しかったです!

拡張:

# Take input N
param($n)

# First digits of pi, stored as integer array
[int[]]$p="03141592653589793238462643383279502884197169399375"-Split''

# Fibonacci sequence A(N)
$a=@(0,3,4)
for($i=3;$i-lt50;$i++){
  $a+=$a[$i-1]+$a[$i-2]
}

# Zero-indexed bitmask for if the n-th integer is composite (1) or not (0)
$c=[char[]]"00001010111010111010111011111010111110111010111011111011111010111110111"

# Populate B(N) as an array using the $c mask
$b=@(0)
for($i=4;$i-le70;$i++){
  if($c[$i]-eq'1'){
    $b+=$i
  }
}

# Calculation Time!
$r=(a($n))/$b[$n]

# A small golf, as $p[$n+1] gets used a couple times
$q=$p[$n+1]

# Need to generate a string of zeroes for padding
$s=""
(0..($q-1))|%{$s+="0"}

# Round the number, then send it to a string so we get the necessary number of zeroes
([math]::Round($r,$q)).ToString("0.$s")

PowerShellの再帰は...遅いのでA(N)、別の方向を構築して配列に格納し、インデックスを作成する必要があります。


古い

また、聖なる牛、出力要件はこれを殺しましたか。PowerShellはデフォルトで、最も近いa / k / a銀行家の丸めに丸めます。これは、丸めスタイル[MidpointRounding]::AwayFromZeroを切り替えるために非常に冗長なものを使用する必要があります。さらに、後続のゼロがある場合は、それを埋め込む必要があります。これらの2つの要件がから行の最後のカップルを回すために組み合わせる20バイト [math]::Round($r,$q)102バイト(から$s=""+$s)すごいです...)。


素晴らしい説明/コメント!以下のための32文字[MidpointRounding]::AwayFromZeroだけでは本当であることはほぼあまりにも良い/悪いです... =)
Stewieグリフィン

1
回答の丸めに関するメモを参照してください。PowerShellのデフォルトの丸めは問題ないはずです。
isaacg

1

Javascript(ES6)、302バイト

一言:未完成。

x=>{a=[0,3,4],b=[0],c='03141592653589793238462643383279502884197169399375';for(i=1;i<x;a[i+2]=a[i]+a[++i]);for(i=1,p=[];++i<70;v=p.every(x=>i%x),(v?p:b).push(i));r=''+Math.round(a[x]/b[x]*(l=Math.pow(10,c[x])))/l;if(x==33)return r;r.indexOf`.`<0&&(r+='.');while(!r[r.indexOf`.`+ +c[x]])r+='0';return r}

piの最初の49桁は文字列に格納され、他の2つのシーケンスは自動生成されます。これは約半分でゴルフされています。(ほぼ)そこからさらに50バイトを圧縮できると確信しています。

すべてのテストケースで機能し、残りでも機能するはずです。49を超える、または0未満でクラッシュします(とにかくこれらの状況に遭遇することはありません)。私は特に0の結果が好きです:

NaN.

なぜこれが未完成なのですか?
ベータ崩壊

@BetaDecay私はまだゴルフを終えていないことを意味しました。時間があり次第です。
ETHproductions

1

オクターブ、 276 236バイト

まず、これらの数学ツールで無限の精度を利用すること(そしてそれに関する知識を更新すること)がクールだと思ったので、いくつかのアルゴリズムを書き始め、最終的にpi値がそれほど正確ではないことがわかりました配列を再度使用する必要があります。繰り返しますが、大きな成功はありません。

function c(A)p="3141592653589793238462643383279502884197169399375";f=ones (1,50);f(1)=3;f(2)=4;for i=3:53f(i)=f(i-1)+f(i-2);end
i=0;x=1;while i<A
x++;for j=2:x/2
if mod(x,j)==0 i++;break;end end end
printf(["%." p(A) "f\n"],f(A)/x);end

まだかなり読みやすいですよね?

使用法

関数をオクターブにコピーして貼り付けc、必要な値の引数で関数を呼び出します。

>>> c(1)
0.750
>>> c(49)
407880480.04348

最適化:

  • 代替endifendforおよび同様endに機能する類似
  • 変数iを1つ減らして1バイト節約
  • num2str(str2num(p(A)))ナンセンスを削除:)

Octaveソリューションを投稿したことが気に入っています(私はMATLABの男です!)。このコードはOctaveのみであり、MATLABではないことに注意してください。MATLABはend、ではなくを使用するendifため、多くのバイトが保存されます。MATLABのシンボリックツールボックスも使用vpaしている場合は、pi:に十分な小数点を取得するために使用できますvpa(sym(pi),49)。私はこのラップトップに持っていないので、そこにsym必要かどうかはわかりませんが、とにかくかなりのバイトを節約する必要があります=)そして、ゴルフはコードで必ずしも良いことではありません=)
Stewie Griffin

x ++もMATLABコマンドではありません。この2つの間に大きな違いがあることは知りませんでした... IMO、そうではないはずです。Octaveで書かれたすべてのコードは、MATLABに移植可能であるべきだと思います(しかし、MATLABにはより多くのオプションがあるため、必ずしもその逆ではありません)。
スティーヴィーグリフィン

編集を承認しました。この辺にはmatlabがないので、テストできませんでした。私はオクターブでより多くのパイ小数を取得する解決策を探していましたが、残念なことに配列よりも短いものはありませんでした。しかし、省略whileendwhile、同様の作品はうまくいくので、私は少数の少ない文字で答えを更新しています:)
Jakuje
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.