Eine lange Zahl verkürzen

10

Wenn Sie beim Golfen mit Code mit langen Zahlen umgehen, kann es schwierig sein, die Länge Ihres Codes zu verringern. Haben Sie also Tipps, wie Sie eine Zahl kürzer und einfacher verwalten können?

Der folgende Pyth-Code gibt beispielsweise "Hallo Welt" aus, aber bei 44 Byte ist das unbefriedigend:

Vcjkj85942000775441864767076 2 7=k+kCiN2)k

Wie würde ich die lange Zahl verkürzen 85942000775441864767076?

Beta-Zerfall
quelle

Antworten:

10

Perfektes Timing für diese Frage. @isaacg hat heute eine neue Funktion hinzugefügt, mit der sich solche Zahlen immens verkürzen lassen.

Die grundlegende Technik besteht darin, die Zahl in Basis 256 umzuwandeln und in Zeichen umzuwandeln. Sie können dies mit dem Code tun ++NsCMjQ256N. Sie können dann die resultierende Zeichenfolge in Kombination mit verwenden C, was genau das Gegenteil bewirkt (Zeichen in int konvertieren und das Ergebnis als Basis-256-Zahl interpretieren). Sie erhalten also 13 Zeichen : C"2ìÙ½}ü¶d". Einige der Zeichen sind nicht druckbar.

Beachten Sie jedoch, dass ich 13 CHARS sagte, keine Bytes. Wenn ich die Zeichen kopiere und mit https://mothereff.in/byte-counter zähle , werden 13 Zeichen und 18 Bytes angezeigt. Dies ist auf die Zeichencodierung von Zeichen zurückzuführen, die standardmäßig UTF-8 ist. Und UTF-8 erlaubt nur 2 ^ 7 verschiedene 1-Byte-Zeichen. Jedes Zeichen cmit wird ord(c) > 127tatsächlich mit zwei Bytes anstelle von einem gespeichert.

Und hier kommt die neue Funktion von @ isaacg ins Spiel. Er änderte das Standardcodeformat von UTF-8 in iso-8859-1. iso-8859 kann 256 Zeichen mit nur 1 Byte darstellen. Jetzt können Sie also tatsächlich 13 BYTES erreichen. Dies ist jedoch nur mit dem Standard-Compiler möglich , dies funktioniert jedoch nicht im Online-Compiler.

Zuerst möchten Sie die Zahl mit diesem Skript in Hex-Werte konvertieren : jdm.[2.Hd"0"jQ256. Das gibt dir 12 32 ec d9 bd 07 7d fc b6 64. Kopieren Sie diese Zahlen anschließend mit einem Hex-Editor (z. B. Hexedit für Linux) in Ihre Codedatei.

Hexedit-Demonstration

Beachten:

  • Offensichtlich entfernen Sie das "am Ende, wenn die Zeichenfolge der letzte Teil des Codes ist.
  • Dies funktioniert nur, wenn die Basis-256-Darstellung Ihrer Zahlen kein 34(das Byte 22) enthält, da dies das "Zeichen ist und die Zeichenfolge beendet wird. Escaping funktioniert allerdings ( 5C 22).
  • Übrigens, wenn Sie eine Datei mit einem Hex-Editor öffnen, sehen Sie wahrscheinlich das Byte 0Aoder 0d 0aam Ende, das Sie entfernen können. Dies zeigt nur das Zeilenende an.
Jakube
quelle
Ich muss den Offline-Interpreter auf meinem Computer installieren, aber das ist großartig, danke! :)
Beta Decay
1
Die Zeichenfolge darf auch nicht das Nullbyte value enthalten 00. Zusätzlich muss \Byte 5cmöglicherweise mit einem anderen `` maskiert werden oder nicht, abhängig vom Byte danach.
isaacg