Neulich erklärte mir mein Chemielehrer die wissenschaftliche Notation (indem er eine kleine Zahl verwendete und sie mit Zehnerpotenzen multiplizierte, um große Zahlen leichter auszudrücken), was mich ein paar Jahre zurückbrachte, als ich sie zum ersten Mal lernte. Nachdem wir die Grundlagen erlernt hatten, hatten wir einige typische mathematische Fragen gestellt, von denen einige wie folgt lauteten:
Stellen Sie in der wissenschaftlichen Schreibweise Folgendes dar:
a) 50000000
b) 120000000000000
c) 900000000000000000000000000000000000
d) pi ^ e ^ i ^ j ^ k ^ std :: vector
...
z) 200
...
Und ich dachte: "Was? Uns wurde gesagt, dass die wissenschaftliche Notation verwendet wurde, um das Schreiben großer Zahlen effizienter zu machen, aber einige Fälle sind überhaupt nicht effizienter!"
Betrachten Sie die Nummer
300
und seine Darstellung in wissenschaftlicher Notation:
3x10^2
Was, die wissenschaftlich notierte Version nimmt tatsächlich mehr Platz ein? Das können wir jetzt nicht haben, oder? (Der Platz auf dem Bildschirm ist kostbar.)
Wir könnten selbst bestimmen, ob es platzsparender ist, eine Zahl in wissenschaftlicher Notation zu schreiben oder nicht, oder ...
Aufgabe
Ihr Programm oder Ihre Funktion sollte eine einzelne positive Zahl n
beliebiger Größe (bis zu der von Ihrer Sprache unterstützten Größe) als Eingabe verwenden und die wissenschaftlich notierte Version der Zahl ausgeben.
Wenn die ursprüngliche Nummer n
nach dem Entfernen der nachgestellten Nullen und der nachgestellten Dezimalstelle weniger oder weniger Zeichen als die wissenschaftlich notierte Version enthält, müssen Sie n
stattdessen diese ursprüngliche Nummer ausgeben .
Ihr Code muss so kurz wie möglich sein, da die Ausgabe auch so kurz wie möglich sein muss.
Spezifikationen
Efficient Scientific Notation ist wie folgt definiert:
bx10^e
b
ist die Eingangszahl, die durch Zehnerpotenzen geteilt wird, so dass 1 <= b < 10
. Bei dieser Zahl müssen alle nachgestellten Nullen (und gegebenenfalls der Dezimalpunkt) entfernt werden. Sie muss jedoch die Genauigkeit der ursprünglichen Zahl aufweisen (natürlich bis zum Dezimalpunkt in Ihrer Sprache). Dh 90000
wird 9
, 13.500
wird 1.35
, 0.000675
wird 6.75
usw. Wenn diese Zahl mehr Dezimalstellen enthält, als Ihre Sprache verarbeiten kann, sollte sie auf diese maximale Anzahl von Dezimalstellen gerundet werden.
e
ist der Exponent, auf den zehn erhöht werden n = b x 10^e
(denken Sie daran, dass diese Zahl negativ sein muss, wenn sie n
kleiner als 1 ist). Diese Zahl sollte keine nachgestellten Nullen oder Dezimalstellen enthalten (hauptsächlich, weil etwas nicht stimmt, wenn es sich nicht um eine Ganzzahl handelt ...).
Die Zeichen x10^
müssen so bleiben, wie sie in der Zeichenfolge zwischen b
und stehen e
.
Testfälle
Input -> output
1 -> 1
20 -> 20
3000000 -> 3x10^6
400000 -> 400000
0.008093 -> 0.008093
0.007835000000000 -> 0.007835
0.000003000000 -> 3x10^-6
0.00000065 -> 6.5x10^-7
0 -> 0
Wertung
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
Andere Regeln und Erläuterungen
- Nachgestellte Nullen (und / oder Nachkommastellen) werden nicht auf die Anzahl der Zeichen der ursprünglichen Eingabenummer angerechnet
n
. Beachten Sie dies in Fällen wie Testfall 6 - Sie können davon ausgehen, dass die eingegebene Zahl, wenn sie kleiner als 1 ist, immer mit einer 0 für die Einerstelle beginnt (wie in den Testfällen 5-8).
- Die eingegebene Nummer wird niemals negativ sein
- Eingebaute Elemente, die diese Herausforderung zu trivialen und standardmäßigen Schlupflöchern machen, sind nicht zulässig
- Eine nachfolgende Zeile in der Ausgabe ist OK
EDIT
Dank user81655 für den Hinweis auf Testfälle 7 und 8 hatten falsche Zehnerpotenzen. Ich habe diese jetzt behoben, also stellen Sie sicher, dass Ihr Code sie korrekt auswertet.
pi^e^i^j^k^std::vector
wäre?e
9000 -> 9e3
x10^
. Und es wäre ein gutes Stück Überarbeitung der Frage, die ich jetzt, wo sie veröffentlicht ist, nicht für angemessen halteAntworten:
ES6,
8381 BytesScheitert wahrscheinlich in einigen Randfällen, in denen das
toString
Exponentialformat erforderlich ist.Bearbeiten: 2 Bytes dank @ user81655 gespeichert.
quelle
/
am Ende des regulären Ausdrucks vergessen .x=>(e=s=>s.replace(/e\+?/,'x10^'),z=e(x.toExponential()),y=e(''+x))[z.length]?z:y
Python 3,
346342319302 BytesWahrscheinlich furchtbar golfen, aber hey, das ist mein erster Versuch mit so etwas. Es ist schwer zu lesen, also muss es gut sein.
Soweit mir bekannt ist, sollte es auf jeden Fall funktionieren, auch wenn Python die Tendenz hat, Zahlen über jeden Schwellenwert hinaus automatisch in wissenschaftliche Notation umzuwandeln (außer mit diesem coolen und ausgefallenen 'e'). Ich erinnere mich nicht genau, wie ich dafür gesorgt habe, dass Standardformularnummern zurückgegeben werden können, aber das tut es.
quelle
Perl 6,
96-90BytesIch habe das Gefühl, dass dies kürzer sein könnte, aber dies ist mein Bestes für den Moment
Verwendung : Weisen Sie dies einer Variablen zu
Hier ist es ein bisschen ungolfed mit ein paar schlechten Kommentaren:
quelle
$_ <1
mit1>$_
und1 <=* <10
mit10>*>=1
TI BASIC (nspire): 112 Byte
Erläuterung
Konvertiert die Eingabe mit der Formatfunktion in wissenschaftliche Notation, wenn sie bereits nicht in diesem Format vorliegt, da kleine Dezimalstellen automatisch konvertiert werden.
Findet die Position des ausgefallenen E, das Exponenten bezeichnet, und ersetzt sie durch "x10 ^".
Prüft, welche Ausgabe größer ist und gibt die optimale zurück. Es sei denn, es handelt sich um eine kleine Dezimalstelle, die standardmäßig kleiner ist.
quelle
Python (3.5) 177 Bytes
Eine Lösung mit regulären Ausdrücken
Erläuterung
Import des Regexp-Moduls
Definition der zu ersetzenden Lambda-Funktion
e
durchx10^
Konvertierung des Strings in wissenschaftliche Notation
Entfernen Sie die 0-Füllung in der Originalzeichenfolge
Länge vergleichen
Ergebnisse
quelle