Manchmal muss man beim Golfen eine große Zahl (en) in seinem Code darstellen. Wenn Sie sie so schreiben, wie sie sind, kann sich die Anzahl der Bytes erheblich erhöhen.
Welche allgemeinen 1 Tipps haben Sie für die übersichtliche Darstellung langer Zahlen im Code?
Bitte posten Sie einen Tipp pro Antwort.
1 Mit allgemeinen , ich meine Tipps , die eine einzige Sprache auf mehr als angewendet werden kann. Für sprachspezifische Tipps posten Sie in ihrem jeweiligen Thread.
Antworten:
Achten Sie auf spezielle Nummern
Einige Sprachen verfügen über integrierte Funktionen für Quadrate, Exponentiation mit Basis 2, n- te Primzahl, Fakultät oder andere Prozeduren, die große Zahlen erzeugen können. Überprüfen Sie, ob Ihre Nummer in eine dieser Kategorien fällt .
Andernfalls kann es vorkommen, dass eine größere Anzahl für Ihre Zwecke geeignet ist und stattdessen verwendet werden kann.
quelle
1.01e6
Iterationen ausreichen, werden1e7
3 Byte auf Kosten der Laufzeit eingespart.Verwenden Sie bitweise Boolesche Operatoren
Einige Sprachen haben bitweise AND, OR, XOR und manchmal NOT.
Wenn Sie eine bestimmte große Zahl als bitweise Kombination aus einem Exponentierungsergebnis oder einer Linksverschiebung und einer anderen Zahl ausdrücken, können Sie genau die Zahl finden, die Sie benötigen. Dies lohnt sich normalerweise nur, wenn die Zahlen ziemlich groß werden.
Zum Beispiel
2147483722
ist 10 Bytes, aber2<<30^74
(2 ^ 31 bitweises XOR mit 74) ist nur 8.quelle
bc
. B. ). Und XOR ist niemals nützlicher als+
und-
: In diesem Fall liefern xor und add dasselbe Ergebnis, aber in allen Fällen gibt es eine ganze Zahl, die addiert oder subtrahiert werden kann, um dasselbe Ergebnis wie xor mit einer ganzen Zahl zu erzielen, und die Addition ist nicht größer und manchmal kürzer.1e9^2e9
.9<<49^7<<19
Addition anstelle von xor ausdrücken ?1286561280
in JavaScript und Perl (und wahrscheinlich in anderen Sprachen) ausgewertet , und es ist ein kürzerer Ausdruck, um diesen Wert als den entsprechenden mit+
oder zu erzeugen-
.Verwenden Sie Strings für sich wiederholende Nummern
Bei Zahlen, die sich in der Natur sehr wiederholen, können Sie Strings verwenden und in Integer umwandeln. Zum Beispiel in JavaScript
quelle
1e100/9
in diesem Fall einen sehr großen Bruch verwenden .Verwenden Sie die wissenschaftliche Notation
In der wissenschaftlichen Notation können bei langen Zahlen Bytes gespart werden. Beispielsweise:
quelle
3564e-8
in diesem Fall verwenden?.00003564
, die auch wieder ein Byte kürzer ist.Suchen Sie stattdessen nach einer anderen Nummer
Dies mag nach einer Nichtantwort klingen, aber es ist nicht immer offensichtlich, dass eine größere Zahl durch kürzeren Code berechnet werden kann. Ein Beispiel, an das ich mich erinnere, ist die Ausgabe einer Googol-Kopie eines Strings , bei der die offensichtlichen Antworten die Berechnung von 10 100 erfordern . Wie sich herausstellt, führt die Berechnung eines Vielfachen von 10 100 zu einer ebenso korrekten, aber in einigen Sprachen kürzeren Antwort. Dennis 'Antwort dort verwendet 100 100 , meine eigene 250 255 .
quelle
es
wenn Sie nur eine große Zahl benötigen, sich aber nicht um deren Wert kümmern (oder dass er immer derselbe ist).Basiskomprimierung
Basis-Dekomprimierungscode kann ziemlich komplex sein, aber wenn Sie eine wirklich enorme Anzahl haben, kann es manchmal hilfreich sein, ihn in einer Basis höher als 10 zu komprimieren.
Es hilft auch, dass in einigen Sprachen der Basiskomprimierungscode sehr einfach ist. Zum Beispiel hat PHP
base64_decode(_)
, Pythonint(_,36)
, JavaScriptparseInt(_,36)
und viele Golf-Sprachen haben eine integrierte Basis-Dekomprimierung. Zum Beispiel in CJam:Dies enthält eine nicht druckbare. Probieren Sie es online!
Dies ergibt:
quelle
Verwenden Sie exponentielle Brüche für große sich wiederholende Zahlen
Angenommen, Sie wollten die Zahl aus 100 Einsen generieren. Sie könnten verwenden
int("1"*100)
,+"1".repeat(100)
etc. , aber Sie können auch die Vorteile aus der Tatsache ziehen , dass es ganz in der NäheDies funktioniert am besten bei sich sehr wiederholenden Zahlen, z. B. solchen, die aus einer einzelnen Ziffer bestehen. Ein paar wiederholte Ziffern funktionieren auch ziemlich gut:
Gelegentlich finden Sie ein anderes seltsames Muster, das auch in dieser Methode ziemlich knapp dargestellt werden kann. Wenn Sie
int("123456790"*11)
zum Beispiel zufällig brauchen :Seien Sie jedoch vorsichtig: Zahlen wie
int("1234567890"*10)
haben keine so einfache Darstellung.quelle
Verwenden Sie die bitweise Linksverschiebung für die Potenzierung von 2
Es gibt zwar viele Sprachen, die den Operator Exponentiation unterstützen, einige jedoch nicht. Und diejenigen, die dies nicht tun, erfordern normalerweise aufrufende Funktionen (oder Klassen- / Objektmethoden), die einige Bytes kosten können.
Sie können jedoch einige Bytes einsparen, wenn Sie 2 mit dem Operator Bitwise Left Shift as zur Potenz n erhöhen müssen . Beachten Sie, dass Sie dadurch nur Bytes sparen, wenn n größer oder gleich 17 ist. Dies spart jedoch immer Bytes, wenn n dynamisch ist. Einige Beispiele:
<<
1<<n
quelle
8<<9 // 4096
können, sodass wir bis zu99<<61
6 Bytes erreichen können, was einer6,917,529,027,641,081,856
Einsparung von 13 Bytes entspricht!Chinesischer Restsatz
Wenn häufig beliebige große Ganzzahlen auftreten oder die Darstellung großer Ganzzahlen in der Zielprogrammiersprache zu viele Bytes kostet, können Sie den chinesischen Restsatz in Betracht ziehen.
Wählen Sie paarweise relativ Primzahlen m i > = 2, und Sie können eine große Zahl von 0 bis 1 cm (m 1 , m 2 , ..., m i ) -1 ausdrücken
Zum Beispiel wähle ich 2, 3, 5, 11, 79, 83, 89, 97, dann kann ich eine Zahl kleiner als 18680171730 eindeutig ausdrücken. 10000000000 (1e10) kann ausgedrückt werden als 0,1,0,1,38,59,50,49 (1e10 mod 2, 3 ..., 97), die nicht als spezielle Big Integer-Klasse / Struktur ausgedrückt werden müssen, die möglicherweise speichern Einige Bytes in einigen Programmiersprachen.
Addition und Subtraktion können direkt mit dieser Darstellung erfolgen. Beispiel:
quelle
Verwenden Sie String Padding (wo möglich)
Wenn eine große Zahl eine sich wiederholende Ziffer am Anfang oder Ende enthält, können Sie möglicherweise Bytes speichern, indem Sie eine der Auffüllmethoden Ihrer Sprache verwenden, um eine Zeichenfolge der gesuchten Zahl zu erstellen, die Sie dann in eine umwandeln können ganze Zahl.
Beispiel
So generieren Sie die Anzahl
1111111111111111111111112
(25 Byte) in JavaScript (ES8):quelle
Verwenden Sie Exponenten
Wenn Ihre Sprache einen Exponentenoperator hat, können Sie ihn möglicherweise verwenden, um die gewünschte Zahl zu generieren, oder um eine einfache Berechnung durchzuführen. Auch ohne Operator können Sie möglicherweise weiterhin Bytes mit einer integrierten Funktion oder Methode speichern.
Beispiel
Der maximale sichere ganze Zahl in JavaScript ist
9007199254740991
, die lange 16 - stellig ist. In ES7 kann dies mit den folgenden 7 Bytes berechnet werden:Das Äquivalent in ES6 und früheren Versionen, obwohl es in diesem Fall dieselbe Länge wie die Ganzzahl selbst hat, zeigt, dass die Verwendung einer ausführlicheren Methode möglicherweise keine Bytes kostet.
Das Obige kann jedoch kürzer
Math
ausfallen, wenn Sie sich beispielsweise bereits an einer anderen Stelle in Ihrem Code auf ein einzelnes Zeichen festgelegt haben.quelle
Verwenden Sie Fraktionen anstelle von Float
Beispiel:
1./3
anstelle von0.333333333
quelle