Wir hatten einige Herausforderungen bei der Basiskonvertierung, aber alle scheinen auf ganzzahlige Werte zuzutreffen. Lass es uns mit reellen Zahlen machen!
Die Herausforderung
Eingänge:
- Eine echte positive Zahl x , ausgedrückt in Basis 10. Diese Zahl kann als Gleitkomma mit doppelter Genauigkeit oder als Zeichenfolge verwendet werden. Um Genauigkeitsprobleme zu vermeiden, kann davon ausgegangen werden, dass die Anzahl größer als 10 –6 und kleiner als 10 15 ist .
- Eine Zielbasis b . Dies ist eine ganze Zahl von 2 bis 36.
- Eine Anzahl von Nachkommastellen n . Dies ist eine ganze Zahl von 1 bis 20.
Ausgabe: Die Darstellung von x in der Basis b mit n Nachkommastellen.
Bei der Berechnung des Ausgabeausdrucks sollten die Ziffern nach dem n- ten abgeschnitten (nicht gerundet) werden. Zum Beispiel x = 3.141592653589793
in base b = 3
is 10.0102110122...
, also für n = 3
die Ausgabe wäre 10.010
(Trunkierung), nicht 10.011
(Rundung).
Für x und b , die eine endliche Anzahl von Stellen im Bruchteil ergeben, ist auch die entsprechende unendliche Darstellung (auf n Stellen gekürzt) zulässig. Beispielsweise kann 4.5
dezimal auch dargestellt werden als 4.49999...
.
Sorgen Sie sich nicht um Gleitkommafehler .
Eingabe- und Ausgabeformat
x wird ohne führende Nullen angegeben. Wenn x zufällig eine Ganzzahl ist, können Sie davon ausgehen, dass sie mit einem Dezimalteil ( 3.0
) oder ohne Dezimalteil ( 3
) angegeben wird.
Die Ausgabe ist flexibel. Zum Beispiel kann es sein:
- Ein String, der die Zahl mit einem geeigneten Trennzeichen (Dezimalpunkt) zwischen ganzzahligen und gebrochenen Teilen darstellt. Ziffern
11
,12
usw. (für b über 10) als Buchstaben dargestellt werdenA
,B
wie üblich, oder wie andere eindeutige Zeichen (bitte angeben). - Eine Zeichenfolge für den ganzzahligen Teil und eine andere Zeichenfolge für den Bruchteil.
- Zwei Arrays / Listen, eine für jeden Teil, die Zahlen von
0
bis35
als Ziffern enthalten.
Die einzigen Einschränkungen bestehen darin, dass der ganzzahlige und der gebrochene Teil voneinander getrennt werden können (geeignetes Trennzeichen) und dasselbe Format verwenden (z. B. nein [5, 11]
für die Liste, die den ganzzahligen Teil darstellt, und ['5', 'B']
für die Liste, die den gebrochenen Teil darstellt).
Zusätzliche Regeln
- Programme oder Funktionen sind in jeder Programmiersprache zulässig . Standardlücken sind verboten.
- Kürzester Code in Bytes gewinnt.
Testfälle
Die Ausgabe wird als eine Zeichenfolge mit Ziffern dargestellt 0
, ..., 9
, A
, ..., Z
unter Verwendung .
als Dezimal - Trennzeichen .
x, b, n -> output(s)
4.5, 10, 5 -> 4.50000 or 4.49999
42, 13, 1 -> 33.0 or 32.C
3.141592653589793, 3, 8 -> 10.01021101
3.141592653589793, 5, 10 -> 3.0323221430
1.234, 16, 12 -> 1.3BE76C8B4395
10.5, 2, 8 -> 1010.10000000 or 1010.01111111
10.5, 3, 8 -> 101.11111111
6.5817645, 20, 10 -> 6.BCE2680000 or 6.BCE267JJJJ
0.367879441171442, 25, 10 -> 0.94N2MGH7G8
12944892982609, 29, 9 -> PPCGROCKS.000000000
quelle
42, 13, 1
wir haben33
statt33.0
?n
Dezimalstellen haben mussAntworten:
Gelee , 16 Bytes
Probieren Sie es online!
Beachten Sie, dass Singletons als Element in der Ausgabe gedruckt werden.
quelle
JavaScript (ES8),
817471 ByteFunktioniert
x
zwischen1e-6
und1e21
,b
von2
bis36
(genau wie erforderlich) undn
von1
bis10
,48
abhängig von der Basis, bevor sich Gleitkommafehler einschleichen. Bearbeiten: 7 Bytes mit Hilfe von @Birjolaxew gespeichert. Weitere 3 Bytes mit Hilfe von @tsh gespeichert. Die vorherige 74-Byte-Version arbeitete auch mit negativen Zahlen:quelle
n
"Ziffern" aus einer Zeichenfolge zu extrahieren ..toString(b)
... dumm von mir> _ <Python 2 ,
153149144137135109 BytesHätte nicht gemerkt, dass ich die Ziffern einfach als Zahlen zurückgeben kann, das macht es viel einfacher. Gibt zwei Ziffernlisten zurück, die erste für den ganzzahligen Teil und die zweite für den Bruchteil.
Probieren Sie es online!
quelle
1e-6
(und kleiner als1e15
(wie zuvor)) sindPerl 6 , 25 Bytes
Versuch es
Erweitert:
Beachten Sie, dass das Leerzeichen so ist, dass es als
(+x).base(b,n)
nicht analysiert wird
+( x.base(b,n) )
.quelle
1e-6
(und kleiner als1e15
, wie zuvor)Mathematica, 158 Bytes
da diese herausforderung in mathematica von kelly powder bereits eine sehr gute antwort erhalten hat, habe ich versucht, (mit einem anderen ansatz) die exakten ergebnisse zu erzielen, die in den testfällen gezeigt werden
Eingang
Ausgabe
quelle
Ruby , 45 Bytes
Warum?
Da b ^ n in der Basis b 10 ^ n ist, multiplizieren wir x mit dieser Zahl und fügen dann den Dezimalpunkt hinzu, zu dem es gehört.
Probieren Sie es online!
quelle
.round
durch.to_i
; Dies korrigiert die letzte Stelle der Ausgabe für diejenigen, bei denen sie nicht mit den Testausgaben übereinstimmt. -1 Byte mehr mit.insert ~n,?.
, ohne Klammer.C (gcc) ,
157152 BytesBenötigt 64 Bit
long int
für größere Testfälle.-5 Bytes danke an Peter Cordes
Probieren Sie es online!
edit: ein paar bytes können rasiert werden, wenn zwei strings ausgegeben werden dürfen, die durch ein newline separator getrennt sind:
149 Bytes:
edit: diese einsendung ist nicht die längste, yay!
quelle
printf(z+r)
wenn es keine%
Zeichen enthält. (Dies ist Code-Golf; Sicherheit und bewährte Verfahren gehen aus dem Fenster: P). Sie können auch verwendenputs(z+r)
, um eine neue Zeile kostenlos zu erhalten (Speichern derputs("")
in der zweiten Version).float
ist kürzer alsdouble
, aber es scheint, dass die Frage einedouble
oder eine Zeichenfolge erfordert.long
und gemäß den Code-Golf-Regeln ist dies alles, was Sie brauchen, um eine gültige Antwort zu erhalten. (Es ist auch üblich, dass C- und C ++ - Code-Golf-Antworten 64-Bit annehmenlong
, da dies von Try It Online verwendet wird.) Ich empfehle, die Bearbeitung zurückzusetzen und nur eine Notiz wie "long
muss 64-Bit sein " hinzuzufügen dies, um die größeren Testfälle zu unterstützen. "Mathematica 47 Bytes
RealDigits
Zweimal aufrufen, um zuerst die Anzahl der Stellen links von der Dezimalstelle zu ermitteln.quelle
1e-6
(und kleiner als1e15
, wie zuvor)TakeDrop@@RealDigits[##]
& aber dann wurde mir klar, dass ich Dinge falsch verstanden habe - Ihre Lösung scheint optimal zu sein.SageMath , 68 Bytes
Probieren Sie es online!
quelle
1e-6
(und kleiner als1e15
, wie zuvor)Haskell , 188 Bytes
Probieren Sie es online!
g
wandelt eine Zahl in eine Liste um, die diese Zahl in einer gegebenen Basis darstelltz
ordnet ganze Zahlen Buchstaben zu (36 = .
)h
Wendet die vorherigen Funktionen auf den ganzzahligen und den gebrochenen Teil einer Zahl an.quelle
Axiom, 566 Bytes
Diese Frage war besonders schwierig. Nach einiger Zeit in etwas schreiben, die richtigen Ergebnisse scheint es mit einem Makro für die Erhaltung der Ziffern () zu erzeugen ... es wird nicht zu viel Golf gespielt ... Ergebnisse:
Das eigentliche Ziel ist eine Funktion, die jedes Float [mit k: = Ziffern ()] oder jede berechnete Zahl als% pi oder% e oder die Division von zwei float / int wie in 1./3 in Basis 2..36 umwandelt . ['oo' Ziffern]
quelle
Axiom, 127 Bytes
Ergebnisse
Es hat ein kleines Problem für das letzte Null-Beispiel
Würde '4.5' und nicht '4.50000' zurückgeben
quelle