整数からの平方根距離


20

10進数が与えられた場合、の平方根が整数の範囲内にkなるnような最小の整数を見つけます。ただし、距離はゼロ以外である必要があり、完全な正方形にすることはできません。nkn

与えられkた10進数または分数(どちらか簡単な方)、など、の平方根と平方根に最も近い整数の差がゼロ以下で0 < k < 1あるnように最小の正の整数を出力する。nnk

iがの平方根に最も近い整数である場合n、最初のnwhereを探しています0 < |i - sqrt(n)| <= k

ルール

  • 言語の整数以外の数値の不十分な実装を使用して、問題を単純化することはできません。
  • それ以外の場合はk、浮動小数点の丸めなどの問題が発生しないと想定できます。

テストケース

.9         > 2
.5         > 2
.4         > 3
.3         > 3
.25        > 5
.2         > 8
.1         > 26
.05        > 101
.03        > 288
.01        > 2501
.005       > 10001
.003       > 27888
.001       > 250001
.0005      > 1000001
.0003      > 2778888
.0001      > 25000001
.0314159   > 255
.00314159  > 25599
.000314159 > 2534463

カンマ区切りのテストケース入力:

0.9, 0.5, 0.4, 0.3, 0.25, 0.2, 0.1, 0.05, 0.03, 0.01, 0.005, 0.003, 0.001, 0.0005, 0.0003, 0.0001, 0.0314159, 0.00314159, 0.000314159

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

回答:


18

Wolfram言語(Mathematica)、34バイト

