Vue d'ensemble
Ecrivez un programme qui imprime des motifs fractals simples à partir d'un motif de bits codant pour la fractale, plus le facteur d'échelle par génération de la fractale et le nombre de générations.
Explication
Voici une représentation ASCII du tapis de Sierpinski :
Génération 0:
#
Génération 1:
# # #
# #
# # #
Génération 2:
# # # # # # # # #
# # # # # #
# # # # # # # # #
# # # # # #
# # # #
# # # # # #
# # # # # # # # #
# # # # # #
# # # # # # # # #
La génération n + 1 du tapis de Sierpinski ASCII est composée d’une grille 3x3 contenant 8 copies de la génération n, l’élément central de la grille faisant défaut.
Donc, comme il est défini en utilisant une grille 3x3 et qu'il est 3 fois plus grand en largeur et en hauteur à chaque génération, on peut dire qu'il a un facteur d'échelle de 3.
Nous pourrions définir un motif de bits pour le tapis de Sierpinski en numérotant les éléments de la grille 3x3 de 0 à 8, de haut en bas, de gauche à droite, et en définissant le bit correspondant d'un entier si la génération n + 1 contient un copie de la génération n à cette position de la grille:
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
Pour un facteur d'échelle de 2, le modèle de bits serait organisé comme suit:
0 1
2 3
etc.
Votre tâche consiste à écrire un programme qui accepte un modèle de bits sous cette forme, un facteur d’échelle (par exemple, 3 pour le tapis de Sierpinski) et un numéro de génération, puis génère une fractale ASCII.
Contribution
Votre programme doit accepter 3 nombres entiers dans l'ordre suivant: un modèle de bits, un facteur d'échelle (allant de 2 à 5 inclus) et un nombre de générations (allant de 0 à 5 inclus).
Vous n'avez pas besoin d'effectuer de validation d'entrée sur ces valeurs et c'est parfaitement correct si le programme fonctionne pour des valeurs supérieures aux plages spécifiées.
Les entrées peuvent être passées sous n’importe quelle forme (tuples, liste séparée par des virgules / espaces, etc.)
Sortie
Le programme doit afficher une fractale composée du #
caractère suivi d'un espace dans les positions où elle est définie, de doubles espaces où il ne l'est pas et d'un caractère de nouvelle ligne à la fin de chaque ligne, en les imprimant ou en renvoyant une chaîne. à partir d'une fonction.
Exemples
Contribution:
495,3,3
Sortie (génération de tapis Sierpinski 3):
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
Contribution:
7,2,5
Sortie ( triangle de Sierpinski ):
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # #
# # # #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # #
# # # #
# # # # # # # #
# # # #
# # # #
# #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # #
# # # #
# # # # # # # #
# # # #
# # # #
# #
# # # # # # # #
# # # #
# # # #
# #
# # # #
# #
# #
#
Contribution:
325,3,3
Sortie ( poussière de cantor ):
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
Contribution
186,3,3
Sortie ( fractale de Vicsek ):
#
# # #
#
# # #
# # # # # # # # #
# # #
#
# # #
#
# # #
# # # # # # # # #
# # #
# # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # #
# # #
# # # # # # # # #
# # #
#
# # #
#
# # #
# # # # # # # # #
# # #
#
# # #
#
Contribution:
279,3,3
Sortie (exemple d'une fractale asymétrique):
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # #
# # #
# # # # # # # # #
# # #
# # #
# # # # # # # # #
# # #
# # #
# # #
#
#
# # #
#
#
# # # # # # # # #
# # #
# # #
# # #
#
#
# # #
#
#
etc.
Remarques:
- C’est du code-golf donc la réponse la plus courte en octets gagne
- Votre programme peut être une fonction autonome ou une fonction appelée avec les 3 paramètres d’entrée et renvoyant (ou imprimant) une chaîne.
- La génération 0 est définie comme
#
(un#
suivi d'un espace) même pour un motif binaire de 0. - Une nouvelle ligne de fin sur la dernière ligne est facultative mais autorisée, de même que toute quantité d’espace blanc de fin sur chaque ligne.
"##"
à"# "
. Je vois que l'un des espaces de fin de ligne est inclus dans vos exemples, est-il nécessaire? . Selon la dernière règle, je suppose que c'est facultatif, mais le fait que vous ayez besoin d'un espace de fin pour la génération 0 m'étonne. Aussi, je pense que vous devriez indiquer le maximum d'espaces et de nouvelles lignes (vous l'avez au pluriel) autorisé. Comme exemple extrême, je pourrais toujours commencer avec un tableau de 5 ^ 6 = 15625 lignes de 2 * 5 ^ 6 espaces, puis substituer le#
s. Dans la plupart des cas, il s'agit d'une quantité énorme d'espaces non utilisés279,3,3
?Réponses:
APL (Dyalog Unicode) , SBCS sur 37 octets
Essayez-le en ligne!
la source
Common Lisp,
248242 octetsUngolfed
Explication
dotimes
) et calculons si chaque cellule doit être dessinée (approche semblable à un raycasting). Ceci est fait en regardant récursivement à l'intérieur de la fractale avec laf
fonction auxiliaire."# "
ou imprimée" "
. Bien entendu, nous imprimons également des nouvelles lignes à la fin de chaque ligne.Par exemple, le triangle de Sierpinsky est représenté par
S=7
etR=2
. A la génération 3, la taille du carré est 2 3 = 8. Pour chaque cellule (x, y) , il se produit ce qui suit:f
est appelé avec x , y , g lié à 3 et s lié à 4 (8/2)truncate
renvoie à la fois le quotient et le reste, qui sont liés respectivement à px et x (nous réutilisons le même symbole x , mais ce n'est pas un problème).f
manière récursive les nouvelles liaisons pour x et y . Celles-ci sont maintenant la position relative à l'intérieur de la fractale interne. Nous passons G-1 pour la génération et s / 2 pour représenter la demi-longueur de la fractale.Exemple
Le calcul de la 8e génération du tapis de Sierpinski à l’aide de
(fractal 495 3 8)
24,7 secondes et génère un fichier texte de 83 Mo en sortie. J'ai écrit une version légèrement modifiée qui produit une image. Pour les mêmes paramètres, le fichier GIF pèse 1,5 Mo (même temps de calcul):Vicsek (cliquez pour voir la taille originale):
la source
)
à la suite!Pyth, 38 octets
Essayez-le en ligne: Regular Input / Test Suite
L'explication suit plus tard.
la source
186 3 5
(interprète en ligne), mais à part cela, je suis vraiment impressionné par sa brièveté.Ruby, 154
Le score est pour la fonction seulement. Présenté ci-dessous dans le programme de test. Le seul jeu de golf que je revendique pour le moment est la suppression des commentaires et des retraits. Je jouerai au golf plus tard. En ce moment, je m'amuse avec le programme.
La fonction prend six arguments, mais lors de l'appel initial, seuls les trois premiers sont fournis conformément à la spécification. Cela provoque la définition des trois arguments restants sur les valeurs par défaut, et en particulier la chaîne dans
a
laquelle la sortie est stockée est créée et initialisée sur des lignes d'espaces terminées par des nouvelles lignes. La variable globale$w
est également créée et indique le nombre de symboles par ligne.Lorsque la fonction s’appelle de manière récursive, elle fournit les six arguments, y compris la chaîne
a
et les coordonnées x et y du coin supérieur gauche de la prochaine récursivité.Le reste du programme est assez simple, comme indiqué dans les commentaires.
Sortie
Voici un ensemble de fractales vaguement basé sur la forme des lettres du mot GOLF. Des lettres plus réalistes pourraient être obtenues avec des images bitmap plus grandes. Comme le montre le dernier exemple, les fractales les plus intéressantes sont découvertes par accident.
la source
CJam, 45
Mise en œuvre de ma première idée. Essayez-le en ligne
Fondamentalement, il commence avec une matrice 1 * 1 contenant 3 (la différence entre '#' et ''), puis multiplie de manière répétée chaque nombre dans la matrice avec le motif binaire (matrice 0/1), et combine les matrices résultantes en une seule matrice plus grande. À la fin, il ajoute un espace à chaque numéro et se joint aux espaces et aux lignes.
2ème idée, 49
Essayez-le en ligne
Cela génère toutes les coordonnées de la matrice de sortie sous forme de tableaux de <nombre de générations> de paires de nombres plus petits que le facteur d'échelle (toutes ces combinaisons), puis pour chaque paire de nombres, il obtient le bit correspondant du motif, et pour chaque tableau de coordonnées. il multiplie les bits et multiplie par 3. Le traitement final est le même.
Il y a probablement de la place pour plus de golf.
la source
C, 316 octets
Non-golfé:
la source
Scala
293299ungolfed:
exemples:
première coupe, peut probablement être joué un peu plus loin ...
la source
#
. En plus d'être requis par la spécification, cela améliore vraiment l'apparence de votre sortie.Matlab, 115 octets
Le
kron
produit Kronecker rend tout beaucoup plus facile:la source
de2bi
ne fonctionne que si vous avez la boîte à outils Communications Systems. Ça ne marche pas sans ça. Il en aurait besoindec2bin
.de2bi
ne pas la même chosedec2bin
.)C, 158 octets
la source
K5, 70 octets
C'est un début:
En action:
la source