Überblick
Schreiben Sie ein Programm, das einfache fraktale Muster mit einem Bitmuster, das das Fraktal codiert, plus dem Skalierungsfaktor pro Generation für das Fraktal und die Anzahl der Generationen druckt.
Erläuterung
Hier ist eine ASCII-Darstellung des Sierpinski-Teppichs :
Generation 0:
#
Generation 1:
# # #
# #
# # #
Generation 2:
# # # # # # # # #
# # # # # #
# # # # # # # # #
# # # # # #
# # # #
# # # # # #
# # # # # # # # #
# # # # # #
# # # # # # # # #
Die Generation n + 1 des ASCII-Sierpinski-Teppichs besteht aus einem 3x3-Raster mit 8 Kopien der Generation n, wobei das zentrale Element des Rasters fehlt.
Wir können also sagen, dass es einen Skalierungsfaktor von 3 hat, da es mit einem 3x3-Raster definiert wird und in Breite und Höhe bei jeder Generation dreimal größer wird.
Wir könnten ein Bitmuster für den Sierpinski-Teppich definieren, indem wir die Elemente im 3x3-Raster von 0 bis 8, von oben nach unten und von links nach rechts nummerieren und das entsprechende Bit einer Ganzzahl setzen, wenn die Generation n + 1 a enthält Kopie der Generation n an dieser Gitterposition:
bit: place value: bit pattern: bit value:
0 1 2 1 2 4 1 1 1 1 2 4
3 4 5 8 16 32 1 0 1 8 0 32
6 7 8 64 128 256 1 1 1 64 128 256
integer value = 1 + 2 + 4 + 8 + 32 + 64 + 128 + 256 = 495
Für einen Skalierungsfaktor von 2 würde das Bitmuster folgendermaßen angeordnet sein:
0 1
2 3
und so weiter.
Ihre Aufgabe ist es, ein Programm zu schreiben, das ein Bitmuster in dieser Form, einen Skalierungsfaktor (z. B. 3 für den Sierpinski-Teppich) und eine Generationsnummer akzeptiert und ein ASCII-Fraktal ausgibt.
Eingang
Ihr Programm sollte 3 Ganzzahlen in der folgenden Reihenfolge akzeptieren: ein Bitmuster, einen Skalierungsfaktor (von 2 bis einschließlich 5) und eine Generierungszahl (von 0 bis einschließlich 5).
Sie müssen für diese Werte keine Eingabevalidierung durchführen, und es ist vollkommen in Ordnung, wenn das Programm für Werte arbeitet, die über den angegebenen Bereichen liegen.
Die Eingaben können in beliebiger Form (Tupel, durch Kommas / Leerzeichen getrennte Liste usw.) übergeben werden.
Ausgabe
Das Programm sollte ein Fraktal ausgeben, das aus dem #
Zeichen besteht, gefolgt von einem Leerzeichen an den Stellen, an denen das Fraktal definiert ist, doppelten Leerzeichen, an denen es nicht definiert ist, und einem Zeilenumbruchzeichen am Ende jeder Zeile, das entweder ausgedruckt oder eine Zeichenfolge zurückgegeben wird von einer Funktion.
Beispiele
Eingang:
495,3,3
Leistung (Sierpinski Carpet Generation 3):
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
Eingang:
7,2,5
Ausgabe ( Sierpinski-Dreieck ):
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # #
# # # #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # #
# # # #
# # # # # # # #
# # # #
# # # #
# #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # #
# # # #
# # # # # # # #
# # # #
# # # #
# #
# # # # # # # #
# # # #
# # # #
# #
# # # #
# #
# #
#
Eingang:
325,3,3
Leistung ( Cantor Dust ):
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
Eingang
186,3,3
Ausgabe ( Vicsek-Fraktal ):
#
# # #
#
# # #
# # # # # # # # #
# # #
#
# # #
#
# # #
# # # # # # # # #
# # #
# # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # #
# # #
# # # # # # # # #
# # #
#
# # #
#
# # #
# # # # # # # # #
# # #
#
# # #
#
Eingang:
279,3,3
Ausgabe (Beispiel eines asymmetrischen Fraktals):
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # #
# # #
# # # # # # # # #
# # #
# # #
# # # # # # # # #
# # #
# # #
# # #
#
#
# # #
#
#
# # # # # # # # #
# # #
# # #
# # #
#
#
# # #
#
#
etc.
Anmerkungen:
- Das ist Code-Golf, also gewinnt die kürzeste Antwort in Bytes
- Ihr Programm kann entweder ein eigenständiges Programm oder eine Funktion sein, die mit den drei Eingabeparametern aufgerufen wird und eine Zeichenfolge zurückgibt (oder ausgibt)
- Generation 0 ist definiert als
#
(#
gefolgt von einem Leerzeichen), auch für ein Bitmuster von 0. - Ein abschließender Zeilenumbruch in der letzten Zeile ist optional, aber zulässig, ebenso wie ein beliebiger Leerraum in jeder Zeile.
"##"
zu"# "
. Ich sehe, dass das letzte Leerzeichen am Ende der Zeile in Ihren Beispielen enthalten ist. Ist es erforderlich? . Nach der letzten Regel würde ich annehmen, dass dies optional ist, aber die Tatsache, dass Sie für die Generation 0 einen nachgestellten Speicherplatz benötigen, wundert mich. Außerdem denke ich, dass Sie das maximale Leerzeichen und die erlaubten Zeilenumbrüche (Sie haben es im Plural) angeben sollten. Als extremes Beispiel könnte ich immer mit einem Array von 5 ^ 6 = 15625 Zeilen mit 2 * 5 ^ 6 Leerzeichen beginnen und dann das#
s ersetzen . In den meisten Eingabefällen ist das eine enorme Menge an nicht verwendetem Leerzeichen279,3,3
.Antworten:
APL (Dyalog Unicode) , 37 Byte SBCS
Probieren Sie es online!
quelle
Gemeines Lisp,
248242 BytesUngolfed
Erläuterung
dotimes
) und berechnen, ob jede Zelle gezeichnet werden soll (Raycast-ähnlicher Ansatz). Dies geschieht durch rekursives Betrachten des Fraktals mit derf
Hilfsfunktion."# "
oder sonst gedruckt werden" "
. Natürlich drucken wir auch Zeilenumbrüche am Ende jeder Zeile.Zum Beispiel wird Sierpinskys Dreieck durch
S=7
und dargestelltR=2
. Bei Generation 3 ist die Quadratgröße 2 3 = 8. Für jede Zelle (x, y) geschieht Folgendes:f
heißt mit x , y , g an 3 und s an 4 gebunden (8/2)truncate
gibt sowohl den Quotienten als auch den Rest zurück, die jeweils an px und x gebunden sind (wir verwenden dasselbe Symbol x , aber dies ist kein Problem).f
rekursiv die neuen Bindungen für x und y auf . Dies ist nun die relative Position innerhalb des inneren Fraktals. Wir übergeben G-1 für die Generation und s / 2 , um die halbe Länge des Fraktals darzustellen.Beispiel
Die Berechnung der achten Generation des Sierpinski-Teppichs
(fractal 495 3 8)
dauert 24,7 Sekunden und erzeugt eine Ausgabetextdatei von 83 MB. Ich habe eine leicht modifizierte Version geschrieben, die ein Bild ausgibt. Für die gleichen Parameter wiegt die GIF-Datei 1,5 MB (gleiche Rechenzeit):Vicsek (Klicken um Originalgröße zu sehen):
quelle
)
in einer Reihe verschachtelt !Pyth, 38 Bytes
Probieren Sie es online aus: Regular Input / Test Suite
Erklärung folgt später.
quelle
186 3 5
(Online-Dolmetscher), aber ansonsten bin ich wirklich beeindruckt, wie kurz das ist.Rubin, 154
Die Punktzahl gilt nur für die Funktion. Unten im Testprogramm ungolfed dargestellt. Das einzige, was ich im Moment behaupte, ist das Entfernen von Kommentaren und Einrückungen. Ich werde später Golf spielen. Im Moment macht es mir Spaß, mit dem Programm zu spielen.
Die Funktion akzeptiert sechs Argumente, aber beim ersten Aufruf werden nur die ersten 3 gemäß der Spezifikation bereitgestellt. Dadurch werden die drei verbleibenden Argumente auf Standardwerte gesetzt, und insbesondere die Zeichenfolge,
a
in der die Ausgabe gespeichert ist, wird erstellt und in Zeilen mit Leerzeichen initialisiert, die durch Zeilenumbrüche abgeschlossen werden. Als Nebeneffekt wird auch die globale Variable$w
erstellt, die die Anzahl der Symbole pro Zeile angibt.Wenn die Funktion sich selbst rekursiv aufruft, werden alle sechs Argumente bereitgestellt, einschließlich der Zeichenfolge
a
und der x- und y-Koordinaten der oberen linken Ecke der nächsten RekursionDer Rest des Programms ist ziemlich unkompliziert, wie in den Kommentaren angegeben.
Ausgabe
Hier ist eine Reihe von Fraktalen, die lose auf der Form der Buchstaben des Wortes GOLF basieren. Realistischere Buchstaben könnten mit größeren Bitmaps erzielt werden. Wie das letzte Beispiel zeigt, werden die interessantesten Fraktale zufällig entdeckt.
quelle
CJam, 45
Umsetzung meiner ersten Idee. Probieren Sie es online aus
Grundsätzlich beginnt es mit einer 1 * 1-Matrix, die 3 enthält (die Differenz zwischen '#' und ''), multipliziert dann wiederholt jede Zahl in der Matrix mit dem Bitmuster (0/1-Matrix) und kombiniert die resultierenden Matrizen zu einer größere Matrix. Am Ende wird jeder Zahl ein Leerzeichen hinzugefügt und mit Leerzeichen und Zeilenumbrüchen verbunden.
2. Idee, 49
Probieren Sie es online aus
Dies erzeugt alle Koordinaten der Ausgabematrix als Arrays von <Generierungszahl> -Zahlenpaaren, die kleiner als der Skalierungsfaktor sind (alle diese Kombinationen). Für jedes Zahlenpaar wird dann das entsprechende Bit aus dem Muster und für jedes Koordinatenarray abgerufen es multipliziert die Bits und multipliziert mit 3. Die endgültige Verarbeitung ist dieselbe.
Es gibt wahrscheinlich Platz für mehr Golf.
quelle
C 316 Bytes
Nicht golfen:
quelle
Scala
293299ungolfed:
Beispiele:
erster schnitt, kann wohl noch etwas weiter golfen werden ...
quelle
#
. Abgesehen davon, dass es von der Spezifikation verlangt wird, verbessert es das Erscheinungsbild Ihrer Ausgabe.Matlab, 115 Bytes
Das Kronecker-
kron
Produkt macht alles viel einfacher:quelle
de2bi
funktioniert jedoch nur, wenn Sie über die Communications Systems Toolbox verfügen. Geht nicht ohne Es würde brauchendec2bin
.de2bi
dies nicht dasselbe ist wiedec2bin
.)C 158 Bytes
quelle
K5, 70 Bytes
Es ist ein Anfang:
In Aktion:
quelle