Wer liebt nicht ein gutes Fraktal? Der Sierpinski-Teppich ist ein klassisches Beispiel für ein Fraktal.
Um diese Aufgabe abzuschließen, müssen Sie einen Teppich vom Typ generieren und das resultierende Bild auf den stdout
(siehe Beispiel unten für die Formatierung) , der den ebenen Teppich darstellt, drucken . Schritte finden Sie in diesem Wikipedia- Artikel.
Dieser Wert wird von stdin
oder gleichwertig genommen.
Zum Beispiel würde eine Eingabe von 4 einen Teppich der Stufe 4 erzeugen:
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
Eine Eingabe von 3 würde einen Teppich der Stufe 3 erzeugen:
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
Eine Eingabe von 2 würde einen Teppich der Stufe 2 erzeugen:
■ ■ ■
■ ■
■ ■ ■
Und eine Eingabe von 1 würde einen Teppich der Stufe 1 erzeugen (nur ein Quadrat):
■
Beachten Sie die Leerzeichen zwischen den Spalten.
Die Idee ist, das ■ Zeichen für Blöcke und den Platz für Lücken zu verwenden
Die Zeile beginnt mit dem Zeichen ■.
Wie immer gewinnt die kleinste Lösung durch die Anzahl der Zeichen (aufgrund von Sonderzeichen).
Alternativ kann in Sprachen, die Unicode nicht unterstützen, anstelle des ■ Zeichens # verwendet werden.
Antworten:
CJam,
3837313028 ZeichenNa ja, wir zählen nach Zeichen, also lasst uns ein bisschen Unicode entpacken:
Teste es hier. Geben Sie einfach den gewünschten Pegel in das Eingabefeld ein.
Erläuterung
Nach der Basiskonvertierung ist dies
Das ist das Gleiche wie das Folgende, nur mit dem Unicode-Zeichen geschrieben als
9632c
:Dieser Code wird auf die folgende Beobachtung zugrunde: Wenn wir den Koordinaten betrachten (x, y) jeder Zelle, wir eine leere Zelle dann erhalten, wenn beide x und y haben einen
1
an der gleichen Position in ihrer Basis-3 - Darstellung. Wenn Sie darüber nachdenken, ist das sich wiederholende Muster im kleinen Maßstab die signifikante Basis-3-Ziffer, dann bestimmt die nächstgrößere Ziffer die nächstgrößere Wiederholung und so weiter.Der Inhalt des resultierenden Arrays wird automatisch gedruckt.
Vielen Dank an Dennis für das Abschneiden von drei Bytes.
quelle
#0<'■S
->#~S'■
speichert 1 Zeichen.[1_]a#~
mit3Yba&
.&
ein wahrer / falscher Wert entsteht (oder sogar, dass er existiert). Könnte einen Beitrag in den CJam-Tipps wert sein, um auf kanonische Weise zu testen, ob ein Array ein Element enthält.Matlab
(113) (110) (99)(85)Sie können es hier ausprobieren (Sie müssen es durch
input('')
Ihre gewünschte Eingabe ersetzen .)Jetzt 99 danke an feersum! Und jetzt auf 85 dank RTL!
Golf gespielt:
Ungolfed:
Erläuterung:
Ich missbrauche das kronecker-Produkt für diese Aufgabe. (Es handelt sich um ein spezielles Produkt, das für zwei beliebig große Matrizen definiert ist. Beispiel:
Dann
Hier ist ein Beispiel für n = 5 (in der alten Zählmethode ist es 4);
quelle
d=zeros(size([c,c]))
solltest du verwendend=[c c]*0
.d
kann durch Missbrauch vermieden wirdkron
einmal mehr:disp(char(kron(c,[1,0])*3+32));
,Haskell,
114108quelle
Python - 100
quelle
Perl 5: 68 Zeichen
n auf stdin.
Eine dezimalcodierte ternäre Darstellung der Koordinatenliste wird zuerst unter Verwendung der Ziffern 0, 1 und 3 in
@,
(Name so gewählt, dass kein Leerzeichen zwischen@,
und erforderlich ist) generiert. Dasfor
Hinzufügen von x- und y-Koordinaten in der Dezimaldomäne hat nun eine 2 im Ergebnis nur dann, wenn zwei übereinstimmende Positionen hatten.//
wird verwendet, um die Standardvariable$_
von der äußeren Schleife (for
) an die Postmatch-Variable weiterzugeben,$'
wenn sie von der Standardvariablenmap
in der inneren Schleife abgeschattet wird .quelle
Java,
330283 ZeichenParam ist die gewünschte Größe. Sofern es keine Optimierung für den Algorithmus gibt, habe ich versucht, alles zu zerquetschen.
Dank @StretchManiac, das die
i
Methode entfernt und die Deklarationen bereinigt hat, ging das ein bisschen schief.Lesbarer Code
quelle
String[]a
, und wenn Sie nuri
einmal verwenden, ist es besser, die Methode loszuwerden.""+s
in der Welt machst du deinep
Methode? Das sind drei zusätzliche Zeichen für absolut keinen Zweck. Selbst wenn die Art vons
etwas anderesString
wäre, wäre es immer noch völlig unnötig.static void p(int s){System.out.print((char)s);}
und in Haupt machen esint s=35;
,s=32;
undp(10);
(stattp("\n");
) und speichern ein paar mehr Zeichen.Integer.valueOf
aufnew Byte
Schläger
230229225220Nicht Schlägers schönste Stunde zum Golfen.
Golf gespielt:
Ungolfed:
quelle
C:
123 118 111104 ZeichenBasierend auf einer ähnlichen Idee wie meine Perl-Lösung. Nach dem Hinzufügen einiger Leerzeichen:
Verwendet ein ternäres System, das jede Ziffer mit 2 Bits codiert. Unzulässige Werte (mit zwei Werten in gerader-ungerader Position) werden mit gefiltert
x & (x>>1) & 0b01010101
. Beide Koordinaten werden in einem Wert gespeichert, sodass die Pixelfarbe überprüft werden mussx & (x >> 2 * n) & 0b01010101
.n
wird aus Bequemlichkeitsgründen als Zweierpotenz gespeichert.Bearbeiten
Ersetzt
define
durch eine einfache Konstantem
.Bearbeiten 2
0x5555555
Maske kann mit dargestellt werden(1LL<<32)/3
, aber wir brauchen nurn
diese Bits, alson/3
ist es ausreichend.Bearbeiten 3
Kleine Verbesserungen. Ein Gewinn von 2 Zeichen, der darauf beruht, dass scanf ausgeführt wird, bevor der Ladewert von
n
für die Ausführung von ausgeführt wird--n
. Das Eol kann nur folgen#
, duh.quelle
HTML / JavaScript, 205 Zeichen
Obfuscatweet , 205 Zeichen
HTML / JS, 298 Zeichen
Aufgrund der Art und Weise, wie HTML mit Leerzeichen spielt, mussten einige Zeichen dem nbsp-Zeichen zugewiesen werden. Außerdem ist die Standardschriftart der meisten Browser nicht Courier, weshalb ich sie auch darauf einstellen musste. Etwa 20 Zeichen im Wert von Styling. Wenn dies eine direkte Eingabemethode erfordert, kann ich sie hinzufügen, aber wenn Sie die Eingabe derzeit ändern, wird n auf einen anderen Wert gesetzt.
Demo
Lesbares HTML / JS
quelle
CJam,
38353231 ZeichenProbieren Sie es online aus.
Beispiellauf
Wie es funktioniert
konvertiert die Unicode-Zeichenfolge von der Basis 60.000 (
6e4b
) in die Basis 128 (128b
), wandelt sie in Character (:c
) um und wertet die resultierende Zeichenfolge (~
) aus.Als Ergebnis wird der folgende Code ausgeführt:
quelle
Python 3 -
116113 ZeichenEDIT: Nun, habe den Trick benutzt, den ich selbst nicht besonders mag und den Code um 3 Bytes komprimiert. Keine Ahnung, ob das der bestmögliche Weg ist, aber ich werde damit weitermachen.
Es kann einige nicht druckbare Zeichen enthalten. Hier ist eine druckbare Version der Zeichenfolge.
Nicht allzu toll, schlägt aber zumindest einige Sprachen.
Was es erweitert:
Etwas ungolfed für den Fall, dass jemand nicht sehen kann, wie es funktioniert:
quelle
Mathematica, 71 Bytes
Eingang
Ausgabe
quelle
CJam, 76 Zeichen
Dies ist eine direkte Übersetzung der hier angegebenen Formel
Probieren Sie es hier aus
quelle
Bash + Coreutils, 105 Unicode-Zeichen
Da wir Zeichen und nicht Bytes zählen:
In seiner dekodierten Form:
Pure Bash, 143 Bytes
Die Eingabe erfolgt über Befehlszeilenargumente:
Ausgabe:
quelle
C #
Volles Programm - 237:
LINQPad - 166+
Math.Ceiling(Math.Log(a + 1) / Math.Log(10))
quelle
using System;class P{static void Main(string[]a){string g,h;for(int b=(int)Math.Pow(3,int.Parse(a[0])-1),c=-1,d,e,f;++c<b;Console.WriteLine(g))for(g="",d=0;d<b;g+=h)for(h="■",e=c,f=d++;e>0|f>0;e/=3,f/=3)h=e%3==1&f%3==1?" ":h;}}
( 229 Bytes / 227 Zeichen ) (■
= 3 Bytes, also könnten Sie es durch ersetzen#
, um auch 2 Bytes zu sparen). Ich habe hauptsächlich alles innerhalb der for-Schleifen platziert, sodass keine Klammern mehr erforderlich sind.C - 154
Eingabe von stdin. Ich habe versucht, eine zusätzliche Funktion zu umgehen, konnte mir aber keine einfallen lassen.
Die Zeichenanzahl enthält nur die erforderlichen Leerzeichen.
quelle
PHP, 194 Zeichen
Das
n
als erstes Argument in der Kommandozeile erhaltene.Lesbar
quelle
■
anstelle von verwenden#
, können Sie 2 Zeichen sparen, indem Sie die Anführungszeichen entfernen.Scala 230 Zeichen
Golf Code:
Ungolfed-Code:
Es sind nur die erforderlichen Leerzeichen enthalten.
quelle
V , 21 Bytes (nicht konkurrierend)
Probieren Sie es online!
Hexdump:
V ist neuer als die Herausforderung, daher muss es als nicht konkurrierend markiert werden. Trotzdem ist es schön zu sehen, dass diese Antwort kürzer ist als alle anderen, selbst wenn in Bytes anstatt in Zeichen gezählt wird.
quelle
ok, 40 bytes
Probieren Sie es online aus.
Es beginnt mit
1
und zeichnet es dann in ein Raster(1 1 1;1 0 1;1 1 1)
, das es dann auf die gleiche Weise in ein Raster zeichnet, usw., und wiederholt die erforderliche Anzahl von Malen.quelle
Python 2 , 91 Bytes
Probieren Sie es online!
quelle
C # (.NET Core) , 162 Byte
Probieren Sie es online!
Entgolft
quelle
SOGL V0.12 , 27 Bytes
Probieren Sie es hier aus!
quelle
R , 92 Zeichen
94 Bytes mit dem Sonderzeichen.
Probieren Sie es online!
quelle
Canvas ,
171617 ZeichenProbieren Sie es hier aus!
-1: Wird
[
verwendet{
, um den ersten;
innerhalb der Schleife zu löschen .+1: Behobenes fehlerhaftes Verhalten: Entspricht
■
jetzt Level 1, wie im ursprünglichen Beitrag angegeben.quelle
■
sie aus mehreren Bytes bestehen . Sagt so nach unten in den ursprünglichen Beitrag.Pip
-S
, 30 ZeichenProbieren Sie es online!
Die Grundidee: Betrachten Sie ein Koordinatengitter in der Basis 3. Die Löcher im Teppich treten auf, wenn 1) ein Trit in der x-Koordinate
1
und 2) der Trit in der gleichen Position in der y-Koordinate ist1
.Ähnliche Lösung, gleiche Anzahl von Zeichen, aber -2 Bytes:
{2N({aTB3R2i}MSg)?s'■}MC3**a/3
quelle
K (ngn / k) , 50 Bytes
danke @DLosc für die Erinnerung, ich sollte Leerzeichen zwischen den Spalten ausgeben
Probieren Sie es online!
quelle