Qui n'aime pas une bonne fractale? Le tapis Sierpinski est un exemple classique de fractale.
Pour terminer cette tâche, vous devrez générer un tapis de type et imprimer l'image résultante sur le stdout
(voir l'exemple ci-dessous pour le formatage) , représentant le niveau du tapis. Les étapes peuvent être trouvées sur cet article Wikipedia .
Cette valeur sera prise stdin
ou équivalente.
Par exemple, une entrée de 4 produirait un tapis de niveau 4:
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
Une entrée de 3 produirait un tapis de niveau 3:
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
Une entrée de 2 produirait un tapis de niveau 2:
■ ■ ■
■ ■
■ ■ ■
Et une entrée de 1 produirait un tapis de niveau 1 (juste un carré):
■
Notez les espaces entre les colonnes.
L'idée est d'utiliser le caractère ■ pour les blocs et l'espace pour les espaces
La ligne commence par le caractère ■.
Comme toujours, la plus petite solution gagne par le nombre de caractères (en raison de caractères non standard).
Alternativement, # peut être utilisé à la place du caractère ■ dans les langues qui ne prennent pas en charge Unicode.
Réponses:
CJam,
3837313028 caractèresEh bien, nous comptons par caractères, alors faisons un déballage Unicode:
Testez-le ici. Mettez simplement le niveau souhaité dans le champ de saisie.
Explication
Après la conversion de base, c'est
qui est la même que la suivante, juste avec le caractère Unicode écrit comme
9632c
:Ce code est basé sur l'observation suivante: si nous regardons les coordonnées (x, y) de chaque cellule, alors nous obtenons une cellule vide, chaque fois que x et y ont un
1
à la même position dans leur représentation en base-3. Si vous y pensez, le motif de répétition à petite échelle est le chiffre de base 3 significatif, puis le chiffre suivant le plus significatif régit la prochaine répétition à plus grande échelle et ainsi de suite.Le contenu du tableau résultant est imprimé automatiquement.
Merci à Dennis d'avoir rasé trois octets.
la source
#0<'■S
->#~S'■
enregistre 1 caractère.[1_]a#~
par3Yba&
.&
produit une valeur de vérité / fausse (ou même qu'elle existe). Cela pourrait valoir la peine d'être publié dans les astuces CJam pour la manière canonique de tester si un tableau contient un élément.Matlab
(113) (110) (99)(85)Vous pouvez l'essayer ici (vous devrez le remplacer
input('')
par l'entrée souhaitée.)Maintenant 99 grâce à feersum! Et maintenant à 85 grâce à RTL!
Golfé:
Non golfé:
Explication:
J'abuse le produit kronecker pour cette tâche. (Il s'agit d'un produit spécial défini pour deux matrices de taille arbitraire. Exemple:
ensuite
Voici donc un exemple pour n = 5 (dans l'ancienne méthode de comptage, c'est 4);
la source
d=zeros(size([c,c]))
vous devez utiliserd=[c c]*0
.d
peut être évité en abuserkron
une fois de plus:disp(char(kron(c,[1,0])*3+32));
,Haskell,
114108la source
Python - 100
la source
Perl 5: 68 caractères
n sur stdin.
Une représentation ternaire codée décimale de la liste de coordonnées est d'abord générée en
@,
(nom choisi donc il n'y a pas besoin d'espace entre@,
etfor
) en utilisant les chiffres 0, 1 et 3. L'ajout de coordonnées x et y dans le domaine décimal aura maintenant un 2 dans le résultat si et seulement s'il y en avait deux aux positions correspondantes.//
est utilisé pour propager la variable par défaut$_
de la boucle externe (for
) à la variable postmatch$'
lorsqu'elle est masquée par lamap
variable par défaut dans la boucle interne.la source
Java,
330283 caractèresParam est la taille que vous souhaitez. À moins qu'il n'y ait une optimisation pour l'algorithme, j'ai essayé de tout écraser.
Merci à @StretchManiac de supprimer la
i
méthode et de nettoyer les déclarations écrasées.Code lisible
la source
String[]a
, et si vous n'utilisezi
qu'une seule fois, alors vous feriez mieux de vous débarrasser de la méthode.""+s
dans votrep
méthode? C'est trois caractères supplémentaires pour absolument aucun but. Même si le types
était autre choseString
, ce serait encore complètement inutile.static void p(int s){System.out.print((char)s);}
et principal fait ilint s=35;
,s=32;
etp(10);
( au lieu dep("\n");
) et enregistrer quelques caractères.Integer.valueOf
ànew Byte
Raquette
230229225220Pas la meilleure heure de raquette pour jouer au golf.
Golfé:
Non golfé:
la source
C:
1231181111104caractèresBasé sur une idée similaire à ma solution Perl. Après avoir ajouté quelques espaces:
Utilise un système ternaire codant chaque chiffre avec 2 bits. Les valeurs illégales (deux en position paire-impaire) sont filtrées avec
x & (x>>1) & 0b01010101
. Les deux coordonnées sont stockées dans une seule valeur, donc la vérification de la couleur des pixels est jusqu'àx & (x >> 2 * n) & 0b01010101
.n
est stocké comme une puissance de 2 pour plus de commodité.modifier
Remplacé
define
par une constante simplem
.Modifier 2
0x5555555
mask peut être représenté avec(1LL<<32)/3
, mais nous n'avons besoin quen
de ces bits,n/3
c'est donc suffisant.Modifier 3
Ajustements mineurs. Un gain de 2 caractères reposant sur
n
l'exécution de scanf avant la valeur de chargement de pour l'exécution de--n
. L'ole ne peut que suivre#
, duh.la source
HTML / JavaScript, 205 caractères
Obfuscatweet , 205 caractères
HTML / JS, 298 caractères
En raison de la façon dont HTML joue avec les espaces, quelques caractères ont dû être dédiés au caractère nbsp. De plus, la police par défaut de la plupart des navigateurs n'est pas Courier, j'ai donc dû la définir également. Environ 20 caractères de style. Si cela nécessite une méthode de saisie directe, je peux l'ajouter, mais la modification de la saisie actuellement définit n sur une valeur différente.
Démo
HTML / JS lisible
la source
CJam,
38353231 caractèresEssayez-le en ligne.
Exemple d'exécution
Comment ça marche
convertit la chaîne Unicode de la base 60 000 (
6e4b
) à la base 128 (128b
), convertit en Caractère (:c
) et évalue la chaîne résultante (~
).Par conséquent, le code suivant est exécuté:
la source
Python 3 -
116113 caractèresEDIT: Eh bien, j'ai utilisé l'astuce que je n'aime pas trop moi-même et j'ai compressé le code de 3 octets. Je ne sais pas si c'est la meilleure façon possible, mais je vais y aller.
Il peut contenir des caractères non imprimables, voici donc une version imprimable de la chaîne.
Pas trop génial, mais au moins bat certaines langues.
Ce qu'il étend à:
Un peu dépourvu au cas où quelqu'un ne pourrait pas voir comment cela fonctionne
la source
Mathematica, 71 octets
contribution
sortie
la source
CJam, 76 caractères
Ceci est une traduction directe de la formule donnée ici
Essayez-le ici
la source
Bash + coreutils, 105 caractères unicode
Puisque nous comptons des caractères et non des octets:
Sous sa forme décodée:
Pure Bash, 143 octets
L'entrée provient des arguments de la ligne de commande:
Sortie:
la source
C #
Programme complet - 237:
LINQPad - 166 +
Math.Ceiling(Math.Log(a + 1) / Math.Log(10))
la source
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 octets / 227 caractères ) (■
= 3 octets, vous pouvez donc le remplacer par#
pour économiser 2 octets également). J'ai principalement placé tout à l'intérieur des boucles for pour qu'il n'y ait plus besoin de supports.C - 154
Entrée de stdin. J'ai essayé de trouver un bon moyen d'éviter une fonction supplémentaire, mais je n'en ai trouvé aucune.
Le nombre de caractères comprend uniquement les espaces nécessaires.
la source
PHP, 194 caractères
Le
n
reçu comme premier argument en ligne de commande.Lisible
la source
■
place de#
, vous pouvez enregistrer 2 caractères en supprimant les guillemets.Scala 230 caractères
Code golf:
Code non golfé:
Seuls les espaces nécessaires sont inclus.
la source
V , 21 octets (non concurrent)
Essayez-le en ligne!
Hexdump:
V est plus récent que le défi, il doit donc être marqué comme non concurrent. Mais quand même , c'est agréable de voir cette réponse être waaaaay plus courte que toutes les autres, même en comptant en octets plutôt qu'en caractères.
la source
OK, 40 octets
Essayez-le en ligne.
Il commence par
1
, puis le dessine dans une grille(1 1 1;1 0 1;1 1 1)
, qu'il dessine ensuite dans une grille de la même manière, etc. répété le nombre de fois nécessaire.la source
Python 2 , 91 octets
Essayez-le en ligne!
la source
C # (.NET Core) , 162 octets
Essayez-le en ligne!
Dégolfé
la source
SOGL V0.12 , 27 octets
Essayez-le ici!
la source
R , 92 caractères
94 octets avec le caractère spécial.
Essayez-le en ligne!
la source
Toile ,
171617 caractèresEssayez-le ici!
-1: utilisé
[
au lieu de{
pour supprimer le premier;
à l'intérieur de la boucle.+1: Correction du comportement erroné:
■
correspond désormais au niveau 1, comme spécifié dans le message d'origine.la source
■
est multi-octets. Dit ainsi vers le bas dans le message d'origine.Pip
-S
, 30 caractèresEssayez-le en ligne!
L'idée de base: considérons une grille de coordonnées dans la base 3. Les trous dans le tapis se produisent où 1) un trit dans la coordonnée x est
1
, et 2) le trit dans la même position dans la coordonnée y est également1
.Solution similaire, même nombre de caractères mais -2 octets:
{2N({aTB3R2i}MSg)?s'■}MC3**a/3
la source
K (ngn / k) , 50 octets
merci @DLosc de me rappeler que je devrais sortir des espaces entre les colonnes
Essayez-le en ligne!
la source