高精度の金属手段


13

バックグラウンド

金属の手段は、有名で始まる中庸、すべての自然数(正の整数)に対して定義され、それぞれが無理数定数(それは無限の非繰り返し小数拡張を有する)です。

自然数の場合、金属平均は二次方程式の根です

根は常に

しかし、金属の平均は通常、正の根として与えられます。したがって、この質問では、次のように定義されます。

以下のために結果的に有名な黄金比です。


チャレンジ

コードは、nとpの2つの入力を取る必要があります(順序は一貫している限り重要ではありません)

  • nは、どの金属の平均を示す自然数です
  • pは、小数点以下の桁数を示す自然数です。

コードは、n番目のメタリック平均を小数点以下p桁の精度で出力する必要があります。

有効

1〜65,535のnとpの値で機能する場合、コードは有効です。

次の形式で小数を出力する必要があります

桁。桁(スペースなし)

たとえば、小数点以下9桁の黄金平均は

1.618033988

最後の数字は、長い10進数展開で表示されるため、丸めずに表示します。ゴールデン平均の次の数字は7ですが、例の最後の8は9に切り上げられません。

10進数の桁数はpでなければなりません。つまり、後続ゼロも含める必要があります。

フォームの回答

有効ではありません-10進展開を使用する必要があります。

最大1つの先行改行と最大1つの後続改行を出力できます。スペース、または数字とシングルポイント/フルストップ/ピリオド以外の文字を出力することはできません。

スコア

これは標準的なコードゴルフです。スコアはコードのバイト数です。


リーダーボード

Martinのリーダーボードスニペットを使用)

回答:


17

DC、12

?kdd*4+v+2/p
  • ? nとpをスタックにプッシュします
  • k 精度をpに設定します
  • dd nを2回複製(合計3つのコピー)
  • * n * nを掛ける
  • 4+ 4を追加
  • v 平方根を取る
  • + nを追加(スタックの最後のコピー)
  • 2/ 2で割る
  • p 印刷する

テストケース:

$ dc -f metalmean.dc <<< "1 9"
1.618033988
$

7
仕事に最適なツール。
デニス

5
@Dennisは、CJamが他の何かの3倍近い長さを持つのは初めてです;-)
デジタルトラウマ

2

R、116バイト

library(Rmpfr);s=scan();n=mpfr(s[1],1e6);r=(n+(4+n^2)^.5)/2;t=toString(format(r,s[2]+2));cat(substr(t,1,nchar(t)-1))

これは、STDINから2つの整数を読み取り、結果をSTDOUTに出力します。オンラインで試すことができます

Ungolfed +説明:

# Import the Rmpfr library for arbitrary precision floating point arithmetic
library(Rmpfr)

# Read two integers from STDIN
s <- scan()

# Set n equal to the first input as an mpfr object with 1e6 bits of precision
n <- mpfr(s[1], 1e6)

# Compute the result using the basic formula
r <- (n + sqrt(4 + n^2)) / 2

# Get the rounded string representation of r with 1 more digit than necessary
t <- toString(format(r, s[2] + 2))

# Print the result with p unrounded digits
cat(substr(t, 1, nchar(t) - 1))

Rmpfrライブラリをインストールしていない場合、あなたinstall.packages("Rmpfr")はあなたの夢のすべてを実現できます。


1

Mathematica、50バイト

SetAccuracy[Floor[(#+Sqrt[4+#^2])/2,10^-#2],#2+1]&

かかる匿名関数を定義nし、p順序では。を使用FloorしてSetAccuracy、10進出力を取得するために必要なでの丸めを防ぎます。


@Arcindeマシンの精度の数値はを処理できないため、残念ながら使用できませんp>15
2012rcampion

1

CJam、35バイト

1'el+~1$*_2#2$2#4*+mQ+2/1$md@+s0'.t

最初にpを読み取り、次にnを読み取ります。

CJamインタプリタでオンラインで試してください。

使い方

n×10 pの質問から式を計算し、結果の整数部と小数部を10 pで除算し、小数部に先行ゼロを追加してp桁を取得し、ドットで区切られた部分を出力します。

1'e  e# Push 1 and 'e'.
l+   e# Read a line from STDIN and prepend the 'e'.
~    e# Evaluate. This pushes 10**p (e.g., 1e3 -> 1000) and n.
1$*  e# Copy 10**p and multiply it with n.
_2#  e# Copy n * 10**p and square it.
2$   e# Copy 10**p.
2#4* e# Square and multiply by 4.
+    e# Add (n * 10**p)**2 and 4 * 10**2p.
mQ   e# Push the integer part of the square root.
+2/  e# Add to n * 10**p and divide by 2.
1$md e# Perform modular division by 10**p.
@+s  e# Add 10**p to the fractional part and convert to string. 
0'.t e# Replace the first character ('1') by a dot.

1

Python 2、92バイト

私が今答えを見ていると、CJamの答えはこれと同じ基本的な方法を使用しているように見えます。答えを計算n*10**pし、小数点を追加します。平方根の整数部分を計算する方法のため、信じられないほど非効率的です(到達するまで1を追加するだけです)。

n,p=input()
e=10**p;r=0
while(n*n+4)*e*e>r*r:r+=1
s=str((n*e+r-1)/2);print s[:-p]+'.'+s[-p:]

1

PHP、85 78バイト

echo bcdiv(bcadd($n=$argv[bcscale($argv[2])],bcsqrt(bcadd(4,bcpow($n,2)))),2);

BC Math数学拡張を使用しますが、一部のシステムでは使用できませんでした。コマンドラインオプションを指定して、コンパイル時に含める必要があり--enable-bcmathます。Windowsでは常に利用可能であり、OSXにバンドルされているPHPバージョンにも含まれているようです。

更新

コメントで@blackholeによって提案されたすべてのハックを適用し(ありがとう!)$n、最初の使用に初期化を絞り込んで(さらに3バイト保存)、コードは上のコードボックスの1行に収まりました。


@ブラックホール。85、確かに。私はおそらく86を読んだ(わずかに大きな選択をした)と間違って68を書いた。修正されました。
-axiac

1
問題ない :)。ちなみに、1バイト少なくすることができます:の周りの括弧を削除し、echoその後にスペースを置きます。
ブラックホール

1
そしてbcscalereturn を期待しているのでtrue$n=$argv[bcscale($argv[2])];さらに2バイトを使用して保存できます。
ブラックホール

それはいいハックです。
axiac

コードの汚れは芸術です:P。ああ、最後の1つ:1バイトbcpow($n,2)bcmul($n,$n)節約する代わりに。
ブラックホール

1

J、27バイト

4 :'}:":!.(2+x)-:y+%:4+*:y'

説明:

4 :'                      '   | Define an explicit dyad
                       *:y    | Square y
                     4+       | Add 4
                   %:         | Square root
                 y+           | Add y
               -:             | Half
      ":!.(2+x)               | Set print precision to 2+x
    }:                        | Remove last digit, to fix rounding

次のように呼び出します。

    9 (4 :'}:":!.(2+x)-:y+%:4+*:y') 1
1.618033988

もう1つのやや涼しいソリューション:

4 :'}:":!.(2+x){.>{:p._1,1,~-y'

多項式x ^ 2-nx-1の根を計算します。残念ながら、Jが結果をフォーマットする方法により、希望する根を少し長く取得することができます。

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