Відстань від коренів квадратного кореня


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

Мова Вольфрама (Mathematica) , 34 байти

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

Спробуйте в Інтернеті!

Пояснення

Результат повинен мати вигляд для деяких . Розв’язуючи нерівності і , отримуємо і відповідно. Отже результат: .m2±1mNm2+1mkmm21km1k22km1+k22kmin(1k22k2+1,1+k22k21)


8

Пітон , 42 байти

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

Спробуйте в Інтернеті!

Виходячи з формули алефальфи , явно перевіряючи, чи ми знаходимося у випадку або через умову .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·<-ß

Порт відповіді Mathematica @alephalpha з натхненням від відповіді @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

Japt , 18 16 байт

-2 байти від Shaggy

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

Спробуйте в Інтернеті!


Може бути коротше , використовуючи рішення Arnauld в
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

Редагувати: Збережено байт завдяки Kevin Cruijssen


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

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

@KevinCruijssen Також не існує єдина мінімальний або максимальний байт функція , до жаль: о (
Сік

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
@Grimy Спасибі, здається, це дозволено відповідно до правил виклику. (Хоча, звичайно, числа з плаваючою комою завжди раціональні.)
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 # 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;}

Спробуйте в Інтернеті!

-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;}
Кевін Круїйсен

Також 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 відповідь 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кодом для гольфу? Тому що для деяких ваших персонажів потрібно більше одного байта. Я не маю на увазі ніт-
пік

Гарне питання! "Байт" у гольфі відноситься до мінімального розміру файлів, необхідного для зберігання програми. Текст, який використовується для візуалізації цих байтів, може бути будь-яким байтом. Я вибрав Code Code для візуалізації своїх сценаріїв, але важливою частиною є фактичні байти, які визначають вихідний код.
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 байт

Мені не вдалося отримати щось більш терористичне, ніж той самий підхід, що й алефальфа
- іди, щоб підтвердити його відповідь 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.