Min[⌈.5/#+{-#,#}/2⌉^2+{1,-1}]&

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

説明

結果は、いくつかのに対して形式でなければなりません。不等式解決と、我々が取得および。結果は。m2±1mNm2+1mkmm21km1k22km1+k22kmin(1k22k2+1,1+k22k21)


8

Python、42バイト

lambda k:((k-1/k)//2)**2+1-2*(k<1/k%2<2-k)

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

alephalphaの式に基づいて、conditionを介してまたは場合に明示的にチェックします。m21m2+1k<1/k%2<2-k

Python 3.8は、インライン割り当てでバイトを保存できます。

Python 3.8、41バイト

lambda k:((a:=k-1/k)//2)**2-1+2*(a/2%1<k)

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

これらは私の再帰的な解決策を打ち負かしました:

50バイト

f=lambda k,x=1:k>.5-abs(x**.5%1-.5)>0 or-~f(k,x+1)

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


4

05AB1E、16 バイト

nD(‚>I·/înTS·<-ß

@alephalphaのMathematicaの答えは、からインスピレーションを@SokのPythの答えは、ので、それらの両方をupvoteすることを確認してください!

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

n                 # Take the square of the (implicit) input
                  #  i.e. 0.05 → 0.0025
 D(‚              # Pair it with its negative
                  #  i.e. 0.0025 → [0.0025,-0.0025]
    >             # Increment both by 1
                  #  i.e. [0.0025,-0.0025] → [1.0025,0.9975]
     I·           # Push the input doubled
                  #  i.e. 0.05 → 0.1
       /          # Divide both numbers with this doubled input
                  #  i.e. [1.0025,0.9975] / 0.1 → [10.025,9.975]
        î         # Round both up
                  #  i.e. [10.025,9.975] → [11.0,10.0]
         n        # Take the square of those
                  #  i.e. [11.0,10.0] → [121.0,100.0]
          TS      # Push [1,0]
            ·     # Double both to [2,0]
             <    # Decrease both by 1 to [1,-1]
              -   # Decrease the earlier numbers by this
                  #  i.e. [121.0,100.0] - [1,-1] → [120.0,101.0]
               ß  # Pop and push the minimum of the two
                  #  i.e. [120.0,101.0] → 101.0
                  # (which is output implicitly)

きちんとした、使用された式を持っている答えをリンクしてくれてありがとう。05AB1Eの常軌を逸した構文から式を見つけようとして、私は精神体操をしていました。
マジックタコUr

3

JavaScript(ES7)、 51  50バイト

f=(k,n)=>!(d=(s=n**.5)+~(s-.5))|d*d>k*k?f(k,-~n):n

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

(再帰が多すぎるテストケースでは失敗します)


非再帰バージョン、 57  56バイト

k=>{for(n=1;!(d=(s=++n**.5)+~(s-.5))|d*d>k*k;);return n}

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

または55バイトの場合

k=>eval(`for(n=1;!(d=(s=++n**.5)+~(s-.5))|d*d>k*k;);n`)

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

(しかし、これはかなり遅いです)



3

Japt18 16バイト

- シャギーから2バイト

_=¬u1)©U>½-½aZ}a

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


アルノーのソリューション使用して短いかもしれない
ASCIIのみの


ああ...もちろん、私はそれを逆にすることができました:|。また、その%1 &&厄介で、必ずアルノーのソリューションを使用している場合は(そうでないかもしれない)短くなりません
ASCIIのみ

関数の開始時に再割り当てZ¬u1することにより、16バイトZ
シャギー

:他の方法は、26のように見える[1,-1]®*U²Ä /U/2 c ²-Z} rm
ASCIIのみ

3

Pyth、22 21バイト

hSm-^.Ech*d^Q2yQ2d_B1

ここでオンライン試すか、ここですべてのテストケースを一度に確認してください

alephalphaの優れた答えのもう1つの移植版で、必ず賛成票を投じてください!

hSm-^.Ech*d^Q2yQ2d_B1   Implicit: Q=eval(input())
                  _B1   [1,-1]
  m                     Map each element of the above, as d, using:
           ^Q2            Q^2
         *d               Multiply by d
        h                 Increment
       c      yQ          Divide by (2 * Q)
     .E                   Round up
    ^           2         Square
   -             d        Subtract d
 S                      Sort
h                       Take first element, implicit print

編集:Kevin Cruijssenに感謝します


1
私はPythを知りませんが[-1,1]、3バイトで作成することも可能ですか、それとも4バイトになるように追加のリバースが必要ですか?それは3バイトで可能なら、あなたはそれを行う、その後、変更する可能性*_d*dして+dまで-d。また、Pythには最小のビルトインがなく、並べ替えて最初に取得されますか?
ケビンクルーッセン

1
@KevinCruijssen最小値を取得しているため、2つの要素の順序は重要ではありませんが、3バイトでペアを作成する方法は考えられません。それを変更するのに良いキャッチ- ... d、それは私にバイトを節約します!ありがとう
ソック

@KevinCruijssenまた、残念ながらシングルバイトの最小または最大関数はありません:o(
Sok

1
ああ、もちろん。それはだ場合、それは問題ではありませんので、あなたは、値を超えるマップ[1,-1][-1,1]。私は、比較された*d-d私はマップを使用していない私の05AB1E答え、と、私はマップを必要としないので、別の2次元アレイと/乗算/からの2次元配列を引くことができます。その場合、バイトを節約することができてうれしいです。:)そして、私の05AB1E回答のインスピレーションに感謝します。
ケビンクルーッセン

3

Perl 6の34の 33 29バイト

グリミのおかげで-1バイト

{+(1...$_>*.sqrt*(1|-1)%1>0)}

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


交換することにより-1バイト>=>。整数の平方根は整数または無理のいずれかであるため、等値のケースはおそらく発生しません。
グリムミー

1
@Grimyありがとう、これはチャレンジルールに従って許可されているようです。(もちろん、浮動小数点数は常に合理的です。)
nwellnhof

2

APL(Dyalog Unicode)、27 バイトSBCS

⌊/0~⍨¯1 1+2*⍨∘⌈+⍨÷⍨1(+,-)×⍨

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

1つの引数をとるモナド列。これは、alephalphaの回答の移植です。

どうやって:

⌊/0~⍨¯1 1+2*⍨∘⌈+⍨÷⍨1(+,-)×⍨  Monadic train

                         ×⍨  Square of the argument
                   1(+,-)    1 ± that (returns 1+k^2, 1-k^2)
                 ÷⍨          divided by
               +⍨            twice the argument
             ∘⌈              Ceiling
          2*⍨                Squared
     ¯1 1+                   -1 to the first, +1 to the second
  0~⍨                        Removing the zeroes
⌊/                           Return the smallest

2

C#(Visual C#Interactive Compiler)89 85 71バイト

k=>{double n=2,p;for(;!((p=Math.Sqrt(n)%1)>0&p<k|1-p<k);n++);return n;}

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

Kevin Cruijssenのおかげで-4バイト!


あなたは入れてバイトを保存することができますn++ループで、その-1戻り値から削除することができます:k=>{double n=1,p;for(;Math.Abs(Math.Round(p=Math.Sqrt(0d+n))-p)>k|p%1==0;n++);return n;}
ケビンCruijssen

また、0d+削除することはできますか?
ケビンクルーッセン

@KevinCruijssenはい、できます。nすでに二重になっていたことを忘れていました
無知の



1

MathGolf、16バイト

²_b*α)½╠ü²1bαm,╓

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

このソリューションの大ファンではありません。これは05AB1Eソリューションの移植版であり、ほとんどの回答で使用されているのと同じ式に基づいています。

説明

²                  pop a : push(a*a)
 _                 duplicate TOS
  b                push -1
   *               pop a, b : push(a*b)
    α              wrap last two elements in array
     )             increment
      ½            halve
       ╠           pop a, b, push b/a
        ü          ceiling with implicit map
         ²         pop a : push(a*a)
          1        push 1
           b       push -1
            α      wrap last two elements in array
             m     explicit map
              ,    pop a, b, push b-a
               ╓   min of list

