Einführung
In dieser Herausforderung wird eine 2 × 2-Matrix wie folgt indiziert:
0 1
2 3
Wir definieren eine Familie von fraktalen Mustern F(L)
, wobei L
es sich um eine Längenliste n
dieser Indizes handelt und F(L)
die Größe hat .2n-1 × 2n-1
- Wenn ja
L == []
, dannF(L)
ist das 1 × 1-Muster#
. Wenn
L != []
, dannF(L)
ist wie folgt aufgebaut. SeiP
das Muster, von dem dasL
erste Element entfernt wurde. Nehmen Sie vier mit Punkten gefüllte Raster und ersetzen Sie das mit dem Muster indizierte Raster . Kleben Sie dann die Gitter zusammen, indem Sie eine Schicht Hashes dazwischen verwenden. Hier sind Diagramme für die vier Fälle:2n-1-1 × 2n-1-1
.
L[0]
P
#
L[0]==0 L[0]==1 L[0]==2 L[0]==3 #... ...# ...#... ...#... [P]#... ...#[P] ...#... ...#... #... ...# ...#... ...#... ####### ####### ####### ####### ...#... ...#... #... ...# ...#... ...#... [P]#... ...#[P] ...#... ...#... #... ...#
Beispiel
Betrachten Sie die Eingabe L = [2,0]
. Wir beginnen mit dem 1 × 1-Raster #
und überqueren es L
von rechts. Das am weitesten rechts stehende Element ist 0
, also nehmen wir vier Kopien des 1 × 1-Gitters .
, ersetzen das erste durch #
und kleben sie mit Hashes zusammen. Dies ergibt das 3 × 3-Raster
##.
###
.#.
Das nächste Element ist 2
, also nehmen wir vier Kopien des 3 × 3-Gitters von .
s und ersetzen das dritte durch das obige Gitter. Die vier Gitter sind
... ... ##. ...
... ... ### ...
... ... .#. ...
und kleben sie zusammen mit #
s ergibt das 7 × 7-Raster
...#...
...#...
...#...
#######
##.#...
####...
.#.#...
Dies ist unsere endgültige Ausgabe.
Eingang
Ihre Eingabe ist eine Liste L
der Indizes 0, 1, 2, 3
. Sie können es als eine Liste von ganzen Zahlen oder eine Folge von Ziffern nehmen. Beachten Sie, dass es möglicherweise leer ist und Duplikate enthält. Die Länge von L
beträgt höchstens 5.
Ausgabe
Ihre Ausgabe ist das Muster F(L)
als durch Zeilenumbrüche getrennte Zeichenfolge.
Regeln und Wertung
Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.
Testfälle
[]
#
[0]
##.
###
.#.
[3]
.#.
###
.##
[2,0]
...#...
...#...
...#...
#######
##.#...
####...
.#.#...
[1,1]
...#.##
...####
...#.#.
#######
...#...
...#...
...#...
[1,2,0]
.......#...#...
.......#...#...
.......#...#...
.......########
.......###.#...
.......#####...
.......#.#.#...
###############
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
[3,3,1]
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
###############
.......#...#...
.......#...#...
.......#...#...
.......########
.......#...#.##
.......#...####
.......#...#.#.
[0,1,2,3]
.......#...#...#...............
.......#...#...#...............
.......#...#...#...............
.......#########...............
.......#.#.#...#...............
.......#####...#...............
.......#.###...#...............
################...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
###############################
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
[0,0,1,2,3]
.......#...#...#...............#...............................
.......#...#...#...............#...............................
.......#...#...#...............#...............................
.......#########...............#...............................
.......#.#.#...#...............#...............................
.......#####...#...............#...............................
.......#.###...#...............#...............................
################...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
################################...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
###############################################################
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
#
?L !=[]
In diesem Beispiel hat es 1 oder mehrere Elemente. Bedeutet dies , dass F (L) ist immer eine#
auf den ersten?L = [2,0]
Sie hacken also den Kopf ab und sehen sich das Muster anF([0])
. Dann hacken Sie den Kopf ab[0]
und schauen sich das Muster anF([])
, das das 1x1-Gitter ist#
. Dann verwenden Sie den abgeschnittenen Index0
, um das 3x3-Muster zu erstellen, und den abgeschnittenen Index2
, um das 7x7-Muster zu erstellen. Um Ihre Frage zu beantworten: Ja, Sie beginnen immer mit dem 1x1-Raster, da dies der Grundfall der Rekursion ist.Antworten:
CJam,
5947434140 BytesVielen Dank an Sp3000 für das Speichern von 1 Byte.
Teste es hier.
Erläuterung
Etwas veraltet. Wird später behoben.
Alle Dimensionsänderungen von 4D Listen machen mich schwindelig ...
Dieser Code implementiert die Spezifikation sehr wörtlich und verwendet den iterativen Algorithmus aus dem Beispielabschnitt anstelle der rekursiven Definition. Ein wichtiger Trick beim Golfen ist, dass ich Leerzeichen anstelle
#
der Berechnung verwende und sie nur#
am Ende durch ersetzen , was vereinfacht den Code an einer Stelle und ermöglicht es mir,S
anstelle von'#
oder"#"
in mehreren zu verwenden.quelle
MATL ,
4241 BytesProbieren Sie es online!
Erläuterung
Dies funktioniert iterativ mit einem Kronecker-Produkt , um das Array in jeder Iteration zu erweitern. Das Array wird mit
0
und1
anstelle von.
und erstellt#
und am Ende durch die entsprechenden Zeichen ersetzt.Es gibt so viele Iterationen wie die Eingabegröße. Die Eingabe wird von rechts nach links verarbeitet. Der Iterationsindex beginnt um
1
.Anhand des Beispiels in der Abfrage
[2,0]
wird das Array mit Eingabe wie folgt initialisiertDies entspricht dem initial
1
(#
), der um eine Zeile und eine Spalte erweitert ist, deren Zweck später klar wird. Die Werte in diesen Spalten sind nicht wichtig, da sie überschrieben werden. Sie könnten auch solche sein:Bei jeder Iteration wird das vorhandene Array mit einem 2 × 2-Null-Eins-Array multipliziert, das
1
an der durch den aktuellen Eintrag der Eingabe angegebenen Position und0
an den anderen Einträgen enthält. Im Beispiel bei der Iteration i = 1 ist0
das Null-Eins-Array , da der Eingang am weitesten rechts liegtund das Kronecker-Produkt dieser beiden Arrays ist
Als nächstes die Zeile und Spalte mit Index
2^i
mit Einsen gefüllt:Die ersten drei Zeilen und Spalten sind das Ergebnis der ersten Iteration. Wie zuvor gibt es eine zusätzliche Zeile und Spalte, die zum Erweitern des Arrays in der nächsten Iteration nützlich sind.
Bei Iteration i = 2
2
wird Kronecker-multipliziert mit , da der aktuelle Eingabewert das obige Array enthältwas gibt
Füllen Sie die
2^i
-te Zeile und Spalte mit EinsenDa dies die letzte Iteration ist, werden die zusätzliche Zeile und Spalte entfernt:
und die Zeichensubstitution wird durchgeführt, um das Endergebnis zu erzeugen:
Detaillierte Beschreibung des Codes folgt:
quelle
Haskell,
123122 BytesAnwendungsbeispiel:
Wie es funktioniert:
quelle
JavaScript (ES6),
171152 BytesNimmt das Ergebnis des rekursiven Aufrufs und ersetzt dann jede Zeile durch sich selbst plus einen Hash plus eine Folge von Punkten gleicher Länge, falls erforderlich in umgekehrter Reihenfolge, und erstellt dann aus diesem Teilergebnis eine Folge von Punkten mit Ausnahme der Zeilenumbrüche und der mittleren Spalte Hashes und eine Reihe von Hashes mit umgebenden Zeilenumbrüchen verbinden dann diese drei Zeichenfolgen in der entsprechenden Reihenfolge.
quelle
Rubin,
143134 BytesEine anonyme Funktion.
1 Byte gespart durch eine Umlagerung der ersten Zeile. Durch Ändern der Art und Weise, wie z von einer Formel zu einer Tabelle inkrementiert wird, werden 6 Bytes gespart. Durch Eliminieren von varable werden 2 Bytes gespart
w
.Ungolfed im Testprogramm
quelle
Ruby, 150 Bytes
Anonyme Funktion. Verwendet einen rekursiven Aufruf, um eine Liste von Zeichenfolgen zu erstellen, eine Zeichenfolge pro Zeile, und fügt sie am Ende alle zusammen.
quelle
Python 3.5, 1151 Bytes:
Nicht viel von einem Code Golf, aber na ja. Ich werde versuchen, es mit der Zeit zu beschneiden, wo ich kann.
Eine ziemlich naive Möglichkeit, dies zu tun, aber sie funktioniert derzeit einwandfrei und verwendet, wie Sie sehen, keine externen Module / Bibliotheken. Zusätzlich kann es annehmen Art und Weise mehr als 5 Artikel in der bereitgestellten Liste
s
, ohne dass die Genauigkeit zu verlieren (das heißt, wenn Ihre Hardware kann damit umgehen). Es erfüllt alle Anforderungen und ich könnte nicht zufriedener mit dem sein, was ich habe. :)Dank des bitweisen Operators kann jetzt auch nicht nur eine beliebige Zahl innerhalb des Bereichs
0=>3
als Wert, sondern eine beliebige Zahl , Punkt, akzeptiert&
werden! Sie können sie mehr über lesen hier . Nun ist zum Beispiel[4,4,1,2,3]
die Eingabeliste gleich wie[0,0,1,2,3]
.Hinweis: Eingabe muss als Liste bereitgestellt werden
Ungolfed mit Erklärung:
Breitere und optisch ansprechendere Erklärung:
Für eine breitere und visuell ansprechendere Erklärung betrachten Sie das zweite Mal, wenn Sie die "Haupt" -Schleife im obigen Code durchlaufen, in der sich die Eingabeliste befindet
[0,2]
. In diesem Falll
wären die Elemente in der "Haupt" -Liste :und
und Liste
y
würde nur enthalten0
. Unter Ausnutzung von Pythons Methode zur Indizierung des letzten Elements des Gittersl[-1]
können wir die ganz linken Elemente des Gitters folgendermaßen kennzeichnen:Welches Muster siehst du? Jeder Index ganz links im Gitter ist ein Vielfaches von 8, und da die Gleichung
2^(n-1)-1
die Länge jedes Punktsegments im Gitter ergibt, können wir((2^(n-1)-1)*2)+2
die Länge der oberen Kante des Gitters als Ganzes ermitteln (+2, um das mittlere#
s und das\n
am Ende einzuschließen). Wir können diese Gleichung verwenden, die wir aufrufeni
, um die Indexwerte jedes Elements auf der linken Seite eines Rasters beliebiger Größe zu finden, indem wir eine Liste erstellen und an die Liste jede Ganzzahl anhängen, die wir im Bereich aufrufen_
werden0=>length of grid l[-1]
: so dass dieses Element ein Vielfaches von isti
, und auch so, dass_
es NICHT gleich isti*(2^(n-1)-1)
, so dass wir das mittlere Segment von ausschließen können#
s Trennen der oberen von der unteren Hälfte. Wir wollen aber ALLE Punktelemente von links und nicht nur die Elemente ganz links. Nun, es gibt eine Lösung dafür, und das wäre, einfach an die Liste eine Liste anzuhängen, die enthält,i+h
wo h jede ganze Zahl im0=>2^(n-1)
Bereich0=>length of grid l[-1]
ist, jedes Mal, wenn ein Wert aus dem Bereich zur Liste hinzugefügt wird, so dass es jedes Mal sein wird Die Anzahl der Werte, die der Liste hinzugefügt wurden, entspricht der Länge eines Quadranten von Punkten. Und das ist Listea
.Aber wie steht es jetzt mit den Punkten auf der rechten Hälfte? Schauen wir uns die Indizierung einmal anders an:
Wie Sie sehen, sind die Werte in der Mitte diejenigen, die wir benötigen, da sie den Anfang des Index jedes Punktsegments auf der rechten Seite des Rasters darstellen. Wie ist das Muster hier? Nun, wenn es nicht schon offensichtlich genug ist, sind die Mittelwerte jetzt alle ein Vielfaches von
i/2
! Mit diesen Informationen können wir nun eine weitere Liste erstellenb
, zu der die Vielfacheni/2
aus dem Bereich hinzugefügt werden0=>length of grid l[-1]
, sodass jede Ganzzahl aus dem Bereich, den wir erneut aufrufen_
, NICHT gleich ist(i/2)*(p*2)
, um die Zeile von auszuschließen#
zwischen der oberen und der untere Hälften, UND so, dass _ NICHT bereits in Liste a enthalten ist, da wir nicht wirklich 8,16,32 usw. benötigen. in der Listeb
. Und jetzt wollen wir wieder nicht nur diese spezifischen Indizes. Wir wollen ALLE Punktzeichen auf der rechten Seite des Gitters. Nun, genau wie wir es in der Liste getana
haben, können wir hier auch der Liste hinzufügen, wo sich jede Ganzzahl im Bereich befindet .b
Listen in_+h
h
0=>2^(n-1)
Jetzt haben wir beide Listen
a
undb
verpackt und bereit zu gehen. Wie würden wir diese jetzt zusammenbringen? Dies ist , wo ListenW
,T
,G
, undC
kommen in. Sie werden die Indizes auf jeden spezifischen Quadranten von Punkten in Gitter haltenl[-1]
. Nehmen wir zumW
Beispiel die Liste als Liste für alle Indizes, die dem Quadranten 1 (Index 0) des Gitters entsprechen. In dieser Liste würden wir dann die ersten2^(n-1)
Listen aus der Liste hinzufügena
, da lista
alle Indizes für Punkte in der linken Hälfte des Rasters enthält, und sie dann alle aufteilen, sodass sieW
jetzt(2^(n-1))*(2^(n-1))
Elemente enthalten. Wir würden dasselbe für list tunT
, jedoch mit dem Unterschied, dassT
Elemente aus list enthalten wärenb
, daT
ist für Quadrant 2 (Index 1) reserviert. Liste istG
mit Liste identischW
, enthält jedoch den Rest der Elemente aus Listea
und ListeC
ist mit Liste identischT
, enthält jedoch jetzt den Rest der Elemente aus Listeb
. Und das ist es! Wir haben jetzt Indexwerte für jeden Quadranten mit Punkten im Raster, die alle in vier Listen aufgeteilt sind, die jedem Quadranten entsprechen. Wir können nun diese 4 Listen (W, T, G, C) verwenden, um dem Programm mitzuteilen, welche Zeichen es im Rasterl[-1]
durch jedes Zeichen aus dem Raster ersetzen solll[0]
, das das allererste Element der Liste istl
. Da der Wert0
hier ist, werden alle Punkte im ersten Quadranten (Index 0) durch Gitter ersetzt .l[0]
Liste Rasterauslastung ersetztW
Deshalb haben wir endlich folgendes:
Wütend! Ein langer Prozess, nicht wahr? Es funktioniert jedoch perfekt und ich könnte nicht glücklicher sein. :)
quelle