Pierwiastek kwadratowy Odległość od liczb całkowitych

20

Biorąc pod uwagę liczbę dziesiętną k, znajdź najmniejszą liczbę całkowitą, ntak aby pierwiastek kwadratowy nbył w kliczbie całkowitej. Jednak odległość powinna być niezerowa - nnie może być idealnym kwadratem.

Biorąc pod uwagę kliczbę dziesiętną lub ułamek (w zależności od tego, co jest dla Ciebie łatwiejsze), na przykład 0 < k < 1, wypisz najmniejszą dodatnią liczbę całkowitą, ntak aby różnica między pierwiastkiem kwadratowym ni najbliższą liczbą całkowitą pierwiastka kwadratowego nbyła mniejsza lub równa, kale niezerowa .

Jeśli ijest najbliższą liczbą całkowitą do pierwiastka kwadratowego z n, szukasz pierwszego ngdzie 0 < |i - sqrt(n)| <= k.

Zasady

  • Nie można użyć niewystarczającej implementacji języka liczb niecałkowitych w celu trywializacji problemu.
  • W przeciwnym razie można założyć, że knie spowoduje to problemów, na przykład, zaokrąglanie zmiennoprzecinkowe.

Przypadki testowe

.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

Dane oddzielone przecinkami przypadków testowych:

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

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.

Stephen
źródło

Odpowiedzi:

18

Wolfram Language (Mathematica) , 34 bajty

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

Wypróbuj online!

Wyjaśnienie

Wynik musi być w postaci m2±1 dla niektórych mN . Rozwiązywanie nierówności m2+1mkorazmm21k, otrzymujemym1k22k im1+k2)2)k . Tak więc wynikiem jestmin(1-k2)2)k2)+1,1+k2)2)k2)-1).

alephalpha
źródło
8

Python , 42 bajty

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

Wypróbuj online!

Na podstawie formuły alephalpha , jednoznacznie sprawdzając, czy jesteśmy w przypadku m21 lub m2+1 poprzez warunek k<1/k%2<2-k.

Python 3.8 może zapisać bajt z przypisaniem wbudowanym.

Python 3.8 , 41 bajtów

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

Wypróbuj online!

Pokonały moje rekurencyjne rozwiązanie:

50 bajtów

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

Wypróbuj online!

xnor
źródło
4

05AB1E , 16 bajtów

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

Port @alephalpha „s Mathematica odpowiedź , z inspiracji @Sok ” s Pyth odpowiedzi , więc upewnij się upvote oboje!

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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)
Kevin Cruijssen
źródło
Zgrabnie, dziękuję za połączenie odpowiedzi, która ma zastosowaną formułę. Ćwiczyłem gimnastykę umysłową, próbując zrozumieć formułę z zawsze dziwnej składni 05AB1E.
Magic Octopus Urn
3

JavaScript (ES7),  51  50 bajtów

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

Wypróbuj online!

(zawodzi w przypadku przypadków testowych, które wymagają zbyt dużej rekurencji)


Wersja nierekurencyjna,  57  56 bajtów

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

Wypróbuj online!

Lub dla 55 bajtów :

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

Wypróbuj online!

(ale ten jest znacznie wolniejszy)

Arnauld
źródło
3

J , 39 29 bajtów

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

NB. Ta krótsza wersja po prostu wykorzystuje formułę @ alephalpha.

Wypróbuj online!

39 bajtów, oryginalna, brutalna siła

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

Wypróbuj online!

Obsługuje wszystkie przypadki testowe

Jonasz
źródło
3

Japt , 18 16 bajtów

-2 bajty od Kudłaty

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

Wypróbuj online!

Tylko ASCII
źródło
Może być krótszy przy użyciu rozwiązania Arnaulda
tylko ASCII,
Och ... oczywiście mogłem to odwrócić: | Jest to również %1 &&paskudne, nie jestem pewien, czy użycie rozwiązania Arnaulda byłoby krótsze (być może nie)
tylko ASCII
16 bajtów poprzez ponowne przypisanie Z¬u1do Zna początku funkcji.
Kudłaty
Inną metodą wydaje się być 26:[1,-1]®*U²Ä /U/2 c ²-Z} rm
Tylko ASCII
3

Pyth, 22 21 bajtów

hSm-^.Ech*d^Q2yQ2d_B1

Spróbuj go online tutaj , lub sprawdzić wszystkie przypadki testowe od razu tutaj .

Kolejna porcja doskonałej odpowiedzi Alephalpha , upewnij się, że dałeś im głos!

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

Edycja: Zapisano bajt dzięki Kevinowi Cruijssenowi

