整数的平方根距离


20

给定十进制数k,请找到最小的整数n,以使的平方根nk整数之内。但是,距离应为非零- n不能是完美的正方形。

给定k,十进制数或分数(以您更方便为准),这样0 < k < 1,输出最小的正整数n,使得的平方根n与最接近的平方根的整数之n差小于或等于k但非零。

如果i是与的平方根最接近的整数n,则寻找第一个n位置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

这是,因此最短答案以字节为单位。

Answers:


18

Wolfram语言(Mathematica),34个字节

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

在线尝试!

说明

对于某些,结果的格式必须为。解决不等式和,我们得到和。因此结果是。m2±1mNm2+1mkmm21km1k22km1+k22kmin(1k22k2+1,1+k22k21)



4

05AB1E,16 个字节

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

@alephalpha的Mathematica答案的端口,来自@Sok的Pyth答案的启发,因此请务必对它们两个都进行投票

在线尝试验证所有测试用例

说明:

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奇特的语法中找出公式。
魔术章

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

J39 29字节

[:<./_1 1++:*:@>.@%~1+(,-)@*:

注意 此较短的版本仅使用@alephalpha的公式。

在线尝试!

39字节,原始,蛮力

2(>:@])^:((<+.0=])(<.-.)@(-<.)@%:)^:_~]

在线尝试!

处理所有测试用例


3

Japt18 16字节

Shaggy的 -2个字节

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

在线尝试!


使用Arnauld解决方案可能会更短
仅限ASCII


哦……我当然可以颠倒它:|。同样%1 &&令人讨厌的是,不确定使用Arnauld的解决方案是否会更短(也许不是)
(仅ASCII

通过在函数开始处重新分配Z¬u116个字节Z
毛茸茸的

另一方法似乎是26:[1,-1]®*U²Ä /U/2 c ²-Z} rm
(仅ASCII)

3

Pyth,22 21字节

hSm-^.Ech*d^Q2yQ2d_B1

在此处在线尝试,或在此处一次验证所有测试用例。

Alephalpha的另一个很好的回答是,一定要给他们一个赞!

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个字节为单位,则可以这样做,然后将*_dto 更改*d+dto -d。此外,Pyth是否没有内置的Minimum值,而是先排序后取值?
凯文·克鲁伊森

1
@KevinCruijssen这两个元素的顺序并不重要,因为我们要使用最小的元素,尽管我想不出一种以3个字节创建对的方法。很好地将其更改为- ... d,这为我节省了一个字节!谢谢

@KevinCruijssen同样不幸的是,没有最小或最大的单个字节:o(
Sok

1
嗯当然了 您可以在值上进行映射,因此无论是[1,-1]还是都没有关系[-1,1]。我正在将*d-d与我的05AB1E答案进行比较,在这里我不使用地图,但是可以从另一个2D数组中减去/乘以一个2D数组,因此不需要地图。很高兴在这种情况下,我可以帮助保存一个字节。:)感谢您为我的05AB1E答案提供的灵感。
凯文·克鲁伊森

3

Perl 6的34 33 29个字节

-1字节感谢Grimy

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

在线尝试!


替换>=为-1字节>。整数的平方根可以是整数,也可以是无理数,因此证明相等情况不可能发生。
Grimmy

1
@Grimy谢谢,根据挑战规则,这似乎是允许的。(当然,尽管浮点数总是有理的。)
nwellnhof

2

APL(Dyalog Unicode),27 字节SBCS

⌊/0~⍨¯1 1+2*⍨∘⌈+⍨÷⍨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#交互式编译器)89 85 71字节

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

在线尝试!

-4个字节感谢Kevin Cruijssen!


您可以通过将放入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;}
Kevin 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打高尔夫的符号吗?因为您的某些字符需要多个字节。我不是故意要挑剔的,我是真的想知道:)
schroffl

好问题!打高尔夫球中的“字节”与存储程序所需的最小文件大小有关。用于可视化这些字节的文本可以是任何字节。我选择了“代码页437”来可视化我的脚本,但重要的部分是定义源代码的实际字节。
maxb

的字符数和是不同的字节数的一个很好的例子是这样的回答。在这里,'ԓ'字符实际上是2个字节,但其余部分是1个字节。
maxb

1

第四(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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.