Quadratwurzelabstand von ganzen Zahlen


20

kSuchen Sie bei gegebener Dezimalzahl die kleinste Ganzzahl n, sodass die Quadratwurzel von ninnerhalb keiner Ganzzahl liegt. Der Abstand sollte jedoch ungleich Null sein - nkann kein perfektes Quadrat sein.

Vorausgesetzt k, eine Dezimalzahl oder ein Bruch (je nachdem, was für Sie einfacher ist), sodass 0 < k < 1die kleinste positive Ganzzahl ausgegeben wird, nsodass die Differenz zwischen der Quadratwurzel von nund der nächsten Ganzzahl zur Quadratwurzel von nkleiner oder gleich, kaber ungleich Null ist .

Wenn idie nächste Ganzzahl zur Quadratwurzel von ist n, suchen Sie nach der ersten nWo 0 < |i - sqrt(n)| <= k.

Regeln

  • Sie können nicht die unzureichende Implementierung von nicht ganzzahligen Zahlen in einer Sprache verwenden, um das Problem zu trivialisieren.
  • Andernfalls können Sie davon ausgehen, dass dies kbeispielsweise bei der Gleitkommarundung keine Probleme verursacht.

Testfälle

.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

Kommagetrennte Testfall-Eingaben:

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

Das ist , also gewinnt die kürzeste Antwort in Bytes.

Antworten:


18

Wolfram Language (Mathematica) , 34 Byte

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

Probieren Sie es online!

Erläuterung

Das Ergebnis muss für einige m N die Form m2±1 . Lösen der Ungleichungen mNm2+1mkundmm21k, wir erhaltenm1k22k und2 km1+k22k . Das Ergebnis ist alsomin(1k22k2+1,1+k22k21).


8

Python , 42 Bytes

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

Probieren Sie es online!

Basierend auf der Formel von Alephalpha wird explizit überprüft, ob wir über die Bedingung im Fall m21 oder m2+1 sind k<1/k%2<2-k.

Python 3.8 kann ein Byte mit einer Inline-Zuweisung speichern.

Python 3.8 , 41 Bytes

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

Probieren Sie es online!

Diese schlagen meine rekursive Lösung:

50 Bytes

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

Probieren Sie es online!


4

05AB1E , 16 Bytes

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

Port of @alephalphas Mathematica-Antwort , inspiriert von @Soks Pyth-Antwort , also stelle sicher, dass beide positiv bewertet werden!

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

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)

Schön, danke, dass du die Antwort mit der verwendeten Formel verknüpft hast. Ich machte mentale Gymnastik, um die Formel aus 05AB1Es ungewöhnlicher Syntax herauszufinden.
Magic Octopus Urn

3

JavaScript (ES7),  51  50 Bytes

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

Probieren Sie es online!

(schlägt fehl für die Testfälle, die zu viel Rekursion erfordern)


Nicht rekursive Version,  57  56 Bytes

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

Probieren Sie es online!

Oder für 55 Bytes :

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

Probieren Sie es online!

(aber dieser ist deutlich langsamer)



3

Japt , 18 16 Bytes

-2 Bytes von Shaggy

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

Probieren Sie es online!


Könnte mit Arnauld's Lösung kürzer sein
ASCII


Oh ... natürlich hätte ich das umkehren können:. Auch das %1 &&ist böse, nicht sicher, ob die Verwendung von Arnauld's Lösung kürzer wäre (vielleicht auch nicht)
ASCII

16 Bytes durch Neuzuweisung Z¬u1zu ZBeginn der Funktion.
Shaggy

Die andere Methode scheint 26 zu sein:[1,-1]®*U²Ä /U/2 c ²-Z} rm
Nur ASCII

3

Pyth, 22 21 Bytes

hSm-^.Ech*d^Q2yQ2d_B1

Versuchen Sie es online hier oder überprüfen alle Testfälle auf einmal hier .

Ein weiterer Hafen von alephalpha die ausgezeichnete Antwort , stellen Sie sicher , dass sie eine upvote macht!

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

Bearbeiten: Dank Kevin Cruijssen wurde ein Byte gespeichert


1
Ich kenne Pyth nicht, aber ist es auch möglich, [-1,1]in 3 Bytes zu erstellen , oder benötigen Sie eine zusätzliche Umkehrung, damit es zu 4 Bytes wird? Wenn es in 3 Bytes möglich ist, könnten Sie das tun und dann das *_dto *dund das +dto ändern -d. Hat Pyth nicht auch ein eingebautes Minimum, anstatt zuerst zu sortieren und zu nehmen?
Kevin Cruijssen

