Wie viele Dezimalstellen gibt es, bevor ich beim Runden 1 hinzufügen muss?

10

Wenn Sie eine Zahl runden und die nächste Ziffer ist >= 5, fügen Sie 1 hinzu. Zum Beispiel:

3.1415926535 rounded to 1dp is 3.1
3.1415926535 rounded to 4dp is 3.1416    <-- Note the 5 changed to 6
3.1415926535 rounded to 5dp is 3.14159

3.1415926535 rounded to 9dp is 3.141592654  <-- Note the 3 changed to 4

Ihre Herausforderung besteht darin, eine Ganzzahl als Eingabe zu erhalten und die Anzahl der Dezimalstellen auszugeben, vor denen Sie die Quadratwurzel der Zahl runden müssten - dh die Anzahl der Dezimalstellen vor einer vorkommenden Ziffer >= 5.

Die Ganzzahl liegt zwischen 0 und einschließlich 100.000, sodass Sie für den Randfall 59752 17 Dezimalstellen unterstützen müssen (um die 17. zu überprüfen).

Wenn Ihre Programmiersprache die Anzahl der Dezimalstellen nicht ändern kann, können Sie ein "?" Nachricht an den Benutzer.

Beispiel:

Input    Root                     Output

    5 -> 2.23 606797749979     -> 2
   41 -> 6.40312423 743284     -> 8      (Largest gap under 100)
  596 -> 24.4131112314 674     -> 10     (Largest gap under 1000)
59752 -> 244.44222221212112029 -> 16     (Largest gap under 100000)

Mach was du willst auf perfekten Quadraten.

Dies ist also gewinnt der kürzeste Code.


Für alle Interessierten ist die Zahl 310.617 die größte unter 1.000.000 und hat 18, bevor Sie eine Ziffer erreichen >= 5.

Tim
quelle
Wie viele Dezimalstellen müssen wir maximal unterstützen? - Keine Sprachen werden mit unendlicher Präzision gespeichert.
Blau
Unsicher warum, aber ich bekomme 17 Ziffern für SQRT (59752) (in zwei verschiedenen Sprachen). Die anderen Ergebnisse kommen richtig heraus.
Jonathan Leech-Pepin
@ JonathanLeech-Pepin Enthältst du aus irgendeinem Grund die letzte Ziffer? oder unterstützt Ihr Programm nicht genügend Dezimalstellen?
Tim
Es hat nie eine Ziffer größer als 5. Mein Programm wird zum Beispiel mit -1
Blue
@muddyfish das ist in Ordnung.
Tim

Antworten:

2

Pyth, 13 Bytes

f<5e@=*QC\d2Z

Testsuite

Beginnen Sie mit Qgleich der Eingabe. Bei jedem Zeitschritt Qmit 100 multiplizieren , berechnet als chr('d'). Nimm seine Quadratwurzel. Nimm diesen Mod 10. Wenn das Ergebnis größer als ist 5, beende. Drucken Sie die Anzahl der Iterationen, die zum Beenden erforderlich waren, mit einem Index von 0.

Im Detail:

f<5e@=*QC\d2Z
                   Q = eval(input())
f           Z      Filter for the first truthy result over the infinite sequence
                   starting at Z (= 0)
     =*Q           Q *=
        C\d             chr('d') (= 100)
                   ---------------------
    @  Q   2          Q ^ (1/2)
   e                            % 10
 <5               5 <
isaacg
quelle
1

CJam, 29 26 28 Bytes

rimqs_'.+'.#)>{'5<}%0#]W'?er

Probieren Sie es online aus.

Setzt ein "?" Wenn die Zahl nicht erscheint, kann sie aufgerundet werden (perfektes Quadrat oder zu lang).

Geokavel
quelle
1

Pyth, 22 Bytes

J`%@Q2 1x.e<\4@Jbr2lJ1

Erläuterung

                       - Autoassign Q to evaluated input
   @Q2                 - Get the square root of Q
J`%    1               - Get the stuff after the decimal point and put it in a string. Store in J
         .e      r2lJ  - Create a range between 2 and the length of the string (forget about the 0. bit) and enumerate over it
              @Jb      - Get the current decimal place
           <\4         - Is it bigger than 4
        x            1 - Find the position of the first True value

Ich bin absolut sicher, dass dies Golf gespielt werden kann. Wenn die Eingabe keine höhere Ziffer als 4 hat, wird -1 ausgegeben. Unterstützt 17dp.

Blau
quelle
1

Javascript, 59 Bytes

f=a=>(a=/\.(.*?)[5-9]/.exec(Math.sqrt(a)),a?a[1].length:'?')

Gibt ?für 59752 zurück, da JavaScript nur doppelte Genauigkeit verwendet.

Neil
quelle
1

Linux-Shell, 52 Bytes

dc -e'34k?vp'|cut -d. -f2|sed 's/.[5-9\s].*//'|wc -m

Ich habe versucht, eine reine dcLösung zu finden, bin aber gescheitert. Die Präzision ist einstellbar (erste Nummer).

Da das OP freundlicherweise festlegt, dass "Sie auf perfekten Quadraten tun können, was Sie wollen", gibt diese Lösung in diesem Fall die Genauigkeit + 1 aus, in diesem Fall 35.

Félix Saparelli
quelle
1

Mathematica 60 Bytes

(Position[Drop@@RealDigits[N[Sqrt@#,99]],x_/;x>4][[1,1]]-1)&

Beispiel

(Position[Drop@@RealDigits[N[Sqrt@#, 99]], x_ /; x > 4][[1, 1]] - 1) &[59752]

16

DavidC
quelle
Sie können das Leerzeichen um das entfernen Apply.
LegionMammal978
Vielen Dank. Die Byteanzahl bleibt gleich, da ich diese Leerzeichen nicht gezählt habe.
DavidC
-2

Ruby, 46 Bytes

Dies ist möglicherweise nicht gültig, da es nur 16 Stellen passt.

p (gets.to_i**0.5).to_s.split('.')[1]=~/[5-9]/
MegaTom
quelle
Was ist die Ausgabe auf 59752?
Tim
nil, da sich in der gesamten Zeichenfolge keine Ziffer nach 4 befindet. Dies kann von der Ruby-Version abhängen.
MegaTom
Es muss 59752 unterstützen - braucht also 17 dps
Tim