Sok
źródło
1
Nie znam Pytha, ale czy można również utworzyć [-1,1]w 3 bajtach, czy potrzebujesz dodatkowego odwrotności, aby stał się 4 bajtami? Jeśli jest to możliwe w 3 bajtów, można to zrobić, a następnie zmienić *_dsię *di +ddo -d. Ponadto, czy Pyth nie ma wbudowanego minimum, zamiast sortować i brać najpierw?
Kevin Cruijssen
1
@KevinCruijssen Kolejność dwóch elementów nie jest ważna, ponieważ bierzemy minimum, chociaż nie mogę wymyślić sposobu na utworzenie pary w 3 bajtach. Dobry chwyt po zmianie na to - ... d, co oszczędza mi bajt! Dzięki
Sok
@KevinCruijssen Niestety, nie ma niestety ani jednego bajtu funkcji minimum lub maksimum: o (
Sok
1
Ach, oczywiście. Odwzorowujesz wartości, więc nie ma znaczenia, czy to [1,-1]czy [-1,1]. Porównywałem *di -dz moją odpowiedzią 05AB1E, gdzie nie używam mapy, ale mogę odjąć / pomnożyć tablicę 2D z / z innej tablicy 2D, więc nie potrzebuję mapy. Cieszę się, że pomogłem w tym przypadku uratować bajt. :) I dziękuję za inspirację do mojej odpowiedzi 05AB1E.
Kevin Cruijssen
3

Perl 6 , 34 33 29 bajtów

-1 bajt dzięki Grimy

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

Wypróbuj online!

nwellnhof
źródło
-1 bajt, zastępując >=w >. Pierwiastki kwadratowe liczb całkowitych są albo całkowite, albo nieracjonalne, więc przypadek równości jest niemożliwy.
Grimmy,
1
@Grimy Dzięki, wydaje się, że jest to dozwolone zgodnie z zasadami wyzwania. (Chociaż liczby zmiennoprzecinkowe są zawsze racjonalne.)
nwellnhof
2

APL (Dyalog Unicode) , 27 bajtów SBCS

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

Wypróbuj online!

Monadyczny pociąg bierze jeden argument. To jest port odpowiedzi Alephalpha .

W jaki sposób:

⌊/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
J. Sallé
źródło
2

C # (interaktywny kompilator Visual C #) , 89 85 71 bajtów

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

Wypróbuj online!

-4 bajty dzięki Kevin Cruijssen!

Wcielenie ignorancji
źródło
Możesz zapisać bajt, umieszczając go n++w pętli, aby -1można go było usunąć ze zwrotu: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
Ponadto 0d+można je usunąć, prawda?
Kevin Cruijssen
@KevinCruijssen Tak, może, właśnie zapomniałem, że nbył już podwójny
Embodiment of Ignorance
2

Java (JDK) , 73 70 bajtów

k->{double i=1,j;for(;(j=Math.sqrt(++i)%1)==0|j>=k&1-j>=k;);return i;}

Wypróbuj online!

-3 bytes dzięki @ceilingcat

Sara J.
źródło
@ceilingcat Neat, dzięki.
Sara J
1

MathGolf , 16 bajtów

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

Wypróbuj online!

Nie jest wielkim fanem tego rozwiązania. Jest to port rozwiązania 05AB1E, które opiera się na tej samej formule, z której korzysta większość odpowiedzi.

Wyjaśnienie

²                  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
maxb
źródło
Czy każdy symbol jest uważany za bytegolfa w kodzie? Ponieważ niektóre z twoich postaci wymagają więcej niż jednego bajtu. Nie mam zamiaru
ćpać,
Dobre pytanie! „Bajt” w golfie odnosi się do minimalnego rozmiaru pliku wymaganego do przechowywania programu. Tekst używany do wizualizacji tych bajtów może być dowolnym bajtem. Wybrałem Code Page 437 do wizualizacji moich skryptów, ale ważną częścią są rzeczywiste bajty, które definiują kod źródłowy.
maxb
Dobrym przykładem różnej liczby znaków i liczby bajtów jest ta odpowiedź. Tutaj 'ԓ'znak ma w rzeczywistości 2 bajty, ale reszta to 1 bajt.
maxb
1

Dalej (gforth) , 76 bajtów

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

Wypróbuj online!

Wyjaśnienie

Rozpoczyna licznik od 1 i zwiększa go w pętli. Przy każdej iteracji sprawdza, czy wartość bezwzględna pierwiastka kwadratowego licznika - najbliższa liczba całkowita jest mniejsza niż k

Objaśnienie kodu

: 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
reffu
źródło
1

Galaretka , 13 bajtów

Nie udało mi się uzyskać nic bardziej zwięzłego niż to samo podejście co alephalpha
- idź głosować jego odpowiedź Mathematica !

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

Wypróbuj online!

W jaki sposób?

²;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) 
Jonathan Allan
źródło
1

Japt , 14 bajtów

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

Spróbuj

_=¬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
Kudłaty
źródło