1
@KevinCruijssen Die Reihenfolge der beiden Elemente ist nicht wichtig, da wir das Minimum nehmen, obwohl ich mir keine Möglichkeit vorstellen kann, das Paar in 3 Bytes zu erstellen. Ein guter Haken, - ... dwenn ich es in ändere, das spart mir ein Byte! Vielen Dank
Sok

@ KevinCruijssen Auch gibt es leider kein einziges Byte minimale oder maximale Funktion: o (
Sok

1
Ah, natürlich. Sie ordnen die Werte zu, es spielt also keine Rolle, ob es sich um [1,-1]oder handelt [-1,1]. Ich habe das *dund -dmit meiner 05AB1E-Antwort verglichen, bei der ich keine Karte verwende, aber ein 2D-Array von einem anderen 2D-Array subtrahieren / mit diesem multiplizieren kann, sodass ich keine Karte benötige. Ich bin froh, dass ich in diesem Fall helfen konnte, ein Byte zu speichern. :) Und danke für die Inspiration für meine 05AB1E Antwort.
Kevin Cruijssen

3

Perl 6 , 34 33 29 Bytes

-1 Byte danke an Grimy

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

Probieren Sie es online!


-1 Byte durch Ersetzen >=durch >. Quadratwurzeln von Ganzzahlen sind entweder ganzzahlig oder irrational, so dass der Gleichheitsfall nachweislich nicht eintreten kann.
Grimmy

1
@ Grimy Danke, dies scheint nach den Herausforderungsregeln erlaubt zu sein. (Obwohl Gleitkommazahlen natürlich immer rational sind.)
nwellnhof

2

APL (Dyalog Unicode) , 27 Byte SBCS

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

Probieren Sie es online!

Monadischer Zug, der ein Argument nimmt. Dies ist eine Antwort von Alephalpha .

Wie:

⌊/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 Byte

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

Probieren Sie es online!

-4 Bytes dank Kevin Cruijssen!


Sie können ein Byte speichern, indem Sie das n++in die Schleife setzen, damit das Byte -1aus der Rückgabe entfernt werden kann: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

Auch das 0d+kann entfernt werden, oder nicht?
Kevin Cruijssen

@KevinCruijssen Ja , es kann, ich nur vergessen , das nwar schon eine Doppel
Verkörperung der Ignoranz



1

MathGolf , 16 Bytes

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

Probieren Sie es online!

Kein großer Fan dieser Lösung. Es ist ein Port der 05AB1E-Lösung, die auf derselben Formel basiert, die die meisten Antworten verwenden.

Erläuterung

²                  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

Wird jedes Symbol als byteIn-Code-Golf angesehen? Weil einige Ihrer Charaktere mehr als ein einzelnes Byte benötigen. Ich meine nicht, dass ich nichts
aussuchen soll

Gute Frage! Ein "Byte" beim Golfen bezieht sich auf die minimale Dateigröße, die zum Speichern eines Programms erforderlich ist. Der zur Visualisierung dieser Bytes verwendete Text kann ein beliebiges Byte sein. Ich habe Codepage 437 gewählt , um meine Skripte zu visualisieren, aber der wichtige Teil sind die tatsächlichen Bytes, die den Quellcode definieren.
27.

Ein gutes Beispiel für die Anzahl der Zeichen und die Anzahl der Bytes, die unterschiedlich sind, ist diese Antwort. Hier ist das 'ԓ'Zeichen eigentlich 2 Bytes, aber der Rest sind 1-Byte-Zeichen.
27.

1

Viertens (gviertens) , 76 Bytes

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

Probieren Sie es online!

Erläuterung

Startet einen Zähler bei 1 und erhöht ihn in einer Schleife. Bei jeder Iteration wird geprüft, ob der absolute Wert der Quadratwurzel des Zählers - die nächste Ganzzahl ist kleiner als k - ist

Code Erklärung

: 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

Jelly , 13 Bytes

Ich habe es nicht geschafft, einen genaueren Ansatz als Alephalpha zu finden
- stimme seiner Mathematica-Antwort zu !

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

Probieren Sie es online!

Wie?

²;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 Bytes

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

Versuch es

_=¬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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.