Bei dem Versuch, mehrere meiner Antworten auf den Prüfstand zu stellen, musste ich große Ganzzahlen mit möglichst wenigen Zeichen schreiben.
Jetzt weiß ich den besten Weg, das zu tun: Ich werde Sie dazu bringen, dieses Programm zu schreiben.
Die Herausforderung
- Schreiben Sie ein Programm, das bei Angabe einer positiven Ganzzahl ein Programm ausgibt, das es als stdout oder gleichwertig ausgibt.
- Die Ausgabeprogramme müssen nicht in der Sprache des Erstellers sein.
- Die Ausgabe darf maximal 128 Byte betragen.
- Sie können Eingaben von stdin oder einer gleichwertigen Quelle akzeptieren (keine Funktionseingabe).
- Sie können das resultierende Programm als stdout oder gleichwertig ausgeben.
- Die Zahlenausgabe muss dezimal sein (Basis 10)
Wertung
Ihre Punktzahl entspricht der kleinsten positiven Ganzzahl, die Ihr Programm nicht codieren kann.
Der Eintrag mit der höchsten Punktzahl gewinnt.
Antworten:
Python 3 → CJam, (163 122 - 1) · 255/162 + 1 · 1,213 · 10 270
Es stellt sich heraus, dass jede ganze Zahl von 1023 bis (163 122 - 1) · 255/162 in mindestens einer Weise durch eine Konvertierung der Basis b ≤ 163 aus einer Zeichenfolge von höchstens 122 Zeichen mit den Codes 93 bis b + 92 dargestellt werden kann. anstatt die üblichen 0 bis b - 1. Dies vermeidet die lästige Zeichen 34 (doppelten Anführungszeichen) und 92 (Backslash) ohne zusätzlichen Ausgabecode.
quelle
Pyth, 252 111 ≤ 3,593 × 10 266
Musste ein bisschen Python-Syntax verwenden, da Pyths
print
nicht drucken könneniso-8859-1
.Die Zahl wird in Basis 252 codiert und repräsentiert jede Ziffer in dieser Basis als ISO-8859-1-Zeichen. Die Zeichen
\
und"
müssten entkommen und werden daher nicht verwendet. Das Zeichen`
wird nicht benutzt, weil Golf gespielt wird ... Und zusätzlich wird das Null-Byte auch nicht benutzt, der Pyth-Compiler verbietet es.Die Ausgabe ist ein Programm mit einem Overhead von 17 Bytes:
Hier ist ein Anwendungsbeispiel mit der größtmöglichen Anzahl:
Erläuterung
des Ausgabeprogramms.
quelle
12
, da Pyth CR leider als LF liest .CJam, 254 109 ≈ 1,34 x 10 262
Ich codiere die Zahl in Basis 254 und stelle jede Ziffer in dieser Basis als ISO 8859-1-Zeichen dar, überspringe
"
und\
. Die Ausgabe hat einen Overhead von 19 Bytes,""{_'[>-_'!>-}%254b
sodass ich alles weniger als 254 128-19 oder explizit darstellen kannAls Beispiel
6153501
wäre codiert alsHier ist ein Testprogramm, das die codierte Ganzzahl ausgibt, ihre Länge ausgibt und sie dann sofort ausführt, um ihre Gültigkeit zu überprüfen (dies vermeidet die Mühe, die nicht druckbaren Zeichen in ein neues Programm zu kopieren, was nicht immer funktioniert mit dem Online-Dolmetscher).
quelle
Perl, 10-216
Auch Base-100-Codierung, etwas eleganter. Ausgabe für
12345678
wäre:Die Trennzeichen
{
und}
entsprechen den Hex - Werteb7
undd7
jeweils, die nicht in der Eingabe erscheinen können, und müssen daher nicht entgangen sein.Der Overhead beträgt 20 Byte, sodass 108 Byte für die Codierung verbleiben und ein Maximalwert von 10 216 -1 erreicht wird.
Perl, 10, 206
Einfache Base-100-Codierung. Die Ausgabe für
12345678
würde folgendermaßen aussehen:Der Overhead beträgt 25 Byte, so dass 103 Byte für die Codierung verbleiben und ein Maximalwert von 10 206 -1 erreicht wird.
quelle
Common Lisp, 36 114 - 1 ~ 2,62 × 10 117
Die größte Zahl ist:
2621109035105672045109358354048170185329363187071886946329003212335230440027818091139599929524823562064749950789402494298276879873503833622348138409040138018421944
Verwenden Sie einfach die Basis 36. Für die größte Eingabe ist die 128 Byte lange Ausgabe:
quelle
CJam, 233 114 7,561 10 269
Das Ausgabeprogramm
"…"{iKms*}%233b
decodiert die 8-Bit-Zeichen eines Strings auf Basis von 233 Ziffern mit n ↦ ⌊ n ⋅ sin 20⌊ = ⌊ n ⌋ 0,913⌋. Diese Transformation ist zufällig surjektiv, ohne dass die kritischen Codepunkte 34 (doppeltes Anführungszeichen) und 92 (umgekehrter Schrägstrich) als Eingabe erforderlich sind.quelle