Квадратный корень Расстояние от целых


20

Задав десятичное число k, найдите наименьшее целое число, nтакое, что корень квадратный из nнаходится в пределах kцелого числа. Однако расстояние должно быть ненулевым - 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

Это , поэтому выигрывает самый короткий ответ в байтах.

Ответы:


18

Wolfram Language (Mathematica) , 34 байта

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

Попробуйте онлайн!

объяснение

Результат должен иметь вид м2±1 для некоторого мN . Решение неравенств м2+1-мКим-м2-1К, получаемм1-К22К им1+К22К соответственно. Таким образом, результатмин(1-К22К2+1,1+К22К2-1).


8

Python , 42 байта

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

Попробуйте онлайн!

Основываясь на формуле алефальфы , явно проверяем, находимся ли мы в случае м2-1 или м2+1 через условие k<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 's Mathematica ответ , вдохновленный ответом @Sok 's 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

Japt , 18 16 байтов

-2 байта от лохматого

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

Попробуйте онлайн!


Может быть короче, используя решение Арно
только ASCII


Ох ... конечно, я мог бы изменить это: Кроме того, %1 &&это неприятно, не уверен, что использование решения Арно будет короче (возможно, нет)
только ASCII

16 байт на переназначение , Z¬u1чтобы Zв начале функции.
лохматый

Другой метод, по-видимому, 26:[1,-1]®*U²Ä /U/2 c ²-Z} rm
только ASCII

3

Pyth, 22 21 байт

hSm-^.Ech*d^Q2yQ2d_B1

Попробуйте онлайн здесь или проверьте все тестовые примеры сразу здесь .

Еще один вариант отличного ответа от алефальфы , не забудьте дать им голос!

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

Изменить: Сохраненный байт, благодаря Кевину Круйссену


1
Я не знаю Pyth, но возможно ли также создать [-1,1]в 3 байта, или вам нужен дополнительный реверс, чтобы он стал 4 байта? Если это возможно в 3 байта, вы можете сделать это, а затем изменить , *_dчтобы *dи +dк -d. Кроме того, разве Pyth не имеет встроенного минимума вместо сортировки и получения первым?
Кевин Круйссен

1
@KevinCruijssen Порядок двух элементов не важен, так как мы берем минимум, хотя я не могу придумать, как создать пару в 3 байта. Хороший улов при изменении его, - ... dхотя, это экономит мне байт! Спасибо
Сок

@KevinCruijssen Также, к сожалению, нет функции минимального или максимального байта: o (
Сок

1
Ах, конечно. Вы отображаете значения, поэтому не имеет значения, если это [1,-1]или [-1,1]. Я сравнивал *dи -dс моим ответом 05AB1E, где я не использую карту, но могу вычитать / умножать 2D-массив из / с другого 2D-массива, поэтому мне не нужна карта. Рад, что я мог помочь сохранить байт в этом случае. :) И спасибо за вдохновение для моего ответа 05AB1E.
Кевин Круйссен

3

Perl 6 , 34 33 29 байт

-1 байт благодаря Грими

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

Попробуйте онлайн!


-1 байт путем замены >=на >. Квадратные корни целых чисел либо целочисленные, либо иррациональные, поэтому случай равенства не может произойти.
Grimmy

1
@ Грими Спасибо, кажется, это разрешено в соответствии с правилами конкурса. (Хотя числа с плавающей точкой, конечно, всегда рациональны.)
nwellnhof

2

APL (Dyalog Unicode) , 27 байтов SBCS

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

Попробуйте онлайн!

Монадический поезд принимает один аргумент. Это порт ответа алефальфа .

Как:

⌊/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 байта благодаря Кевину Круйссену!


Вы можете сохранить байт, поместив его 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;}
Кевин Круйссен

Кроме того, 0d+можно удалить, не так ли?
Кевин Круйссен

@KevinCruijssen Да, может, я просто забыла nуже был дважды
Воплощение Неведении


1

Java 8, 85 байт

n->{double i=1,p;for(;Math.abs(Math.round(p=Math.sqrt(i))-p)>n|p%1==0;i++);return i;}

Порт ответа EmbodimentOfIgnorance 's C # .NET.

Попробуйте онлайн.

Math.roundВ качестве альтернативы может быть, но , к сожалению , это тот же самый байт-счетчик:

n->{double i=1,p;for(;Math.abs((int)((p=Math.sqrt(i))+.5)-p)>n|p%1==0;i++);return i;}

Попробуйте онлайн.


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 для визуализации своих сценариев, но важной частью являются сами байты, которые определяют исходный код.
максимум

Хороший пример того, как различаются количество символов и количество байтов, - это ответ. Здесь 'ԓ'символ на самом деле составляет 2 байта, а остальные - 1 байта.
максимум

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 байт

Мне не удалось получить что-то более крутое, чем тот же подход, что и в случае с алефальцем
- иди, скажи ему ответ 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.