Ich bin daran interessiert, Programme zu sehen, die keine Eingabe verlangen, eine Googol- Kopie einer nicht leeren Zeichenfolge drucken , nicht weniger, nicht mehr und dann anhalten. Ein Googol ist definiert als 10 ^ 100, dh 1 gefolgt von hundert Nullen als Dezimalzahl.
Beispielausgabe:
111111111111111111111111111111111111111111111111111111111111111111111111...
oder
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
...
Die Zeichenfolge kann auch vollständig aus Leerzeichen oder speziellen Symbolen bestehen. Die einzige Ausnahme zu identischen Kopien einer festen Zeichenfolge besteht darin, dass Ihre Sprache die Ausgabe auf eine Weise dekoriert, die nicht verhindert werden kann, die jedoch in einem Wrapper-Skript trivial rückgängig gemacht werden kann, z. B. indem jeder Zeile eine Zeilennummer vorangestellt wird. Das Wrapper-Skript muss in solchen Fällen nicht bereitgestellt werden.
Sie können davon ausgehen, dass Ihrem Computer niemals die Zeit ausgeht. Ansonsten muss Ihr Programm einen angemessenen Ressourcenbedarf aufweisen. Außerdem müssen Sie alle Einschränkungen beachten, die die Programmiersprache Ihrer Wahl mit sich bringt. Sie können beispielsweise einen für die Ganzzahltypen zulässigen Maximalwert nicht überschreiten und es dürfen zu keinem Zeitpunkt mehr als 4 GB Arbeitsspeicher erforderlich sein.
Mit anderen Worten, das Programm sollte grundsätzlich testbar sein, indem es auf Ihrem Computer ausgeführt wird. Aufgrund des Umfangs dieser Zahl wird jedoch erwartet , dass Sie nachweisen, dass die Anzahl der Kopien des ausgegebenen Strings genau 10 ^ 100 beträgt und das Programm danach stoppt. Das Anhalten kann ein Beenden oder Anhalten oder sogar ein Beenden aufgrund eines Fehlers sein. In diesem Fall darf der Fehler jedoch keine Ausgabe erzeugen, die nicht einfach von der Programmausgabe getrennt werden kann.
Das ist Code-Golf , also gewinnt die Lösung mit den wenigsten Bytes.
Beispiellösung (C, ungolfed, 3768 Bytes)
#include <stdio.h>
int main() {
int a00, a01, a02, a03, ..., a99;
for(a00 = 0; a00 < 10; a00++)
for(a01 = 0; a01 < 10; a01++)
for(a02 = 0; a02 < 10; a02++)
for(a03 = 0; a03 < 10; a03++)
...
for(a99 = 0; a99 < 10; a99++)
puts("1");
return 0;
}
Antworten:
Gelee ,
64 BytesDies ist eine Niladic-Verknüpfung (Funktion ohne Argumente), die 10 200 Kopien der Zeichenfolge 100 ausgibt. Dies bedeutet, dass 10 100 Kopien der Zeichenfolge gedruckt werden , die aus 10 100 Kopien der Zeichenfolge 100 besteht .
Probieren Sie es online!
Beachten Sie, dass der Online-Interpreter die Ausgabe aus praktischen Gründen auf 100 KB reduziert. Der Code funktioniert auch als vollständiges Programm, aber aufgrund der impliziten Ausgabe druckt dieses Programm eine Kopie zu viel.
Wie es funktioniert
quelle
10^100
Kopien der Originalausgabe (10^100
Kopien einer Zeichenfolge) nimmt selbst für zwei ganze Bytes etwas Zeit in Anspruch. Haben Sie dies bei der Herausforderung "Punktzahl ist Ausgabe / Programmlänge, höchste Siege" eingereicht?Fuzzy Octo Guacamole,
13121110 BytesErläuterung:
Muster der gedruckten Ziege:
quelle
Python, 28 Bytes
-1 Byte Danke an Jonathan Allan!
Python 2:
Python 3 (30 Byte):
quelle
i=10**100
Newlinewhile i:print();i-=1
speichert ein Byte. Sparen Sie zwei weitere, indem Sie Python 2 mitwhile i:print;i-=1
Haskell, 28 Bytes
Verkettet 10 bis 100 Kopien der Zeichenfolge
"1"
und druckt sie aus.quelle
s=[1..10^100]>>"1"
ein Antwortformat erlaubt?s
aus deinem beispiel druckt das nicht - oder wenn du die REPL verwendest umgibt das1
mit"
. Ich denke nurputStr$[1..10^100]>>"1"
ohne dasmain=
wäre alles in Ordnung, aber ich wollte ein volles Programm einreichen.Brainfuck,
48018811410698 BytesNur weil es getan werden muss.
Nimmt 8-Bit-Zellen mit Umbruch an. Druckt 250 bis 255 NUL-Bytes, dh 10 bis 100 mal 10 bis 155 mal 25 bis 255 NUL-Bytes.
Erläuterung:
>>>>>>
wird benötigt, um etwas Arbeitsraum zu lassen.-
produziert 255.[[->>>+<<<]------>>>-]
verwandelt dies in 255 Kopien des Werts 250 und ergibt ein Band, das wie folgt aussieht:<<<[<<<]+
Bewegt den Datenzeiger zurück und beendet die ursprünglichen Daten:Dann kommt die Schleife: Setzt
[+...-]
zunächst die 1 auf eine 2, die am Ende der Schleife wieder auf 1 gesetzt wird. Die Schleife wird beendet, wenn der Schleifenkörper bereits 2 auf 1 gesetzt hat.Nun stellen die Zahlen 2 250 250 250 ... 250 einen Zähler in der Basis 250 dar, wobei jede Zahl um eins größer ist als die Ziffer, die sie darstellt.
[>>>]<<<
bewegt sich ganz nach rechts. Da jede Ziffer durch eine Zahl ungleich Null dargestellt wird, ist dies trivial.->+[<[+>-]>[-<<<<->+>>------>>]<<<<]>>-
verringert den Zähler um 1. Beginnend mit der letzten Ziffer: Die Ziffer wird dekrementiert. Wenn es positiv bleibt, sind wir fertig. Wenn es zu Null wird, setzen Sie es auf 250 und fahren Sie mit der vorherigen Ziffer fort.[<<<].>>>
Bewegt den Zeiger vor die am weitesten links stehende Stelle zurück. Dies ist ein guter Moment, um ein NUL-Byte zu drucken. Positionieren Sie dann genau auf die Stelle ganz links, um festzustellen, ob wir fertig sind.Ändern Sie zur Überprüfung der Richtigkeit die Initiale
-
in+
, um 250 1 NUL-Bytes++
für 250 2 usw. zu drucken .quelle
C, 51 Bytes
Die Funktion
g()
ruft die rekursive Funktionf()
für die Tiefe 99 auf.Schließt unnötige Zeilenumbrüche zwischen
f()
undg()
aus Gründen der Übersichtlichkeit aus.Druckt 1E100 Zeilenumbrüche.
Deklaration von
i
als zweitem Parameter fürf()
nicht garantiert funktionierend in allen Versionen von C. Getestet auf meinem eigenen Computer (GCC auf CygWin) und auf ideone.com (ich glaube, sie führen auch GCC aus), aber nicht bis zu f (99) für offensichtlich Gründe dafür!quelle
f()
ungefähr 1980 Bytes schätzen . Dieputs
Zeilenumbrüche werden in die API geschrieben, und die API sollte den Puffer nach Bedarf ausgeben und leeren.f
, bei der der Angerufene Argumente vom Stapel abruft (oder in den Stapelspeicher schreibt, den der Aufrufer nicht verwendet hat) Ich erwarte es nicht. clang warnt vor "zu wenigen Argumenten im Aufruf von 'f'" in-std=c89
und-std=c99
, daher fungiert die Definition als Deklaration mit einer bestimmten Anzahl von Argumenten. Aber ich vergesse es; Ich denke, das könnte bedeuten, dass der Compiler weiß, dass die Funktion 2 Argumente erwartet und immer Platz für ein 2. Argument lässt.g
und seine Hilfsfunktionf
.main
wäre länger. Es gibt hier ein paar andere Funktionsübermittlungen, wenn Sie durchsehen.Commodore VIC 20 Maschinencode (40 Bytes)
... hier hexadezimal dargestellt:
(Gestartet mit:
SYS 4160
)Bedeutung der Bytes in Klammern
Ist das ein Tippfehler?
Wir haben das Jahr 1981.
Ein typischer Heimcomputer hat 1 bis 16 KB RAM! Und es gibt kaum professionelle Modelle mit 1 MB oder mehr.
(Ok. Nur ein Witz.)
Das Programm wurde mit anderen Basen und Exponenten getestet. Ich habe keinen Zweifel, es wird auch mit 100 und 50 funktionieren.
Zumindest stürzt es mit diesen Zahlen nicht ab (endet aber auch nicht in messbarer Zeit).
Die Speichergröße ist ausreichend für einen Exponenten von 50 und 100 ist kleiner als 127, so dass eine Basis von 100 kein Problem darstellen sollte.
Die Grundidee
Es gibt einen 50-stelligen Zähler, der im 100-System zählt. Die Bytes 0x01-0x64 repräsentieren die Ziffern 0-99. Das erste Byte im Zähler ist die niedrigste Ziffer. Auf das letzte Byte im Zähler (höchste Ziffer) folgt ein Byte mit dem Wert 0x00.
Der Zähler hat den Anfangswert 100 ^ 50.
Eine äußere Schleife schreibt ein Byte in den "aktuellen Kanal" ("Standardausgabe" bei modernen Systemen; normalerweise der Bildschirm) und dekrementiert dann den Zähler.
Die Dekrementierung erfolgt durch eine innere Schleife: Sie dekrementiert eine Ziffer und rückt bei einem Unterlauf von 1 auf 99 zur nächsten Ziffer vor. Wird das Byte 0x00 am Ende des Zählers dekrementiert, stoppt das Programm.
Der Assembler-Code lautet
BEARBEITEN
Das Programm läuft auch auf Commodore C64!
quelle
Knoten, 89 Bytes
Gibt 10 100 Zeilenumbrüche aus. (Theoretisch dh; Test durch Ersetzen
100
mit1
dem Ausgang 10 1 newlines statt.)Dies funktioniert, indem Sie
i
die Zeichenfolge festlegen(100 Nullen und eine 1; ein Googol umgekehrt), dann wiederholt "1 subtrahieren" mit einem regulären Ausdruck ersetzen und eine neue Zeile ausgeben, bis die Zeichenfolge nur noch Nullen enthält.
Ein Port der C ++ - Antwort wäre 49 Bytes:
quelle
05AB1E , 6 Bytes
Erläuterung
quelle
Ruby, 20 Bytes
Druckt 1, gefolgt von einem Zeilenumbruch 1E100 mal.
1E100
funktioniert nicht, da es einen Gleitkommawert ergibt, keine Ganzzahl mit willkürlicher Genauigkeit.quelle
10**(100.times{p 1})
1E100.to_i
die auf meinem Computer zu 100000000000000159028911097599180468360808563945281389781327557747838772170381060813469985856815104 bewertet werden./// , 36 ASCII-Zeichen (4 verschiedene)
Gibt das
.
Zeichen 3 * 10 ^ 125-mal aus, was bedeutet, dass die Zeichenfolge aus 3 * 10 ^ 25 Wiederholungen des.
Zeichens 10 ^ 100-mal ausgegeben wird.Erläuterung:
/t./.ttttt/
Ersetzen:t.
mit für.ttttt
den Rest des Programms, zu wiederholen , bis keine Instanzent.
bleiben. Dies ersetztt...
durch...
gefolgt von 125t
s./.t/t\........../
Ersetzen:.t
mit fürt..........
den Rest des Programms, zu wiederholen , bis keine Instanzen.t
bleiben. Dies dauert die...
folgenden 125t
s und macht sie zu 125t
s, gefolgt von 10 ^ 125 Vorkommen von...
./t//
: Entfernen Sie alle verbleibendent
s.t...
: Dies wird durch 3 * 10 ^ 125.
s ersetzt. Gib sie aus.Das Ausgeben von 10 ^ 100 Wiederholungen von 3 * 10 ^ 25 Wiederholungen von etwas fühlt sich wie Schummeln an. Dieses Programm gibt das
.
Zeichen genau 10 bis 100 Mal mit 45 ASCII-Zeichen aus:Erklärung von diesem:
/T/tttttttttt/
: Ersetzen SieT
mit fürtttttttttt
den Rest des Programms. Dies ersetztTTTTTTTTTT
mit 100 Wiederholungen vont
./.t/t........../
: Ersetzen Sie.t
mit fürt..........
den Rest des Programms. Dies dauert die.
folgenden 100t
s und macht sie zu 100t
s, gefolgt von 10 ^ 100.
s./t//
: Entfernen Sie alle verbleibendent
s..TTTTTTTTTT
: Dies wird durch 10 ^ 100.
s ersetzt. Gib sie aus.Schließlich ist hier ein Kompromissprogramm, das das
.
Zeichen 2 * 10 ^ 100 mal mit 40 Zeichen ausgibt :quelle
Befunge 93, 33 Bytes
Leider hat Befunge keine Power-Funktion, so dass fast der gesamte Code meine Implementierung einer Power-Funktion ist. Daran arbeite ich noch.
Erläuterung:
1
: Beginnen mit1
links oben, damit wir bei der Multiplikation nicht erhalten0
jedes Mal erhalten.01g
: Holen Sie sich das Zeichen an der Position (0, 1), die istd
, dessen ASCII-Code 100 ist.0`
: Überprüfen Sie, ob der in (0, 1) gespeicherte Wert größer als 0 ist. Dieser Wert ändert sich.#@!# _
: Logisch nicht!
zu dem Wert, den wir aus dem letzten Schritt erhalten (0 oder 1), so dass wir, wenn es 1 war, jetzt 0 haben und das notieren#
dass Sie das nächste Zeichen im Code überspringen.01g 1- 01p
: Nimm den in (0, 1) gespeicherten Wert erneut, subtrahiere 1 davon und speichere diesen neuen Wert bei (0, 1)25**
: Multipliziere den obersten Wert des Stapels mit 101.
: drucken1
Jedes Mal wenn diese Schleife ausgeführt wird1
wird (theoretisch) mal googol gedruckt, aber das rennt schnell von der seite ab, auf der ich das getestet habe.Sie können Befunge 93 Code ausführen hier . Aus irgendeinem Grund ist der Spitzenwert des Stapels ,
1.0000000000000006e+100
wenn es sein sollte1.0e+100
. Ich weiß nicht, woher das kommt6
, aber ich denke nicht, dass es da sein sollte und dass es ein Rundungsfehler oder so sein könnte.quelle
ABCR , 56 Bytes
Turing Tarpits machen Spaß, besonders wenn sie keine einfache Multiplikation oder Exponenten haben. Andererseits brauchte ich nur zwei der drei Warteschlangen!
Erläuterung:
quelle
Batch,
574242 BytesJede Schleife durchläuft daher die Ausführung einer zusätzlichen Iteration. Aufgrund der 32-Bit-Ganzzahlbeschränkung sind die Schleifen auf ~ 2³² begrenzt. Die ersten vier Schleifen zählen jeweils 2²⁵ für insgesamt 2¹⁰⁰, während die verbleibenden zehn Schleifen jeweils 5¹⁰ für insgesamt 5¹⁰⁰ zählen.
Bearbeiten: Dank @ ConorO'Brien konnten unvorstellbare 58% eingespart werden.
quelle
TI-Basic, 20 Bytes
Einfach. Es werden nur acht Zeilen gleichzeitig angezeigt, und vorherige Zeilen bleiben nicht im Speicher. Da dies
ᴇ100
nicht unterstützt wird, müssen wir eine Schleife von-ᴇ99
bis ausführen9ᴇ99
. Dann wird , wennI!=0
die Zeichenfolge anzuzeigen (die, durch die Art und Weise, ist 3). Auf diese Weise drucken wir es genauᴇ100
mal.quelle
x86-64-Maschinencodefunktion, 30 Byte.
Verwendet die gleiche Rekursion Logik wie die C - Antwort von @Level River St . (Maximale Rekursionstiefe = 100)
Verwendet die
puts(3)
Funktion von libc, mit der normale ausführbare Dateien sowieso verknüpft sind. Es kann mit x86-64 System V ABI, dh von C unter Linux oder OS X, aufgerufen werden und staut keine Register, die es nicht sollte.objdump -drwC -Mintel
Ausgabe, kommentiert mit Erklärung0x040035e - 0x0400340 = 30 bytes
Gebaut mit
yasm -felf64 -Worphan-labels -gdwarf2 golf-googol.asm && gcc -nostartfiles -o golf-googol golf-googol.o
. Ich kann die Original-NASM-Quelle posten, aber das schien unübersichtlich zu sein, da die ASM-Anweisungen direkt in der Demontage enthalten sind.putchar@plt
ist weniger als 128 Bytes von derjl
, also hätte ich einen 2-Byte-Kurzsprung anstelle eines 6-Byte-Kurzsprungs verwenden können, aber das ist nur in einer winzigen ausführbaren Datei wahr, nicht als Teil eines größeren Programms. Daher glaube ich nicht, dass ich es rechtfertigen kann, die Größe der Puts-Implementierung von libc nicht zu zählen, wenn ich auch eine kurze JCC-Codierung nutze, um sie zu erreichen.Jede Rekursionsebene belegt 24B Stapelspeicher (2 Pushs und die von CALL gepushte Rücksprungadresse ). Jede andere Tiefe wird aufgerufen,
putchar
wobei der Stapel nur um 8 ausgerichtet ist, nicht um 16, was den ABI verletzt. Eine stdio-Implementierung, bei der ausgerichtete Speicher verwendet wurden, um xmm-Register auf den Stapel zu übertragen, würde einen Fehler verursachen. Aber Glibcsputchar
tun das nicht, sie schreiben in eine Pipe mit voller Pufferung oder in ein Terminal mit Zeilenpufferung. Getestet unter Ubuntu 15.10. Dies könnte mit einem Dummy-Push / Pop im behoben werden.loop
, um den Stapel vor dem rekursiven Aufruf um weitere 8 zu versetzen.Beweis, dass es die richtige Anzahl von Zeilenumbrüchen druckt:
Meine erste Version davon war 43B und wurde
puts()
in einem Puffer mit 9 Zeilenumbrüchen (und einem abschließenden 0-Byte) verwendet, also würden Puts das 10. anhängen. Dieser Rekursionsgrundfall war noch näher an der C-Inspiration.Ein anderer Faktor für 10 ^ 100 hätte den Puffer möglicherweise verkürzen können, möglicherweise auf 4 Zeilen für neue Zeilen, wodurch 5 Byte gespart werden. Die Verwendung von Putchar ist jedoch bei weitem besser. Es wird nur ein ganzzahliges Argument, kein Zeiger und überhaupt kein Puffer benötigt. Der C-Standard erlaubt Implementierungen, für die es ein Makro ist
putc(val, stdout)
, aber in glibc existiert es als echte Funktion, die Sie von asm aus aufrufen können.Das Drucken von nur einer neuen Zeile pro Aufruf anstelle von 10 bedeutet lediglich, dass die maximale Tiefe der Rekursion um 1 erhöht werden muss, um einen weiteren Faktor von 10 neuen Zeilen zu erhalten. Da 99 und 100 beide durch eine vorzeichenerweiterte 8-Bit-Direktdarstellung dargestellt werden können,
push 100
sind immer noch nur 2 Bytes.Noch besser ist, dass
10
ein Register sowohl als Zeilenvorschub- als auch als Schleifenzähler fungiert und ein Byte spart.Ideen zum Speichern von Bytes
Eine 32-Bit-Version könnte ein Byte für das speichern
dec edi
, aber die Aufrufkonvention stack-args (für Bibliotheksfunktionen wie putchar) macht das Aufrufen von Tail-Calls weniger einfach und würde wahrscheinlich mehr Bytes an mehr Stellen erfordern. Ich könnte eine register-arg-Konvention für den privatenf()
, nur von aufgerufenen benutzeng()
, aber dann könnte ich putchar nicht mit einem Tail-Call aufrufen (weil f () und putchar () eine andere Anzahl von Stack-Args annehmen würden).Es wäre möglich, f () zu veranlassen, den Status des Aufrufers beizubehalten, anstatt das Speichern / Wiederherstellen im Aufrufer durchzuführen. Das ist aber wahrscheinlich nicht gut, weil es wahrscheinlich auf jeder Seite des Zweigs getrennt werden müsste und mit Tailcalling nicht kompatibel ist. Ich habe es versucht, aber keine Einsparungen gefunden.
Es hat auch nicht geholfen, einen Schleifenzähler auf dem Stapel zu belassen (anstatt rcx in der Schleife zu pushen / poppen). Es war 1B schlechter mit der Version, die Puts verwendete, und wahrscheinlich sogar ein Verlust mit dieser Version, die RCX billiger einrichtet.
quelle
PHP, 44 Bytes
Dieses Snippet gibt
1
Googol-Zeiten aus. Das Gedächtnis wird nicht knapp, aber es ist furchtbar langsam. Ich benutze BCMath, um mit langen ganzen Zahlen umgehen zu können.Ein bisschen besser, aber nicht so klein (74 Bytes):
Gibt den Brief
a
googol mal aus. Es verbraucht fast 4 GB Speicher und gibt ungefähr 4e9 Zeichen gleichzeitig aus.quelle
a
, es ist eine Zeichenfolge von 4 * 10 ^ 9a
s. Es gibt keine Möglichkeit, die 4 GB nicht zu überschreiten, wenn Sie 3-mal so vielea
s darin ablegen. Ob_flush hat nichts damit zu tun. Im zweiten Beispiel geht es darum, große Zeichenfolgen auf einmal auszugeben, anstatt jedes Mal eine kleine Anzahl von Zeichen auszugeben, was dazu führt, dass das Programm auf Kosten einer höheren Speichernutzung erheblich schneller ausgeführt wird.Haskell,
4543 Bytesquelle
Pyke,
65 BytesProbieren Sie es hier aus!
Ungetestet, da mein Browser abstürzt. Die ersten 4 Zeichen erzeugen 10 ^ 100 und
V
geben so viele Zeilenumbrüche aus. Testen Sie mit100V
.quelle
Schläger 36 Bytes
Ausgabe:
quelle
JAISBaL , 4 Bytes
Chrome kann nicht alle Symbole lesen und ich bin mir bei anderen Browsern nicht sicher. Hier ist ein Bild:
Erläuterung:
Ziemlich einfach ... druckt einfach ein Google-Leerzeichen. Drei Befehle, aber die Googol-Konstante ist zwei Bytes.
(Geschrieben in Version 3.0.5)
quelle
JavaScript ES6,
8583 BytesDank ETHproductions 2 Bytes gespart!
Dies druckt 1e100 Zeilenumbrüche.
Der innere Teil generiert dieses Programm, das anschließend ausgewertet wird.
Als Beweis für die Richtigkeit verwenden wir nun eine Induktion. Lassen Sie uns die anfänglichen 100 für andere Werte ersetzen, die allgemein N . Ich behaupte, dass das Einfügen von N 10 N Zeilenumbrüche ergibt. Lass uns das Ergebnis von this nach
wc -l
leiten, das die Anzahl der Zeilenumbrüche in der Eingabe zählt. Wir werden dieses modifizierte, aber äquivalente Skript verwenden, das Eingabe N akzeptiert :Hier ist eine Ausgabe:
Wir können sehen, dass dies die Eingabe N für kleine Werte in 10 N Zeilenumbrüche umwandelt.
Hier ist eine Beispielausgabe für N = 1:
quelle
eval([...Array(i=100)].map(_=>`for($${--i}=0;$${i}++<10;)`).join``+"console.log()")
Mathematica,
483025 BytesAusgabe:
quelle
For[n=0,n++<10^100,Echo[]]
?>>
Hauptteil der Ausgabe betrachten. Sie werden gedruckt, wenn SieEcho
auf der Konsole verwenden.Echo@0&~Array~10^100;
21 Bytes?Fortran 95, Freiform, rekursiv, 117 Byte
Druckt ein Googol von Zeilen mit
Fortran 90, rekursiv, 149 Bytes
Durch rekursives Aufrufen von 100 verschachtelten Schleifen zu je 10 Iterationen wird genau ein Googol erstellt. N, L und die Schleifenzähler passen alle in Ganzzahlen mit Byte-Größe.
Getestet durch Ersetzen von 99 durch 1, 2, 3, 4, 5 und Feststellen, dass die resultierende Zeilenzahl von "wc" jeweils n + 1 Nullen hat.
Fortran II, IV, 66 oder 77, 231 Bytes:
Druckt ein googol von Zeilenumbrüchen.
Alle diese Programme werden auf 32-Bit-Computern ausgeführt. Tatsächlich würden die rekursiven Versionen auf einem 16-Bit-Computer einwandfrei funktionieren. In der Brute-Force-Version könnte man weniger Schleifen verwenden, wenn man auf einem alten Cray mit seinen 60-Bit-Ganzzahlen läuft. Hier entsprechen zehn verschachtelte Schleifen von 2 * 10 ^ 9 in einer Schleife von 5 ^ 10 (9765625) 10 ^ 100 Gesamtiterationen.
Keine der Versionen verwendet einen anderen Speicher als den Objektcode selbst, die Zähler, eine Kopie der Ausgabezeichenfolge und in der rekursiven Version einen Rückgabestapel mit 100 Ebenen.
Überprüfen Sie die Faktoren durch Vergleich
quelle
Turing Maschinensimulator, 1082 Bytes
Turing Maschinensimulator
Ich weiß nicht, ob dies als die richtige Ausgabe gilt, da es 82 führende Leerzeichen hat.
Ich weiß nicht, ob dies die 4-GB-Grenze einhält. Wenn dies nicht der Fall ist, ist es nicht wettbewerbsfähig und nur für Präsentationszwecke. Die Ausgabe ist 1e100 Byte, daher sollte von der Anzahl der Speicherbytes abgezogen werden. Die endgültige Byteanzahl beträgt 82 Bytes.
Hier ist eine Erklärung:
Die ersten 80 Zeilen des Codes sind 80 verschiedene Zustände, die die Basis-19 erzeugen 1 Schleifenzählwert
6EC1BCF4688309GH806H932ADCC44EEG6DE0FE9FAHDE66DGH108C9G3623E045A0H7A95AB594CE99A
.Die nächsten 19 Codezeilen sind der Zählerstand, der den Zählerstand jedes Mal verringert, wenn ein Zeichen gedruckt wird.
Die nächsten 6 Zeilen sind der Druckerstatus, an den ein angehängt wird
=
.Schließlich sind die letzten 2 Zeilen der Cleaner-Status, der benötigt wird, um sicherzustellen, dass nur die Ausgabe erfolgt
=====...=====
. Führende / nachfolgende Leerzeichen zählen nicht als Ausgabe, da sie unvermeidbare Nebenwirkungen sind.Das Programm hält dann an.
1 Ich habe das nachgerechnet.
quelle
Pyth, 7 Bytes
Neu (im Wettbewerb)
Erläuterung
Alt (nicht konkurrierend) 7 Bytes
Erläuterung
quelle
*TT
dass er kürzer ist als eine Ebene100
.Python 3, 32 Bytes
Alternative Lösung, 33 Bytes:
quelle
range(10**100)
eine Liste mit Zahlen[1, 2, 3, 4, ...]
, woraus sich ergibtOverflowError: range() result has too many items
. Dies würde in Python 2 mit einem Aufruf vonxrange()
funktionieren, und funktioniert in Python 3, daxrange()
in umbenanntrange()
wurde und das Originalrange()
, das eine Liste generiert hat, veraltet ist.Java,
198179155 BytesGibt (
x
==null
?:null
Eine Zeichenfolge aus, die mit[La;@
oder so ähnlich beginnt ) 10 bis 100 Mal in O-Zeit (für immer).quelle
class
, aber neinpublic static void main(String[]a)
Methode. Golftipps: Sie können dasnew BigInteger("0")
,new BigInteger("1")
undnew BigInteger("10")
durchBigInteger.ZERO
,BigInteger.ONE
und ersetzenBigInteger.TEN
. Sie können ersetzenimport java.math.BigInteger;
mitimport java.math.*;
.java.math.BigInteger b=null;for(b=b.ZERO;!(b=b.add(b.ONE)).equals(b.TEN.pow(100);)System.out.print(x);
b
null ist.Java, 153 Bytes
Ausgang: 1e100 1s
Ich weiß, dass es eine andere Java-Antwort gibt, die auch ziemlich nah ist. Die Mine hat eine Hauptleitung und ist immer noch kürzer.
Dies ist mein erster Code-Golf-Eintrag. Tipps geschätzt.
quelle
import java.math.*;()->{for(BigInteger i=BigInteger.ZERO;!i.add(i.ONE).equals(i.TEN.pow(100));)System.out.print(1);};
javac
das nicht kompilieren.Pyth,
87 BytesVerknüpfung
Die Lösung wurde mit geringer Leistung getestet, sollte jedoch
abcdefghijklmnopqrstuvwxyz
1e100-mal drucken .Aus irgendeinem Grund war das
p
nicht nötig, wie 31343 (Maltysen) sagte .quelle
p