すべてのシンボルはbyteインゴルフと見なされますか?一部の文字には1バイト以上が必要なためです。ピックするつもりはありません、本当に不思議に思っています:)
schroffl

良い質問!ゴルフの「バイト」は、プログラムを保存するために必要な最小ファイルサイズに関連しています。これらのバイトを視覚化するために使用されるテキストは、任意のバイトにすることができます。スクリプトを視覚化するためにコードページ437を選択しましたが、重要な部分は、ソースコードを定義する実際のバイトです。
maxb

異なる文字数とバイト数の良い例は、この答えです。ここでは、'ԓ'文字は実際には2バイトですが、残りは1バイト文字です。
maxb

1

Forth(gforth)、76バイト

: f 1 begin 1+ dup s>f fsqrt fdup fround f- fabs fdup f0> fover f< * until ;

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

説明

1でカウンターを開始し、ループでインクリメントします。各反復は、カウンターの平方根の絶対値-最も近い整数がkより小さいかどうかをチェックします

コードの説明

: f                   \ start a new word definition
  1                   \ place a counter on the stack, start it at 1
  begin               \ start and indefinite loop
    1+                \ add 1 to the counter
    dup s>f           \ convert a copy of the counter to a float
    fsqrt             \ get the square root of the counter
    fdup fround f-    \ get the difference between the square root and the next closes integer
    fabs fdup         \ get the absolute value of the result and duplicate
    f0>               \ check if the result is greater than 0 (not perfect square)
    fover f<          \ bring k to the top of the float stack and check if the sqrt is less than k
    *                 \ multiply the two results (shorter "and" in this case)
  until               \ end loop if result ("and" of both conditions) is true
;                     \ end word definition

1

ゼリー、13 バイト

私はalephalphaと同じアプローチ以外に何も得ることができませんでした
-彼のMathematicaの答えに賛成してください!

²;N$‘÷ḤĊ²_Ø+Ṃ

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

どうやって?

²;N$‘÷ḤĊ²_Ø+Ṃ - Link: number, n (in (0,1))
²             - square n        -> n²
   $          - last two links as a monad:
  N           -   negate        -> -(n²)
 ;            -   concatenate   -> [n², -(n²)]
    ‘         - increment       -> [1+n², 1-(n²)]
      Ḥ       - double n        -> 2n
     ÷        - divide          -> [(1+n²)/n/2, (1-(n²))/n/2]
       Ċ      - ceiling         -> [⌈(1+n²)/n/2⌉, ⌈(1-(n²))/n/2⌉]
        ²     - square          -> [⌈(1+n²)/n/2⌉², ⌈(1-(n²))/n/2⌉²]
          Ø+  - literal         -> [1,-1]
         _    - subtract        -> [⌈(1+n²)/n/2⌉²-1, ⌈(1-(n²))/n/2⌉²+1]
            Ṃ - minimum         -> min(⌈(1+n²)/n/2⌉²-1, ⌈(1-(n²))/n/2⌉²+1) 

1

Japt、14バイト

_=¬aZ¬r¹©U¨Z}a

それを試してみてください

_=¬aZ¬r¹©U¨Z}a     :Implicit input of integer U
_                  :Function taking an integer Z as an argument
 =                 :  Reassign to Z
  ¬                :    Square root of Z
   a               :    Absolute difference with
    Z¬             :      Square root of Z
      r            :      Round to the nearest integer
       ¹           :  End reassignment
        ©          :  Logical AND with
         U¨Z       :  U greater than or equal to Z
            }      :End function
             a     :Return the first integer that returns true when passed through that function

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