Ihre Aufgabe ist es, ein Programm mit gerader Länge zu schreiben , das ein ASCII-Art-Quadrat (siehe unten) druckt und dessen Seitenlänge jedes Mal um 1 Einheit erhöht, wenn der ursprüngliche Quellcode in die Mitte des aktuellen Codes eingefügt wird.
Es fällt mir sehr schwer, diese Aufgabe gut zu definieren. Ich gebe Ihnen ein Beispiel:
Angenommen, Ihr ursprünglicher Code war
CODE
und er wurde gedruckt:0
Dann fügen Sie
CODE
in der Mitte ein: Ihr Code wirdCOCODEDE
und es sollte gedruckt werden:00 00
Neu einfügen
CODE
in der Mitte: Ihr Code wirdCOCOCODEDEDE
und sollte drucken:000 000 000
Und so weiter. Ihre Antwort sollte theoretisch nach einer beliebigen Anzahl von Iterationen funktionieren, aber ich verstehe, dass sie aufgrund von Einschränkungen der Sprachleistung einen bestimmten Schwellenwert nicht vernünftig überschreiten kann.
Einige Regeln:
Sie können jedes druckbare ASCII (32-127) als Zeichen für Ihr Quadrat verwenden. Ihre Auswahl muss konstant sein (Sie sollten für jede Iteration dasselbe Zeichen verwenden).
Das Ausgangsquadrat muss die Seitenlänge 1 haben .
Ein Ascii-Art-Quadrat ist eine Zeichenfolge mit N Zeilen (getrennt durch N-1 Zeilenvorschübe / Zeilenumbrüche), wobei jede Zeile N Kopien des ausgewählten Zeichens enthält.
Ihre Ausgabe darf keine überflüssigen Leerzeichen enthalten, außer einem nachgestellten Zeilenumbruch.
Sie können die Standardeinstellungen für die Ein- und Ausgabe verwenden (Programme oder Funktionen sind zulässig, Snippets jedoch nicht).
Die Mitte Ihres Codes ist definiert als der Punkt, an dem der Quellcode in zwei Teile geteilt werden kann, sodass beide gleich sind.
Ihre Antworten werden nach der Länge Ihres ursprünglichen Programms in Byte bewertet. Die niedrigste Byteanzahl gewinnt. Bei Stimmengleichheit gewinnt die zuvor übermittelte Antwort.
Mit diesem Programm können Sie die Einfügungen anwenden, ohne dies von Hand tun zu müssen.
Antworten:
Pyth , 2 Bytes
Probieren Sie es online! Auch Versuchen Sie es verdoppelt , verdreifacht !
Wie funktioniert das?
\n
ist der Befehl, der sein Argument mit einem hinteren Newline druckt, während er zurückgespielt gleichzeitig. Jedes Mal, wenn Sie eine Einfügung vornehmen, verwandeln Sie das Ganzzahlliteral 5 in eine Zahl, die N Kopien von 5 verketteten Zeilen enthält. Die führenden Zeilen stellen im Grunde genommen sicher, dass sie so oft gedruckt werden, dass sie quadratisch bleiben.quelle
JavaScript (ES6),
423230 ByteZweite Iteration:
Dies funktioniert durch ein Anhängen
0
zus
jeder Zeit in der ersten Hälfte des Codes ausgeführt wird , und das Druckens
selbst jedes Mal die zweite Hälfte ausgeführt wird . Nutzt vier Macken von JavaScript:this
. Dies ermöglicht es uns,this.s
anstelle von zu tuns
.undefined
.[1,2,3] + 4 === "1,2,34"
undefined
in die leere Zeichenfolge konvertiert, was bedeutet, dass[undefined] + 0 === "0"
.Zusammengenommen bedeutet dies, dass wir die erste Hälfte (die eine Folge von Nullen erzeugt) in nur 13 Bytes ausdrücken können. Wenn die Verwendung von
alert
anstelle vonconsole.log
zulässig ist, können 4 weitere Bytes durch Verkürzen der zweiten Hälfte eingespart werden.quelle
05AB1E , 2 Bytes
Probieren Sie es online!
Port meiner Pyth-Antwort .
quelle
Python 2 ,
423828 BytesProbieren Sie es online! . Sie können auch die 2. und 3. Iteration ausprobieren
quelle
Python 2 , 22 Bytes
Probieren Sie es online!
Verdoppelt:
Beachten Sie, dass die zweite Hälfte mit einem Zeilenumbruch beginnt.
quelle
C (gcc) ,
17016896807270 BytesViel kürzere Version. Ich wünschte immer noch, ich könnte eine Lösung ohne den Präprozessor finden.
Probieren Sie es online!
Alte 168-Byte-Version:
Probieren Sie es online!
quelle
Python 2 , 30 Bytes
Probieren Sie es online! , 2. und 3. Iteration
Dies macht sich die Tatsache zunutze, dass Bools in Python im Grunde genommen Ints und die Namen sind
False
undTrue
in Python 2 neu zugewiesen werden konnten.Python 1 , 32 Bytes
Probieren Sie es online! , 2. und 3. Iteration
In Python 1 existierten die eingebauten Zeichenfolgen
exit
undquit
, um den Benutzer der interaktiven Shell darüber zu informieren, wie sie beendet werden kann. Der Standardwert ist"Use Ctrl-D (i.e. EOF) to exit."
.quelle
n=False+=1;print'*'*n;
, aber ich vergesse immer wieder, dass dies kein Python-Feature ist ...Holzkohle , 6 Bytes
Probieren Sie es online! Erläuterung:
υ
endet mit einer Länge der Anzahl der Wiederholungen.quelle
Haskell , 68 Bytes
Probieren Sie es einmal , zweimal oder dreimal online aus .
Wegen Haskells Faulheit zählt ein Ausdruck wie der oben genannte als eine Funktion, die gemäß dieser Meta-Frage keine Argumente akzeptiert .
quelle
Brainfuck ,
4434 Bytesdurchgestrichen 44 ist immer noch regulär 44; (
Probieren Sie es online!
Versuchen Sie es verdoppelt , verdreifacht . Schau, keine Polsterung!
Druckt Quadrate von
U
. Es teilt sich genau in der Mitte der 10+
s.quelle
Ruby, 18 Bytes
Probieren Sie es online! Verdoppelt! Verdreifacht!
quelle
Brain-Flak , 74 Bytes
Probieren Sie es online!
Versuchen Sie es verdoppelt und verdreifacht .
Erläuterung
Der Haltepunkt befindet sich in der Mitte des
<>
Abschnitts "Push 10". Wird dies aufgebrochen, verbleibt eine 5 auf dem dritten Stapel, bis die entsprechende zweite Hälfte erreicht ist. An diesem Punkt wird das Drücken von 10 genau dort fortgesetzt, wo es aufgehört hat.Während es möglich ist, einen druckbaren ASCII-Wert (Leerzeichen) in 22 Bytes zu verschieben, würde dies dazu führen, dass die Zentrale
<>
nach dem Verschieben ausgeführt wird5
. Durch das Hinzufügen von zwei weiteren Bytes konnte ich das verschieben,<>
sodass der gesamte Fortschritt in Richtung Push10
auf dem dritten Stapel lag. Als Bonus machte dies auch das resultierende Quadrat ästhetisch ansprechender.quelle
tinylisp , 112 Bytes
Probieren Sie es online! Auch verdoppelt und fünffach .
Der Ansatz "Eine Zeichenfolge in der ersten Hälfte erstellen und in der zweiten Hälfte drucken", den viele Sprachen verwenden, funktioniert in tinylisp nicht, da es keine veränderbaren Variablen gibt. Stattdessen führen wir einige ernsthafte Code-Verschachtelungen durch.
Wenn eine zweite Kopie des Codes eingefügt wird, wird sie in das eingefügt
(q())
, wodurch sie in eine Liste eingeschlossen wird. Dann(h(t(t(h(t(...))))))
bohrt in diese Liste das Teil nach(d N
.(v(...))
bewertet es; dann übergeben wir es an die unbenannte Funktion(q((x)(i x(inc x)1)))
, die den resultierenden Wert erhöht, wenn es sich um eine Zahl handelt, und 1 zurückgibt, wenn es sich um die leere Liste handelt. Das Endergebnis in der äußersten verschachtelten Version des Codes wird zugewiesenN
. Im Wesentlichen haben wir eine seltsame Art von Rekursion eingerichtet, die die Anzahl der Verschachtelungsebenen zählt.Die zweite Hälfte des Codes erstellt dann eine
N
Sternchenfolge, dann eine ListeN
solcher Zeichenfolgen und schließt sich dann der Liste in Zeilenumbrüchen an. Das Ergebnis wird mit einem nachgestellten Zeilenumbruch angezeigt.quelle
R , 44 Bytes
Probieren Sie es online!
Druckt mit einem nachgestellten Zeilenumbruch. Das
T=TRUE*TRUE+12
ist nur zum Auffüllen der Länge.Versuchen Sie es verdoppelt und versuchen Sie es verdreifacht .
quelle
F=F+1;T=TRUE*TRUE+12#
<newline>write(strrep(1,F),"")
Julia 0,6 , 29 Bytes
Alle meine Ideen waren länger als die Anpassung der cleveren Python-Lösung von xnor.
Wird
Probieren Sie es online!
quelle
SNOBOL4 (CSNOBOL4) ,
13068 BytesJetzt ohne Kommentare! Eine Erklärung des alten Algorithmus finden Sie im Bearbeitungsverlauf .
Probieren Sie es online!
Probieren Sie es doppelt und verdreifacht
Erläuterung:
Weil ein
END
Etikett erforderlich ist und alles nach dem erstenEND
Ignorieren Etiketts erfolgt, bieten sich für diese Herausforderung zwei Vorteile:X
für dieX
Wiederholungen wiederholtDies legt nahe, dass wir die Wiederholung für die erste Hälfte verwenden und dann einen "konventionelleren" Etikettierungsansatz verwenden können, um die Ausgabezeiten zu wiederholen
X
.Die erste Hälfte ist
Wenn dies wiederholt wird, wird
X
die entsprechende Anzahl erhöht und einARRAY
A
mit Indizes von1
bis erstellt,X
wobei jedes ElementA
der Zeichenfolge1
wiederholt wirdX
Male ist.Unabhängig davon, wie oft das Programm wiederholt wird, sieht der Interpreter nur:
Dies ist ein typisches SNOBOL-Programm, das die Elemente
A
nacheinander ausgibt, bis der Index überschritten wird, und dann das Programm beendet.;
ist ein optionaler Zeilenabschluss, der normalerweise für einzeiligeEVAL
oderCODE
Anweisungen reserviert ist , der die Byteanzahl auf 68 bringt und den halben Punkt markiert, sodass der Code dort angehängt werden kann.quelle
shortC ,
5644 bytes-12 Bytes: Warte, ich benutze shortC, warum nicht etwas gekürztes C-Zeug
Ich hätte Standard C verwendet, aber das erfordert eine
}
am Ende, die mit der Replikation durcheinanderbringt. shortC fügt es implizit bei EOF ein.quelle
Perl 5 , 25 Bytes
24 Byte Code + 1 für
-p
.Bitte teilen Sie mir mit, ob Sie keine Befehlszeilen-Flags zulassen möchten.
Probieren Sie es online!
quelle
Zsh , 10 Bytes
Probieren Sie eine vollständige Testsuite online aus!
... ja, das ist ein bisschen besser. N-mal an die Zeichenfolge anhängen und dann N-mal drucken. Es stellt sich heraus,
<<<foo<<<foo
funktioniert gut.Zsh , 64 Bytes
Verwendetes Zeichen:
(Leerzeichen).
Probieren Sie eine vollständige Testsuite online aus!
Der Mittelpunkt liegt zwischen der zweiten
E
und der darauf folgenden Newline. Ein Heredoc endet, wenn sichE
in einer eigenen Zeile ein befindet, was genau in der Mitte des Codes geschieht.quelle
s+=0;<<<$s