おおよそのマイスクエア


10

tecmathによるこのビデオに触発されました

任意の数の平方根の概算は、x整数の平方根s(つまり、であるような最大の整数s * s ≤ x)を取得して計算することで見つけることができますs + (x - s^2) / (2 * s)。これを近似と呼びましょうS(x)。(注:これは、ニュートンラフソン法の1つのステップを適用することと同じです)。

これには奇妙な点がありますが、S(n ^ 2-1)は常に√(n ^ 2)になりますが、一般的には非常に正確です。一部の大きなケースでは、これは> 99.99%の精度を持つことがあります。

入出力

任意の形式で1つの番号を取得します。

フォーマット:入力->出力

2 -> 1.50
5 -> 2.25
15 -> 4.00
19 -> 4.37               // actually 4.37       + 1/200
27 -> 5.20
39 -> 6.25
47 -> 6.91               // actually 6.91       + 1/300
57 -> 7.57               // actually 7.57       + 1/700
2612 -> 51.10            // actually 51.10      + 2/255
643545345 -> 25368.19    // actually 25,368.19  + 250,000,000/45,113,102,859
35235234236 -> 187710.50 // actually 187,710.50 + 500,000,000/77,374,278,481

仕様書

  • 出力は、少なくとも100分の1に四捨五入する必要があります(つまり、回答が47.2851の場合、47.29を出力できます)

  • 答えが整数の場合、出力に次のゼロと小数点が含まれている必要はありません(つまり、125.00は125および125.0としても出力できます)。

  • 1未満の数値をサポートする必要はありません。

  • 非整数入力をサポートする必要はありません。(1.52など...)

ルール

標準の抜け穴は禁止されています。

これはので、バイト単位での最短の回答が優先されます。



3
注:s + (x - s^2) / (2 * s) == (x + s^2) / (2 * s)
JungHwan Min

私のソリューション:Pyth25バイト ; 14バイト
Stan Strum

2桁以上の精度が必要ですか?
完全に人間的な2017年

@totallyhumanはい。47.2851は47.28と表すことができますが、これ以上不正確ではありません。
スタンストラム2017年

回答:


2

ゼリー 8  7 バイト

オリビエグレゴワールの簡略化された数式おかげで-1バイト-Javaの回答を参照してください。

÷ƽ+ƽH

オンラインでお試しください!

どうやって?

÷ƽ+ƽH - Link: number, n
 ƽ     - integer square root of n  -> s
÷       - divide                    -> n / s
    ƽ  - integer square root of n  -> s
   +    - add                       -> n / s + s
      H - halve                     -> (n / s + s) / 2

7バイト:÷ƽ+ƽH初めてJellyを使用しようとしたため、間違っている可能性があります。ƽそれを繰り返さないように、しかし、私はどのように保存するかを知っていればいいのですが。それは別のバイトを節約するかもしれません。
OlivierGrégoire2017年

@OlivierGrégoireに感謝!ƽɓ÷⁹+H整数のルートを再計算し、それが7もだではないでしょうɓスワップ引数を持つ新しい進チェーンを開始し、そのチェーンの右引数(のすなわち結果を参照ƽ)。ƽɓ÷+⁹Hここでも動作します。
ジョナサンアラン


4

Java(OpenJDK 8)、32バイト

n->(n/(n=(int)Math.sqrt(n))+n)/2

オンラインでお試しください!

解説

コードはこれと同等です:

double approx_sqrt(double x) {
  double s = (int)Math.sqrt(x);  // assign the root integer to s
  return (x / s + s) / 2
}

背後にある数学:

s + (x - s²) / (2 * s)  =  (2 * s² + x - s²) / (2 * s)
                        =  (x + s²) / (2 * s)
                        =  (x + s²) / s / 2
                        =  ((x + s²) / s) / 2
                        =  (x / s + s² / s) / 2
                        =  (x / s + s) / 2

これは仕様に対応していないようです。出力は少なくとも100分の1に丸める必要があります
Ayb4btu

2
まあ、それは最も近い100分の1より低く丸められているので、完全に有効です。
OlivierGrégoire2017年

ああ、そうか、私の誤解。
Ayb4btu 2017年

4

Pythonの247 ... 36バイト

-3バイト@JungHwanMinのおかげで
-1バイト@HyperNeutrinoのおかげで
-2バイト@JonathanFrechの
おかげで-3バイト@OlivierGrégoireのおかげで

def f(x):s=int(x**.5);print(x/s+s)/2

オンラインでお試しください!


-2バイト:s+(x-s*s)/s/2to(x+s*s)/s/2
JungHwan Min

-2関数を使用してバイト
HyperNeutrino

@HyperNeutrino私は取得のみ-1バイトを
OVS

申し訳ありませんああ、私は誤ってテストした後の文字を削除してから後のバイトをカウント:Pええちょうど-1
HyperNeutrino

省略して+.0で置き換えることはできません/s/2/2./s、2バイト節約できますか?
Jonathan Frech


3

R、43バイト 29バイト

x=scan()
(x/(s=x^.5%/%1)+s)/2

新しい方程式を作成してくれた@Giuseppeに感謝し、整数除算ソリューションで12バイトのゴルフを支援します。関数呼び出しをスキャン用に交換することで、さらに数バイトを使ってみました。

オンラインでお試しください!


1
35バイト ; より一般的には、TIOの「ヘッダー」フィールドを使用してf <- 、関数を割り当てるためにa を置くことができます。しかし、それでも素晴らしい解決策です。機会があれば、Rでのゴルフのヒントを読んでください。
ジュゼッペ



