Schreiben Sie einen rechteckigen Textblock, der bei Anordnung in einem Sierpinski-Teppich unter Verwendung gleich großer Leerzeichenblöcke für die leeren Teile ein Programm erstellt, das die Iterationsnummer des Teppichs ausgibt.
Zum Beispiel, wenn Ihr Textblock ist
TXT
BLK
Führen Sie dann das Programm aus
TXTTXTTXT
BLKBLKBLK
TXT TXT
BLK BLK
TXTTXTTXT
BLKBLKBLK
sollte ausgegeben werden, 1
da die Form des Programms die erste Iteration des Sierpinski-Teppichs darstellt.
Ebenso läuft
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXT TXTTXT TXTTXT TXT
BLK BLKBLK BLKBLK BLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXTTXTTXT TXTTXTTXT
BLKBLKBLK BLKBLKBLK
TXT TXT TXT TXT
BLK BLK BLK BLK
TXTTXTTXT TXTTXTTXT
BLKBLKBLK BLKBLKBLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXT TXTTXT TXTTXT TXT
BLK BLKBLK BLKBLK BLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
sollte 2 ausgeben, da dies die Form der zweiten Sierpinski-Teppichiteration ist.
Ausführen des Textblocks wie er ist
TXT
BLK
sollte ausgegeben werden, 0
da dies als nullte Iteration angesehen werden kann.
Dies sollte für alle weiteren Iterationen funktionieren. (Zumindest theoretisch, vorausgesetzt, der Computer hat den Speicher und alles.)
Einzelheiten
- Programme können möglicherweise keine Informationen über ihren Quellcode lesen oder darauf zugreifen. Behandle dies wie eine strenge Herausforderung für Quine.
- Die Ausgabe erfolgt an stdout oder eine ähnliche Alternative. Geben Sie nur die Nummer und einen optionalen Zeilenumbruch aus. Es erfolgt keine Eingabe.
- Der Textblock kann beliebige Zeichen enthalten, die nicht als Zeilenendezeichen gelten . Der Textblock darf Leerzeichen enthalten.
- Der "leere Raum" im Teppich muss vollständig aus Leerzeichen bestehen .
- Sie können optional davon ausgehen, dass alle Programme einen nachgestellten Zeilenumbruch haben.
Sie können dieses Stapel-Snippet verwenden, um bei jeder Iteration einen Teppich für einen bestimmten Textblock zu generieren:
<style>#o,#i{font-family:monospace;}</style><script>function c(e){e=e.split("\n");for(var n=new Array(3*e.length),t=0;t<n.length;t++){var l=t%e.length;n[t]=e[l]+(t>=e.length&&t<2*e.length?e[l].replace(/./g," "):e[l])+e[l]}return n.join("\n")}function f(){for(i=document.getElementById("i").value,n=parseInt(document.getElementById("n").value);n>0;)i=c(i),n--;document.getElementById("o").value=i}</script><textarea id='i'placeholder='code block...'rows='8'cols='32'></textarea><br>Iterations <input id='n'type='text' value='1'><br><br><button type='button'onclick='f()'>Generate</button><br><br><textarea id='o'placeholder='output...'rows='8'cols='32'style='background-color:#eee'readonly></textarea>
Wertung
Die Einsendung, deren anfänglicher Textblock flächenmäßig am kleinsten ist (Breite mal Höhe), gewinnt. Das TXT\nBLK
Beispiel ist 3 mal 2 für eine Punktzahl von 6. (Grundsätzlich gewinnt der kürzeste Code, daher der Code-Golf-Tag.)
Tiebreaker geht zu dem Beitrag über, der die wenigsten unterschiedlichen Zeichen in seinem Textblock verwendet. Wenn immer noch unentschieden, antworte zuerst und gewinne.
quelle
Perl, 30 (15 × 2)
Zunächst einmal behaupte ich, dass 10 Iterationen eine vernünftige Grenze darstellen und nicht 2 32 . Nach 10 Iterationen wird ein Programm, das aus N Bytes besteht, auf ( N × 3 20 ) Bytes (plus Zeilenumbrüche) erweitert, was selbst für N = 1 über 3 Gigabytes liegt . Eine 32-Bit-Architektur kann 11 Iterationen überhaupt nicht verarbeiten. (Und offensichtlich gibt es nicht genug Teilchen im Universum für 2 32 Iterationen).
Also hier ist meine Lösung:
Dies funktioniert, indem die Variable
$n
in der ersten Zeile erhöht und bei jedem Schritt der Logarithmus berechnet wird. Die zweite Zeile gibt den ganzzahligen Teil dieses Logarithmus aus und wird beendet.Ein einfacher Logarithmus zur Basis e (2.718 ..) ist nahe genug, um korrekte Ergebnisse für die ersten 10 Iterationen zu liefern.
quelle
Golfscript 9 * 2 = 18
(Beachten Sie, dass die erste Zeile abschließende Leerzeichen enthält, um sie rechteckig zu machen.)
Ich konnte keine Protokollfunktion für Golfscript finden und
base
musste dies tun.Golfscript beginnt mit einer leeren Saite. Erhöht also
0+
die Länge der Saite um 1 (durch Coversion). Bis die erste Zeile beendet ist, wird der Stapel eine Zeichenfolge von Länge haben3^n
, die wir zur Log-Basis 3 nehmen, bevor wir einen Superkommentar abgeben.n
wird dann automatisch ausgedruckt.quelle
,
in der zweiten Zeile speichern . Erste Zeile0or)
:; zweite Zeile3base,(}
. Das andere offensichtliche Ziel ist das(
in der zweiten Zeile. Dies ist schwieriger, kann aber auch durch Ersetzen der ersten Zeile1+~abs(
durch ein 7 * 2-Rechteck behoben werden.C, 12 × 8 = 96
Inspiriert von @ciamej, habe ich es reduziert. Es verwendet diesen Trick zum Teilen durch 3 und die Erkenntnis, dass der Teppich ein Wenn effektiv in eine While-Schleife umwandelt.
Der Code wurde unter gcc / Ubuntu auf Iterationen bis zu 3 getestet.
Vorherige Lösung: C, 11x12
Kein Größengewinner, aber hey, es ist C.
Es findet log2 der Blockanzahl durch Bitverschiebung und verwendet dann einige magische Zahlen und Int-Kürzungen, um log3 zu schätzen. Die Mathematik sollte bis zu 26 Iterationen (eine 42-Bit-Zahl) verarbeiten.
quelle
CJam, 9 Bytes
Die Idee für die Verwendung
]
stammt von Optimizer, es wird jedoch eine ganz andere Methode zum Zählen verwendet.Probieren Sie es online aus
Wie es funktioniert:
Zwei weitere 9-Byte-Lösungen
quelle
Python 2, 15 * 3 = 45
Eine weitere Implementierung der Idee von Count-First-Row-Then-Log-Three-And-Exit. Kann wohl noch ein bisschen mehr golfen werden.
quelle
bc, 2 · 16 + 1 = 33
Das zusätzliche +1 in der Punktzahl ist, weil die
-l
Option bc erforderlich ist:quelle
Golfscript, 7 * 2 = 14
Dies ist inspiriert von der Antwort von Sp3000 und insbesondere von dem Wunsch, die lange zweite Leitung zu optimieren.
3base,
ist so kurz wie ein Logarithmus zur Basis 3 in GS, und der Superkommentar}
ist eindeutig optimal.Was für die erste Zeile erforderlich ist, ist die Zuordnung der leeren Zeichenfolge
''
vom anfänglichen stdin zu 0 und anschließend die Zuordnung jeder nicht negativen Ganzzahl zu ihrem Nachfolger. Auf diese Weise beenden wir die erste Zeile mit3^n - 1
auf dem Stapel und3base,
benötigen keine Dekrementierung.quelle
C, 13 × 8
quelle
Perl, 76
Ich weiß, dass es wahrscheinlich nicht sinnvoll ist, dies zu veröffentlichen, da es bereits gründlich durchgearbeitet wurde, aber hier ist trotzdem meine aktuelle Lösung.
quelle
> <> (Fisch), 12 * 3 = 36
Eine einfachere> <> Lösung:
Wir laufen zuerst die oberste Reihe der oberen Blöcke.
'v'00p
Setztv
den Programmzeiger an die allererste Position des gesamten Programms und richtet ihn nach unten, wenn er nach Erreichen des Zeilenendes wieder zum Anfang zurückkehrt. Davor schiebt jeder Block 0 und die Länge des Stapels + 1 darauf. (Stapel wird sein0 2 0 4 0 6 ...
)In der ersten Hälfte der zweiten und dritten Hälfte zählen wir, wie oft wir das obere Stapelelement teilen können, bevor wir 2 erhalten (wir speichern dies im zweiten bis oberen Element).
Am Ende geben wir das zweitoberste Element des Stapels aus.
quelle
Lua, 3 · 17 = 51
Gleiche Strategie wie die meisten Leute:
quelle
PHP, 22 × 2 = 44
27 × 2 = 54Nur eine weitere Einstellung zu count-log3-out. Nicht sehr klein, aber mein erstes Golf;)
quelle