Beim Schreiben von Code-Golf- Programmen verwende ich normalerweise einige numerische Konstanten. Ich habe sie immer in Dezimalzahlen angegeben, weil ich so denke, aber ich habe gerade festgestellt, dass meine Sprache andere Zahlenformate unterstützt, mit denen ich meinen Code möglicherweise leicht verkürzen kann.
Herausforderung
Entscheiden Sie bei einer nicht-negativen Ganzzahl von weniger als 2 ^ 53-1, ob diese Ganzzahl die kürzeste Darstellung hat in:
- Dezimal
- Hexadezimal
- Wissenschaftliche Schreibweise
Dezimal
Da dies das Standardformat meiner Sprache ist, ist für dieses Format keine zusätzliche Notation erforderlich. Jede Zahl wird wie gewohnt als Dezimalzahl dargestellt.
Hexadezimal
Meine Sprachen verwenden das 0x
Präfix für hexadezimale Konstanten. Das heißt, wenn eine Zahl 4 hexadezimale Stellen hat, werden 6 Bytes benötigt, um diese Zahl darzustellen.
Wissenschaftliche Schreibweise
Meine Sprache verwendet das folgende Format für die wissenschaftliche Notation:
[Reale Basis] e [Integer-Exponent von 10]
Beispielsweise 700
würde dargestellt werden als 7e3
, und 699
würde dargestellt werden als 6.99e3
, weil die Basis zwischen -10 und 10 liegen muss (nicht inklusive). Für die Zwecke dieser Abfrage ist die Basis immer mindestens 0, da die eingegebene Zahl nicht negativ ist.
Ausgabe
Sie sollten einen Weg zurückgeben, um zu identifizieren, welches Format am kürzesten ist (dh 0 für Dezimalzahl, 1 für Hexadezimalzahl, 2 für Wissenschaftlichkeit). Alternativ können Sie die kleinste Darstellung der Zahl selbst ausgeben.
Testfälle
Decimal | Hexadecimal | Scientific | Winner
--------------|--------------|-------------------|-------------
0 | 0x0 | 0e0 | Decimal
15 | 0xF | 1.5e1 | Decimal
6999 | 0x1B57 | 6.999e3 | Decimal
7000 | 0x1B58 | 7e3 | Scientific
1000000000000 | 0xE8D4A51000 | 1e12 | Scientific
1000000000001 | 0xE8D4A51001 | 1.000000000001e12 | Hexadecimal
1000000001000 | 0xE8D4A513E8 | 1.000000001e12 | Hexadecimal
1000001000000 | 0xE8D4B45240 | 1.000001e12 | Scientific
Wertung
Das ist Code-Golf , also gewinnt die Antwort in den kürzesten Bytes für jede Sprache.
quelle
2^63-1
Für einige Sprachen kann es schwierig sein, die Anforderungen zu erfüllen . Ziehen Sie in Betracht, dies auf einen niedrigeren Wert zu reduzieren, z. B.2^32-1
(damit die Werte in einen doppelten Gleitkomma-Datentyp passen)double
. Nur ein Vorschlag; tun, was Sie für richtig halten1000001000000
kann auch so geschrieben werden1000001e6
.Antworten:
05AB1E , 23 Bytes
Probieren Sie es online!
-1 danke an Emigna .
0
für hexadezimal,1
für dezimal,2
für wissenschaftlich.quelle
'.ìÁ0
.05AB1E , 27 Bytes
Probieren Sie es online!
Erläuterung
quelle
len(hex(input)) + 2
, wenn das hilft.¹
anstelle vonDs
:g¹hgÌ
Gelee , 28 Bytes
Eine monadischen Verbindung Rückkehr
1
,2
oder3
für hexadezimal, wissenschaftlich oder dezimal.Probieren Sie es online! oder sehen a Testsuite an .
Ich dachte, das wäre kürzer, aber ich kann es nicht sehen, also poste ich.
Wie diese Monstrosität funktioniert ...
quelle
JavaScript (ES6), 90 Byte
Gibt 0 für dezimal, 1 für hexadezimal und -1 für wissenschaftlich zurück.
Code-Snippet anzeigen
Erläuterung
log(n) / log(10)
: Logarithmus zur Basis 10 vonn
; ungefähr die Längen
als Dezimalzahl.log(n) / log(16) + 2
: Logarithmus zur Basis 16 vonn
plus 2; ungefähr die Längen
als Hexadezimalzahl plus der vorangestellten0x
.n.toExponential().length - 1
:n.toExponential()
gibt einen Stringn
im wissenschaftlichen Format (zB7e+3
) zurück, aber wir subtrahieren 1 von seiner Länge, um das Überflüssige zu berücksichtigen+
.Nachdem wir nun die Länge aller 3 Darstellungen
D
habenH
,S
vergleichen wir:S<H?-(S<D):+(H<D)
JavaScript (ES6), 97 Byte
Dieser gibt die Zahl im Format mit der kürzesten Länge aus. Inspiriert von @ Shaggys gelöschtem Versuch .
Code-Snippet anzeigen
quelle
C #
1069796143132 BytesÄrgerlicherweise in C # der
ulong.ToString
Formatbezeichnere
bei höheren Zahlen an Genauigkeit verliert, sodass ich ihn manuell ausführen musste. Es gibt wahrscheinlich einen kürzeren Weg, aber das funktioniert erstmal. Es formatiert es auch falsch für diese Herausforderung, so dass ich die Ausgabe sowieso manuell entfernen müsste.Wenn ich einen String auf den Wert von setze
n
, wievar s=n+"";
es funktioniert mehr wegen der expliziten Rückkehr und zusätzlichen geschweiften Klammern.Es wird der kürzeste Wert aus dem Array jedes anderen Werts zurückgegeben, in dem
[0] = decimal, [1] = hexadecimal, [2] = scientific
.Voll / Formatierte Version:
Die korrekte Methode zur Berechnung des wissenschaftlichen Outputs lautet:
Da
0
es jedoch kürzer ist als0e0
ich, kann ich diesen Sonderfall beseitigen.quelle
Python 2,
83BytesGibt die kleinste Darstellung der Zahl aus.
Probieren Sie es online aus
Ungolfed:
Die Regex entfernt nachgestellte Nullen und den Dezimalpunkt, falls erforderlich, sowie das Pluszeichen und die führende Null vom Exponenten, falls es eine gibt.
quelle
L
an große Zahlen im Eingabebereich angehängt .str
würde das vermeiden.int
Darstellung von Python . Longs beginnen ungefähr bei2**63
.+
Zeichen mit entfernenstr.replace
?+
während ich dabei bin.Ohm , 35 Bytes
Probieren Sie es online!
Ausgänge 0 für dezimal, 1 für hex und 2 für wissenschaftlich.
Erläuterung:
quelle
PHP , 90 Bytes
Gibt 0 als Dezimalzahl, 1 als Hexadezimalzahl und 2 als wissenschaftliche Zahl aus
Im Falle eines Unentschieden wird die höchste Zahl gedruckt
Probieren Sie es online!
PHP , 91 Bytes
Gibt 0 als Dezimalzahl, 1 als Hexadezimalzahl und 2 als wissenschaftliche Zahl aus
Im Falle eines Unentschieden wird die niedrigste Zahl gedruckt
Probieren Sie es online!
PHP , 103 Bytes
Gibt 0 als Dezimalzahl, 1 als Hexadezimalzahl und 2 als wissenschaftliche Zahl aus
Im Falle eines Unentschieden werden alle Zahlen gedruckt
Probieren Sie es online!
PHP , 109 Bytes
Geben Sie ein Array mit den kürzesten Lösungen aus
Probieren Sie es online!
quelle
C
187185 BytesDekomprimiert:
Gibt 0 als Dezimalzahl, 1 als Hexadezimalzahl und 2 als wissenschaftliche Notation aus.
quelle
TI-Basic, 130 Bytes
Oder alternativ:
Oder in hex:
Gibt 0 als Dezimalzahl, 1 als Hexadezimalzahl und 2 als wissenschaftliche Notation aus
quelle