2

JavaScript(ES7)、22バイト

x=>(s=x**.5|0)/2+x/s/2

中間変数は実際には必要ないので、これは実際には次のように書き換えることができます。

x=>x/(x=x**.5|0)/2+x/2

テストケース


2

C、34バイト

@OlivierGrégoireに感謝!

s;
#define f(x)(x/(s=sqrt(x))+s)/2

float入力でのみ機能します。

オンラインでお試しください!

C、 41   39  37バイト

s;
#define f(x).5/(s=sqrt(x))*(x+s*s)

オンラインでお試しください!

C、 49   47   45  43バイト

s;float f(x){return.5/(s=sqrt(x))*(x+s*s);}

オンラインでお試しください!


2バイトを節約してくれた@JungHwan Minに感謝!


1
47バイト ; 編集:ありがとうございますが、@ JungHwanMinを見つけてくれました。
スタンストラム



2

AWK47 44 38バイト

{s=int($1^.5);printf"%.2f",$1/2/s+s/2}

オンラインでお試しください!

注:TIO likeには\n、出力をきれいにするために2バイト余分にあります。:)

平方根を見つけるためにsqrtを使用するのは少しごまかしのように感じるので、ここでは、バイト数が少ないバージョンが見つかりません。

{for(;++s*s<=$1;);s--;printf("%.3f\n",s+($1-s*s)/(2*s))}

オンラインでお試しください!


1
これはAWKwardと言えます。私は自分を見せます。編集:元々はsqrtを使用して回避するように質問を計画しましたが、答えが多すぎるため、変更すると不法行為が発生し、元のアイデアが機能します。
スタン・ストラム

「AWK」のしゃれは楽しいです:)
ロバート・ベンソン

代わりにsqrt($1)使用できます$1^.5
Cabbie407 '29

ありがとう@ Cabbie407なぜ私がそれを考えなかったのかわからない。
ロバートベンソン

1
どういたしまして。その他のこと:\n出力を取得するためには必要ありません。awkのprintfには括弧は必要ありません。式はに短縮できs/2+$1/s/2、結果はになり{s=int($1^.5);printf"%.2f",s/2+$1/s/2}ます。このコメントが失礼なようでしたら申し訳ありません。
Cabbie407 2017年


1

PowerShell、54バイト

param($x)($x+($s=(1..$x|?{$_*$_-le$x})[-1])*$s)/(2*$s)

オンラインでお試しください!またはいくつかのテストケースを確認する

入力を受け取り$x、要求された内容を正確に実行します。|?一部の二乗とき、である、ことを最大の整数見つけた-lESS-より-または- e入力にQUALを$x、我々は必要な計算を実行します。出力は暗黙的です。


ワオ。Windows Powershellで人々がどのようにゴルフをするかを理解することはできませんでした
スタンストラム

@StanStrumあなたは一人じゃない、笑 :D
AdmBorkBork 2017年

1

ハスク、9バイト

½Ṡ§+K/(⌊√

オンラインでお試しください!

この答えにはまだ醜いものがありますが、より短い解決策を見つけることができないようです。

説明

私はニュートンのアルゴリズムの1つのステップを実装しています(これは実際にこの質問で提案されたものと同等です)

½Ṡ§+K/(⌊√
  §+K/       A function which takes two numbers s and x, and returns s+x/s
 Ṡ           Call this function with the input as second argument and
      (⌊√    the floor of the square-root of the input as first argument
½            Halve the final result

私はあなたがではなく、実際の分裂をしたいと思います÷
H.PWiz

@ H.PWizおっと、ありがとうございます。それは、他の解決策を見つけるための実験の残りでした
レオ

1

Pyt11 10バイト

←Đ√⌊Đ↔⇹/+₂

説明

code                explanation                        stack
←                   get input                          [input]
 Đ                  duplicate ToS                      [input,input]
  √⌊                calculate s                        [input,s]
    Đ               duplicate ToS                      [input,s,s]
     ↔              reverse stack                      [s,s,input]
      ⇹             swap ToS and SoS                   [s,input,s]
       /            divide                             [s,input/s]
        +           add                                [s+input/s]
         ₂          halve                              [(s+input/s)/2]
                    implicit print

ちょうどこれを見て、それがピスではないことに気づくまでは良い分でした。すばらしい答えです。
Stan Strum

ええ、それは私がしばらく考えてきた小さな言語で、実際に作ることに決めました。
mudkip201 2017

ToSはスタックの最上位ですか?そうであれば、SoSとは何ですか?
Stan Strum

ToSはスタックのトップ、SoSはスタックの2番目
mudkip201

いいですね、この言語を掘り下げることができるかどうか見てみましょう。私はそれが好きです!
Stan Strum

1

天の川17 14バイト

-3バイト、OlivierGrégoireの式を使用

^^':2;g:>/+2/!

オンラインでお試しください!

説明

code              explanation                   stack layout

^^                clear preinitialized stack    []
  ':              push input and duplicate it   [input, input]
    2;            push 2 and swap ToS and SoS   [input, 2, input]
      g           nth root                      [input, s=floor(sqrt(input))]
       :          duplicate ToS                 [input, s, s]
        >         rotate stack right            [s, input, s]
         /        divide                        [s, input/s]
          +       add                           [s+input/s]
           2/     divide by 2                   [(s+input/s)/2]
             !    output                        => (s+input/s)/2

それは天井の代わりに床であるべきではありませんか?
mudkip201 2017

@ mudkip201更新、ありがとう
ovs

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