Gegeben seien zwei beliebig genaue dezimale Zahlen 0 ≤ x < y ≤ 1, berechnen die kürzeste (in Ziffern) binäre Zahl b so dass x ≤ b < y .
Geben Sie die Binärziffern von b nach dem Binärpunkt als Array oder als Zeichenfolge aus Nullen und Einsen aus. Beachten Sie, dass das leere Array 0,0 bedeutet, da nachgestellte Nullen gelöscht werden. Dies stellt auch sicher, dass es für jeden Bereich eine eindeutige richtige Antwort gibt.
Wenn Sie mit binären Bruchzahlen nicht vertraut sind, funktionieren sie genau wie Dezimalzahlen:
Base 10 0.625 = 0.6 + 0.02 + 0.005 = 6 x 10^-1 + 2 x 10^-2 + 5 x 10^-3
Base 2 0.101 = 0.1 + 0.00 + 0.001 = 1 x 2^-1 + 0 x 2^-2 + 1 x 2^-3
| | |
v v v
Base 10 0.625 = 0.5 + 0 + 0.125
Integrierte Funktionen, die dieses Problem trivialisieren, sind nicht zulässig.
Beispiele:
0.0, 1.0 -> ""
0.1, 1.0 -> "1"
0.5, 0.6 -> "1"
0.4, 0.5 -> "0111"
Der kürzeste Code gewinnt.
(0.98983459823945792125172638374187268447126843298479182647, 0.98983459823945792125172638374187268447126843298479182648)
? Auch Testfälle wären hilfreich.Antworten:
CJam, 46
Probieren Sie es online aus
Erläuterung:
Die allgemeine Idee ist: multiplizieren beide Zahlen um 10 einige groß genug Exponent ganze Zahlen zu erhalten, mehrfach wieder um 2 einen weiteren großen genug Exponenten zu „make room“ für Binärzahlen in integer Form, integer-divide zurück um 10 der erste Exponent , verringern die Zahlen (um zum Fall "x <b ≤ y" zu gelangen) und konvertieren Sie die Ergebnisse in Basis 2. Suchen Sie die erste andere Ziffer (sie ist 0 in der ersten Zahl und 1 in der zweiten Zahl) und drucken Sie alle Ziffern aus von der zweiten Nummer bis einschließlich dieser.
Bevor ich mit den Multiplikationen beginne, addiere ich 3 zu den ganzzahligen Teilen, um sicherzustellen, dass die Ergebnisse nach dem Dekrementieren die gleiche Anzahl von Binärziffern (ohne führende Nullen) haben. Am Ende überspringe ich die ersten 2 Binärziffern, um dies zu kompensieren.
quelle
Ruby,
138132 Bytes13 Bytes für das
-rbigdecimal
Flag hinzugefügt . Erwartet die Eingabe als zweiBigDecimal
s.Probelauf:
Erläuterung:
quelle
Mathematica, 72 Bytes
Erläuterung
Die Methode besteht darin, den kleinsten
2^n
Formmultiplikator zu finden, der die Lücke zwischen zwei Eingangszahlen vergrößert, so dass er eine ganze Zahl enthält.Zum Beispiel
16*{0.4,0.5} = {6.4,8.}
enthält7
, so lautet die Antwort7/16
.Testfall
quelle
JavaScript (ES6), 144 Byte
Nimmt die Eingabe im Formular an
0.<digits>
(oder1.<zeros>
ist akzeptabel füry
).d
ist eine Funktion, die den Dezimalteil einer Zahl nimmt und verdoppelt und dann nachgestellte Nullen abschneidet. Die führende Ziffer muss vorhanden sein, wird jedoch ignoriert. Praktischerweised("0.0")
ist es leer, und dies wird daher als Test verwendet, um festzustellen, obx
es sich um einen exakten binären Bruch handelt. in diesem Fallb
hält bereits das Ergebnis. Andernfalls gibt es einen etwas komplizierten Test, um festzustellen, ob das Suffix a1
tob
zur Unterscheidung zwischenx
und dienty
; wenn ja, wird das zurückgegeben. Andernfalls wird das MSB vonx
an das Ergebnis angehängt und die Funktion ruft sich rekursiv auf, um das nächste Bit zu verarbeiten.Wenn wir stattdessen wünschen, dass
x < b ≤ y
die Funktion viel einfacher ist, so etwas (ungetestet):quelle