Das Sierpinsky-Dreieck ist ein Fraktal, das durch Aufnehmen eines Dreiecks, Verringern der Höhe und Breite um die Hälfte, Erstellen von drei Kopien des resultierenden Dreiecks und Platzieren der beiden Dreiecke an einer Ecke erstellt wird. Dieser Vorgang wird mit den resultierenden Dreiecken immer wieder wiederholt, um das Sierpinski-Dreieck zu erzeugen, wie unten dargestellt.
Schreiben Sie ein Programm, um ein Sierpinski-Dreieck zu erzeugen. Sie können eine beliebige Methode zum Generieren des Musters verwenden, indem Sie entweder die tatsächlichen Dreiecke zeichnen oder das Bild mithilfe eines Zufallsalgorithmus generieren. Sie können in Pixeln, ASCII-Grafiken oder nach Belieben zeichnen, solange die Ausgabe dem zuletzt gezeigten Bild ähnelt. Die wenigsten Charaktere gewinnen.
Antworten:
HTML + JavaScript, 150 Zeichen (siehe Hinweise für 126 Zeichen)
Leerzeichen zur besseren Lesbarkeit eingefügt und nicht gezählt.
Der Kern davon ist das Anwenden der Regel zum Färben von Pixeln, für die
x & y == 0
durch die Bedingungx&y||
ein "Sierpinski-rechtwinkliges Dreieck" erzeugt wird; undx-~y/2,k-y
sind eine Koordinatentransformation, um die annähernd gleichseitige Anzeige zu erzeugen.Eine weniger korrekte (HTML-weise) Version ist 126 Zeichen:
(Dies ist weniger richtig, weil das
title
Element und das End-Tag descanvas
Elements weggelassen werden. Beide sind für ein korrektes Dokument erforderlich, obwohl das Weglassen die Interpretation des Dokuments nicht verändert .)Durch Eliminieren
k
der Konstanten können drei Zeichen64
auf Kosten eines geringeren Ergebnisses gespeichert werden . Ich würde die8
Option nicht zählen, da sie nicht ausreichend detailliert ist.Beachten Sie, dass für eine Größe von 256 oder höher Attribute für die erforderlich sind
<canvas>
, um die Leinwandgröße von der Standardgröße zu erhöhen.quelle
<canvas id=c>
und dannc.getContext
. Schleifen kürzen:for(x=k=128;x--;)for(y=k;y--;)
x&y?0:
Kann durch einex&y||
ansonsten schöne Lösung ersetzt werden.GolfScript (
4342 Zeichen)Ausgabe:
Ändern Sie die "3" in eine größere Zahl für ein größeres Dreieck.
quelle
Python (234)
Maximales Golfen, winziges Bild:
Benötigt
python3-cairo
.Um ein schönes großes Bild zu bekommen, brauchte ich 239 Zeichen.
quelle
import cairo as c
Was würden Sie ein paar Zeichen sparenMathematica - 32 Zeichen
Mathematica - 37 Zeichen
Dies erzeugt eine 2D-Tabelle von 0 und 1, wobei 1s das Sierpinski-Dreieck zeichnen.
quelle
ArrayPlot@CellularAutomaton[90, {{1}, 0}, 31]
oder besser angezeigtMatrixPlot@CellularAutomaton[90, {{1}, 0}, 31]
.ReliefPlot@
...Python,
10186Verwendet die Regel 90 Automat.
Das ist länger, aber schöner.
Edit: direkt mit Streichern spielen, störend lange Schnitte loswerden, Ausgabe schöner machen.
Ausgabe:
quelle
J
Nicht ideal, da das Dreieck schief ist und viele Leerzeichen folgen - aber trotzdem interessant, dachte ich.
Ausgabe:
Eine kurze Erklärung:
Das Verb
(,~,.~)
ist, was die Arbeit hier macht. Es ist ein Hook, der zuerst,.
das Argument an sich selbst näht (o
->oo
) und dann das ursprüngliche Argument an die Ausgabe anfügt:wird
Dieses Verb wird sechsmal wiederholt,
^:6
wobei die Ausgabe jeder Iteration zur Eingabe der nächsten Iteration wird. Damitwird
was wiederum wird
etc. Ich habe dann das schräge Adverb on append verwendet
,/.
, um die Zeilen diagonal zu lesen, um das Dreieck zu begradigen. Ich brauchte das nicht zu tun, wie Randomra betont . Ich hätte|.
das Los einfach umkehren können , um das gleiche Ergebnis zu erzielen. Noch besser wäre es, wenn ich(,,.~)^:6,'o'
den umgekehrten Schritt komplett hätte speichern können.Na ja, du lebst und lernst. :-)
quelle
|.(,~,.~)^:6,'o'
ist kürzer und ohne zusätzliche Leerzeichen. Und(,~,.~)^:6,1
gibt auch eine anständige Eingabe in nur 12 Zeichen!APL (51)
Erläuterung:
A←67⍴0
: A ist ein Vektor von 67 NullenA[34]←1
: das 34. Element ist 1{...}A
: beginnend mit A, mache:~⊃⍵:
: wenn das erste Element der aktuellen Zeile Null ist⍵,∇
: füge die aktuelle Zeile zur Antwort hinzu und rekursiere mit:(1⌽⍵)≠¯1⌽⍵
: der Vektor, in dem jedes Element das XOR seiner Nachbarn in der vorherigen Generation ist⋄⍬
: sonst sind wir fertig32 67⍴
: formatiere dies in einer 67x32 Matrix1+
: Fügen Sie einen hinzu, um den richtigen Wert aus dem Zeichenfeld auszuwählen' ○'[
...]
: gibt entweder ein Leerzeichen (nicht Teil des Dreiecks) oder einen Kreis (wenn es Teil des Dreiecks ist) ausAusgabe:
quelle
Haskell (291)
Ich bin nicht sehr gut darin, Haskell-Codes zu spielen.
Ausgabe von
solve 4
ist:quelle
QBasic 151 Zeichen
Als Beispiel sehen Sie hier, wie dies in QBasic gemacht werden kann.
quelle
Python (42)
Ursprünglich wollte ich ein paar Vorschläge zur Lösung von boothbys posten (wer verwendet eigentlich Regel 18 :), aber ich hatte nicht genug Ruf, um Kommentare abzugeben , also habe ich es zu einer anderen Antwort gemacht. Da er seinen Ansatz geändert hat, habe ich eine Erklärung hinzugefügt. Meine Vorschläge wären gewesen:
was zu folgendem Code (93 Zeichen) geführt hätte:
Aber ich habe weiter optimiert, indem ich zuerst ein Longint anstelle eines Integer-Arrays verwendet und nur die binäre Darstellung (75 Zeichen) ausgedruckt habe:
Und schließlich durch Drucken der Oktaldarstellung, die bereits von der printf-Interpolation unterstützt wird (42 Zeichen):
Alle von ihnen werden drucken:
Natürlich gibt es auch eine grafische Lösung (131 Zeichen):
: D
quelle
x=8**31;exec"print'%o'%x;x^=x/8;"*32
8086 Maschinencode - 30 Bytes.
HINWEIS: Dies ist nicht mein Code und sollte nicht als Antwort akzeptiert werden . Ich habe dies festgestellt, als ich an einem anderen CG-Problem arbeitete , um eine 8086-CPU zu emulieren . Die beigefügte Textdatei schreibt David Stafford gut , aber das ist das Beste, was ich mir einfallen lassen konnte.
Ich poste das, weil es clever ist, kurz, und ich dachte, du würdest es sehen wollen.
Es werden überlappende Opcodes verwendet, um mehr Anweisungen auf kleinerem Raum zu packen. Erstaunlich schlau. Hier ist der Maschinencode:
Eine direkte Dekodierung sieht folgendermaßen aus:
Beachten Sie beim Ausführen, wenn der Sprung um 0x0115 erfolgt, dass der Sprung zurück zu 0x010C erfolgt, genau in der Mitte einer vorherigen Anweisung:
Brillant! Ich hoffe, es macht euch nichts aus, wenn ich das teile. Ich weiß, dass es an sich keine Antwort ist, aber es ist für die Herausforderung von Interesse.
Hier ist es in Aktion:
quelle
C
12711911610865Dieser verwendet den Trick der HTML-Antwort,
^ i & j
dass es 1 Zeichen mehr kosten würde, um eine hübsche Ausgabe zu drucken (Sie können eine wirklich hässliche Ausgabe erhalten, indem Sie die opferna^
).Um es zu drehen ziemlich
(32^i&j)
zu(32|!(i&j))
und schalten Sie es aus++i<a
zu++i<=a
. Allerdings scheint es mir ungolfisch, Zeichen für das Aussehen zu verschwenden.Hässliche Ausgabe:
Eigentlich mag ich, wie es aussieht. Aber wenn Sie darauf bestehen, dass es hübsch ist, können Sie vier Zeichen andocken. Hübsche Ausgabe:
Die ältere Version mit 108 Zeichen für zellulare Automaten bleibt erhalten.
Also denke ich nicht, dass ich es viel kürzer machen werde, also erkläre ich den Code.Ich lasse diese Erklärung offen, da einige der Tricks nützlich sein könnten.Einige Ausgabe
quelle
80x86 Code / MsDos - 10 Bytes
Als auf winzige Intros für MsDos spezialisierter Größenkodierer gelang es mir, ein Programm zu entwickeln, das nur 10 Bytes belegt.
in hex:
in asm:
Die erste Version, die ich codiert habe, war "Colpinski", 16 Byte groß und sogar interaktiv, so dass Sie die Farbe mit der Tastatur und der Maus ändern können. Zusammen mit "Frag" - einem anderen Größenkodierer - haben wir diesen auf 13 Byte reduziert, was ein 10-Byte-Programm ermöglicht, das nur die Kernroutine enthält.
Es wird ein bisschen interessanter, wenn die Dinge animiert werden, also werde ich eine andere Version erwähnen, Zoompinski 64 - der versucht, das genaue Verhalten von "Zoompinski C64" in 512 Bytes nachzuahmen - auch für MsDos, 64 Bytes groß, wie der Name vermuten lässt.
Es ist möglich, diesen Rückgang auf 31 Byte zu optimieren und dabei Eleganz, Farben und Symmetrie zu verlieren (Quelle und ausführbare Datei unter dem obigen Link verfügbar).
Laden Sie das Original herunter und kommentieren Sie "Pouet"
quelle
PostScript, 120 Zeichen
Ghostscript-Ausgabe:
Dies zeichnet die Figur, indem rekursiv verdreifacht wird, was bereits gezeichnet wurde.
Der erste Schritt ist das Zeichnen einer Linie. Die Linie wird als Benutzerpfad gespeichert, und der Benutzerpfad wird nach jeder Drehung um 120 Grad noch zweimal hinzugefügt.
[2 0 0 2 7 4]concat
Verschiebt den "Rotationspunkt" in die Mitte des nächsten großen weißen "Mittendreiecks", das von Replikationen des bereits vorhandenen Dreiecks eingeschlossen werden soll. Hier kehren wir zu Schritt 1 zurück (Erstellen eines Upaths, der durch Rotation verdreifacht wird).Die Anzahl der Iterationen wird durch die erste Nummer in Zeile 3 gesteuert.
quelle
J (9 Zeichen)
Leicht das hässlichste, man muss wirklich schielen, um die Ausgabe zu sehen;)
erzeugt die Ausgabe
Natürlich können Sie es grafisch darstellen:
quelle
APL,
3732 (2823)Aufrechtes Dreieck (
37,32 Zeichen)Erläuterung
1 2⍴'/\'
: Erstellen Sie eine 1 × 2-Zeichenmatrix/\
{((-1⌷⍴⍵)⌽⍵,∊⍵)⍪⍵,⍵}
: Eine Funktion, die das rechte Argument auf beiden Seiten mit Leerzeichen auffüllt, um eine Matrix zu erstellen, die doppelt so breit ist. Anschließend wird das rechte Argument selbst doppelt auf den unteren Rand laminiert. WürdezB
/\
werden⍣⎕
: Wiederholen Sie die Funktion (Benutzereingabe) Zeiten.Beispielausgabe
Verdrehtes Dreieck (
28,23 Zeichen)Erklärung
1 1⍴'○'
: Erstellen Sie eine 1 × 1-Zeichenmatrix○
{(⍵,∊⍵)⍪⍵,⍵}
: Eine Funktion, die das rechte Argument mit Leerzeichen auffüllt, um eine Matrix zu erstellen, die doppelt so breit ist, und dann das rechte Argument selbst doppelt auf den unteren Rand laminiert. WürdezB
○
werden⍣⎕
: Wiederholen Sie die Funktion (Benutzereingabe) Zeiten.Beispielausgabe
quelle
Python (75)
Ich bin zwei Jahre zu spät zur Party, aber ich bin überrascht, dass noch niemand diesen Ansatz gewählt hat
Verwendet das Kronecker-Produkt , um eine Matrix durch mehrere Kopien von sich selbst zu ersetzen.
Ich könnte zwei Zeichen einsparen, indem ich
x=kron(x,x);x=kron(x,x)
in Zeile drei ein 16x16-Pixel-Bild mit drei sichtbaren Ebenen erzeuge oder dem Iterator ein weiteres Zeichen hinzufüge und am Ende ein 2 ^ 16 x 2 ^ 16 = 4,3-Gigapixel-Bild und 15 Dreiecks-Ebenen erhalte.quelle
Logo, 75 Zeichen
59 Zeichen nur für die erste Funktion, die zweite ruft die erste mit der Größe und der Tiefe / Anzahl der Iterationen auf. Sie können also einfach die erste Funktion des Interpreters mit dem folgenden Befehl aufrufen: e 99 5 oder mit der Größe, die Sie ausgeben möchten
quelle
to f
undend
um entfernene 99 5
, haben Sie ein vollständiges ausführbares Programm in weniger Zeichen. Außerdem können Sie in UCBLogo (wenn auch nicht in anderen Versionen) die Doppelpunkte für die Variablen verlieren, um mehr Zeichen zu sparen.matlab 56
quelle
J (18 Zeichen)
Ergebnis
quelle
Python (90 Zeichen)
Probieren Sie es online aus
Zeichnen Sie eine fraktale Linie, die das Sierpinsky-Dreieck füllt
quelle
ht();speed(0);up();goto(20-window_width()/2, 20-window_height()/2);down()
nach dem Import. Dadurch wird es viel schneller ausgeführt und sichergestellt, dass die Ausgabe auf die Zeichenfläche passt.Mathematica 67
Mathematica 92
quelle
Mathematica , 29 Bytes
Das Sierpinski-Tetraeder kann auf ähnliche Weise gezeichnet werden:
quelle
J ,
37-35Bytes-2 Bytes dank FrownyFrog
Probieren Sie es online!
Dies ist Peter Taylors ASCII-Kunstversion, die in J konvertiert wurde. Mit einer weniger hübschen Version könnten Bytes gespart werden, aber warum?
quelle
@]^:[
->@[&0
und' /\ '
->' /\'
&0
Trick dokumentiert ist?,~
.Lua- Skript in Golly , 54 Byte
Golly ist ein Simulator für zellulare Automaten mit Unterstützung für Lua- und Python-Skripte.
Dieses Skript setzt die Regel auf Wolfram-Regel 60, setzt die Zelle auf (0,0) auf 1 und führt 512 Schritte aus.
quelle
Nachsatz,
205203Das Umschreiben mit Zeichenfolgen und Rekursion erfolgt mit genau der gleichen Anzahl. Die Tiefenbegrenzungen des Makroansatzes sind jedoch überwunden.
Bearbeiten:
fill
ist kürzer alsstroke
.Eingerückt und kommentiert.
Das Hinzufügen
0 setlinewidth
gibt einen besseren Eindruck davon, wie tief dies geht.quelle
APL (Dyalog Classic) , 12 Byte
Probieren Sie es online!
quelle
Asymptote, 152 Bytes
Ich füge dies hinzu, meistens, weil ich auf dieser Seite in der Asymptote mehr oder weniger keine Antworten gesehen habe. Ein paar verschwendete Bytes für eine gute Formatierung und Allgemeinheit, aber damit kann ich leben. Das Ändern von A, B und C ändert sich dort, wo sich die Ecken des Dreiecks befinden, aber wahrscheinlich nicht so, wie Sie denken. Erhöhen Sie die Zahl in der Ungleichung, um die Tiefe zu erhöhen.
oder ungolfed und lesbar
Asymptote ist also eine nette Vektorgrafiksprache mit etwas C-ähnlicher Syntax. Sehr nützlich für technische Diagramme. Die Ausgabe erfolgt natürlich standardmäßig im Vektorformat (eps, pdf, svg), kann aber in praktisch alles konvertiert werden, was imagemagick unterstützt. Ausgabe:
quelle
Haskell ,
166154 Bytes(-12 Bytes dank Laikoni, (zip- und Listenverständnis statt zipWith und Lambda, bessere Möglichkeit, die erste Zeile zu generieren))
Probieren Sie es online!
Erläuterung:
Die Funktion
i#n
zeichnet2^n
nachi
Iterationsschritten ein ASCII-Dreieck der Höhe .Die intern verwendete Codierung codiert leere Positionen als
1
und volle Positionen als0
. Daher wird die erste Zeile des Dreiecks codiert , wie[1,1,1..0..1,1,1]
mit2^n-1
denen auf beiden Seiten der Null. Um diese Liste zu erstellen, beginnen wir mit der Listex=1<$[2..2^n]
, dh der Liste,[2..2^n]
auf die alles abgebildet ist1
. Dann erstellen wir die vollständige Liste alsx++0:x
Der Operator
k!p
(ausführliche Erläuterung unten) erzeugt bei gegebenem Zeilenindexk
und einem entsprechendenp
eine unendliche Liste der folgenden Zeilenp
. Wir rufen es mit1
und der oben beschriebenen Startzeile auf, um das gesamte Dreieck zu erhalten, und nehmen dann nur die ersten2^n
Zeilen. Dann drucken wir einfach jede Zeile aus und ersetzen sie1
durch Leerzeichen und0
mitM
(indem wir auf die Liste"M "
am Standort0
oder zugreifen1
).Der Operator
k!p
ist wie folgt definiert:Zuerst erzeugen wir drei Versionen von
p
:1:p
diep
mit einem1
vorangestellten, sichp
selbst undtail p++[1]
das alles andere als das erste Element vonp
, mit einem1
angehängten. Wir zippen dann diese drei Listen und geben uns effektiv alle Elementep
mit ihren linken und rechten Nachbarn wie(l,m,r)
. Wir verwenden ein Listenverständnis, um dann den entsprechenden Wert in der neuen Zeile zu berechnen:Um diesen Ausdruck zu verstehen, müssen wir zwei grundlegende Fälle berücksichtigen: Entweder erweitern wir einfach die vorherige Zeile, oder wir befinden uns an einem Punkt, an dem eine leere Stelle im Dreieck beginnt. Im ersten Fall haben wir eine ausgefüllte Stelle, wenn eine der Stellen in der Nachbarschaft ausgefüllt ist. Dies kann wie folgt berechnet werden
m*l*r
; Wenn einer dieser drei Werte Null ist, ist der neue Wert Null. Der andere Fall ist etwas kniffliger. Hier benötigen wir grundsätzlich eine Kantenerkennung. Die folgende Tabelle gibt die acht möglichen Nachbarschaften mit dem resultierenden Wert in der neuen Zeile an:Eine einfache Formel, um diese Tabelle zu erhalten, wäre,
1-m*r*(1-l)-m*l*(1-r)
was vereinfachtm*(2*l*r-l-r)+1
. Jetzt müssen wir zwischen diesen beiden Fällen wählen, in denen wir die Zeilennummer verwendenk
. Wennmod k (2^(n-i)) == 0
wir den zweiten Fall verwenden müssen, verwenden wir den ersten Fall. Der Begriff0^(mod k(2^n-i))
lautet daher,0
ob wir den ersten Fall verwenden müssen und1
ob wir den zweiten Fall verwenden müssen. Als Ergebnis können wir verwendenInsgesamt - wenn wir den ersten Fall verwenden, erhalten wir einfach
m*l*r
, während im zweiten Fall ein zusätzlicher Term hinzugefügt wird, der die Gesamtsumme von ergibtm*(2*l*r-l-r)+1
.quelle
C 106 Zeichen
(Es amüsiert mich immer noch, dass dies
puts("")
der kürzeste Weg ist, eine neue Zeile in C auszugeben.)Beachten Sie, dass Sie größere (oder kleinere) Dichtungen erstellen können, indem Sie den Test
32
in derfor
Schleife durch eine größere (kleinere) Zweierpotenz ersetzen, sofern Sie auch33
die mittlere durch dieprintf()
Zweierpotenz plus ersetzen. einer.quelle