introduction
Dans ce défi, une matrice 2 × 2 est indexée comme ceci:
0 1
2 3
Nous définissons une famille de modèles de type fractal F(L)
, où se L
trouve une n
liste de longueur de ces indices et F(L)
a une taille .2n-1 × 2n-1
- Si
L == []
, alorsF(L)
c'est le motif 1 × 1#
. Si
L != []
, alorsF(L)
est construit comme suit. SoitP
le motif obtenu à partir duL
premier élément supprimé. Prenez quatre grilles de taille remplies de points et remplacez la grille indexée par par le motif . Ensuite, collez les grilles ensemble en utilisant une couche de hachage entre elles. Voici des diagrammes pour les quatre cas: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] ...#... ...#... #... ...#
Exemple
Considérez l'entrée L = [2,0]
. Nous commençons par la grille 1 × 1 #
et traversons L
à droite. L'élément le plus à droite est 0
, nous prenons donc quatre copies de la grille 1 × 1 .
, remplaçons la première par #
et les collons avec des hachages. Il en résulte la grille 3 × 3
##.
###
.#.
L'élément suivant est 2
, nous prenons donc quatre copies de la grille 3 × 3 de .
s, et remplaçons le troisième par la grille ci-dessus. Les quatre grilles sont
... ... ##. ...
... ... ### ...
... ... .#. ...
et les coller ensemble avec #
les résultats s dans la grille 7 × 7
...#...
...#...
...#...
#######
##.#...
####...
.#.#...
Ceci est notre résultat final.
Contribution
Votre entrée est une liste L
des indices 0, 1, 2, 3
. Vous pouvez le prendre comme une liste d'entiers ou une chaîne de chiffres. Notez qu'il peut être vide et qu'il peut contenir des doublons. La longueur de L
est au plus 5.
Production
Votre sortie est le modèle F(L)
sous forme de chaîne délimitée par des sauts de ligne.
Règles et notation
Vous pouvez écrire un programme complet ou une fonction. le nombre d'octets le plus bas l'emporte et les failles standard sont interdites.
Cas de test
[]
#
[0]
##.
###
.#.
[3]
.#.
###
.##
[2,0]
...#...
...#...
...#...
#######
##.#...
####...
.#.#...
[1,1]
...#.##
...####
...#.#.
#######
...#...
...#...
...#...
[1,2,0]
.......#...#...
.......#...#...
.......#...#...
.......########
.......###.#...
.......#####...
.......#.#.#...
###############
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
[3,3,1]
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
.......#.......
###############
.......#...#...
.......#...#...
.......#...#...
.......########
.......#...#.##
.......#...####
.......#...#.#.
[0,1,2,3]
.......#...#...#...............
.......#...#...#...............
.......#...#...#...............
.......#########...............
.......#.#.#...#...............
.......#####...#...............
.......#.###...#...............
################...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
.......#.......#...............
###############################
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
...............#...............
[0,0,1,2,3]
.......#...#...#...............#...............................
.......#...#...#...............#...............................
.......#...#...#...............#...............................
.......#########...............#...............................
.......#.#.#...#...............#...............................
.......#####...#...............#...............................
.......#.###...#...............#...............................
################...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
.......#.......#...............#...............................
################################...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
...............#...............#...............................
###############################################################
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
...............................#...............................
#
?L !=[]
dans cet exemple, car il comporte 1 ou plusieurs éléments. Est-ce à dire que F (L) est toujours un#
au début?L = [2,0]
, vous coupez la tête et regardez le motifF([0])
, puis coupez la tête[0]
et regardez le motifF([])
, qui est la grille 1x1#
. Ensuite, vous utilisez l'index haché0
dessus pour construire le motif 3x3, et utilisez l'index haché2
sur celui-là pour construire le motif 7x7. Pour répondre à votre question: oui, vous commencez toujours par la grille 1x1 puisque c'est le cas de base de la récursivité.Réponses:
CJam,
5947434140 octetsMerci à Sp3000 pour avoir économisé 1 octet.
Testez-le ici.
Explication
Légèrement dépassé. Fixera plus tard.
Toutes les réorganisations dimensionnelles des listes 4D me donnent le vertige ...
Ce code implémente la spécification très littéralement, en utilisant l'algorithme itératif de la section par exemple au lieu de sa définition récursive .. L' un des principaux tour du golf est que j'utilise des espaces au lieu de
#
pendant le calcul et ne les remplacer par#
à la fin, ce qui simplifie le code en un seul endroit et me permet d'utiliser à laS
place'#
ou"#"
en plusieurs.la source
MATL ,
4241 octetsEssayez-le en ligne!
Explication
Cela fonctionne de manière itérative à l'aide d'un produit Kronecker pour étendre la matrice à chaque itération. Le tableau est construit avec
0
et1
au lieu de.
et#
, et à la fin, ils sont remplacés par les caractères appropriés.Il y aura autant d'itérations que la taille d'entrée. L'entrée est traitée de droite à gauche. L'index d'itération commence à
1
.En utilisant l'exemple du défi, avec entrée
[2,0]
, le tableau est initialisé commeCela correspond à l'initiale
1
(#
) prolongée par une ligne et une colonne, dont le but sera précisé plus tard. Les valeurs dans ces colonnes ne sont pas importantes, car elles seront écrasées; ils pourraient également être ceux:À chaque itération, le tableau existant est multiplié par Kronecker par un tableau 2 × 2 zéro-un qui contient
1
à la position indiquée par l'entrée actuelle de l'entrée et0
aux autres entrées. Dans l'exemple à l'itération i = 1, puisque l'entrée la plus à droite est0
, le tableau zéro-un estet le produit Kronecker de ces deux tableaux est
Ensuite, la ligne et la colonne avec index
2^i
sont remplies de celles-ci:Les trois premières lignes et colonnes constituent le résultat de la première itération. Comme précédemment, il existe une ligne et une colonne supplémentaires, qui sont utiles pour étendre le tableau à la prochaine itération.
À l'itération i = 2, puisque la valeur d'entrée actuelle contient
2
le tableau ci-dessus est multiplié par Kronecker parqui donne
Remplir la
2^i
-ème ligne et la colonne avec des unités donneComme il s'agit de la dernière itération, la ligne et la colonne supplémentaires sont supprimées:
et la substitution de caractères est effectuée pour produire le résultat final:
La description détaillée du code suit:
la source
Haskell,
123122 octetsExemple d'utilisation:
Comment ça fonctionne:
la source
JavaScript (ES6),
171152 octetsPrend le résultat de l'appel récursif, puis remplace chaque ligne par elle-même plus un hachage plus une chaîne de points de même longueur, dans l'ordre inverse si nécessaire, puis à partir de ce résultat partiel crée une chaîne de points à l'exception des sauts de ligne et de la colonne centrale de hachages, ainsi qu'une chaîne de hachages avec des sauts de ligne environnants, puis joint ces trois chaînes ensemble dans l'ordre approprié.
la source
Rubis,
143134 octetsUne fonction anonyme.
1 octet enregistré par un réarrangement de la première ligne. 6 octets enregistrés en changeant la façon dont z est incrémenté d'une formule à une table. 2 octets économisés en éliminant la variable
w
.Non testé dans le programme de test
la source
Rubis, 150 octets
Fonction anonyme. Utilise un appel récursif pour construire une liste de chaînes, une chaîne par ligne, puis les joint toutes ensemble à la fin.
la source
Python 3.5, 1151 octets:
Pas beaucoup de golf de code, mais bon. J'essaierai de l'élaguer plus au fil du temps où je peux.
Une façon assez naïve de le faire, mais, néanmoins, fonctionne actuellement parfaitement et, comme vous pouvez le voir, n'utilise aucun module / bibliothèque externe. En outre, il peut prendre manière plus de 5 articles dans la liste fournie
s
sans perdre la précision (qui est, si votre matériel peut manipuler). Il répond à toutes les exigences et je ne pourrais pas être plus satisfait de ce que j'ai obtenu. :)Il peut désormais non seulement accepter n'importe quel nombre dans la plage
0=>3
comme n'importe quelle valeur, mais n'importe quel nombre , point, grâce à l'&
opérateur au niveau du bit! Vous pouvez en savoir plus à leur sujet ici . Maintenant, par exemple,[4,4,1,2,3]
comme la liste d'entrée est la même que[0,0,1,2,3]
.Remarque: L' entrée doit être fournie sous forme de liste
Non golfé avec explication:
Explication plus large et beaucoup plus attrayante visuellement:
Pour une explication plus large et beaucoup plus attrayante visuellement, considérez la deuxième fois en passant par la boucle "principale" dans le code ci-dessus, dans laquelle se trouve la liste d'entrée
[0,2]
. Dans ce cas, les éléments de la liste "principale"l
seraient:et
et la liste
y
ne contiendrait que0
. Profitant de la façon dont Python indexe le dernier élément de la grillel[-1]
, nous pouvons étiqueter les éléments très à gauche de la grille comme suit:Quel modèle voyez-vous? Chaque index à l'extrême gauche de la grille est un multiple de 8, et puisque, en utilisant l'équation
2^(n-1)-1
donne la longueur de chaque segment de points dans la grille, nous pouvons faire((2^(n-1)-1)*2)+2
pour trouver la longueur du bord supérieur de la grille dans son ensemble (+2 pour inclure le milieu#
et\n
le fin). Nous pouvons utiliser cette équation, que nous appelleronsi
pour trouver les valeurs d'index de chaque élément sur le côté gauche d'une grille de n'importe quelle taille en créant une liste, et en ajoutant à la liste chaque entier, que nous appellerons_
, dans la plage0=>length of grid l[-1]
, de telle sorte que cet élément soit un multiple dei
, ET également tel qu'il_
N'EST PAS égali*(2^(n-1)-1)
, afin que nous puissions exclure le segment central de#
s séparant la moitié supérieure de la moitié inférieure. Mais nous voulons TOUS les éléments dot de la gauche, et pas seulement les éléments tout à gauche. Eh bien, il y a un correctif à cela, et ce serait d'ajouter simplement à la liste une liste contenanti+h
où h est chaque entier de la plage0=>2^(n-1)
chaque fois qu'une valeur de la plage0=>length of grid l[-1]
est ajoutée à la liste, de sorte qu'à chaque fois, il y aura autant de valeurs ajoutées à la liste que la longueur d'un quadrant de points. Et c'est la listea
.Mais maintenant, que diriez-vous des points sur la moitié droite? Eh bien, regardons l'indexation d'une manière différente:
Comme vous pouvez le voir, les valeurs maintenant au milieu sont celles dont nous avons besoin, car elles sont le début de l'index de chaque segment de points sur le côté droit de la grille. Maintenant, quel est le modèle ici? Eh bien, si ce n'est pas déjà assez évident, maintenant les valeurs moyennes sont toutes des multiples de
i/2
! Avec ces informations, nous pouvons maintenant créer une autre listeb
, à laquelle les multiples dei/2
sont ajoutés à partir de la plage0=>length of grid l[-1]
sorte que chaque entier de cette plage, que nous appellerons à nouveau_
, n'est PAS égal à(i/2)*(p*2)
pour exclure la ligne de#
s séparant le haut et moitiés inférieures, ET tel que _ ne soit PAS déjà dans la liste a, car nous n'avons pas vraiment besoin de 8,16,32, etc. dans la listeb
. Et maintenant, encore une fois, nous ne voulons pas seulement ces index spécifiques. Nous voulons TOUS les points sur le côté droit de la grille. Eh bien, tout comme nous l'avons fait dans la listea
, ici, nous pouvons également ajouter à la liste desb
listes_+h
où seh
trouve chaque entier de la plage0=>2^(n-1)
.Maintenant, nous avons les deux listes
a
etb
emballés et prêts à l'emploi. Comment pourrions-nous les réunir maintenant? C'est là listesW
,T
,G
etC
entrent en jeu . Ils détiendront les index pour chaque quadrant spécifique de points dans la grillel[-1]
. Par exemple, réservons la listeW
comme liste pour tous les index égaux au quadrant 1 (index 0) de la grille. Dans cette liste, nous ajouterions ensuite les premières2^(n-1)
listes de lista
, car lista
contient tous les index des points dans la moitié gauche de la grille, puis les diviser tous afin qu'ilsW
contiennent maintenant des(2^(n-1))*(2^(n-1))
éléments. Nous ferions de même pour la listeT
, mais avec la différenceT
contiendrait des éléments de la listeb
, carT
est réservé pour le quadrant 2 (index 1). La listeG
serait la même que la listeW
, sauf qu'elle contiendrait le reste des éléments de la listea
, et la listeC
est la même que la listeT
, sauf qu'elle contient maintenant le reste des éléments de la listeb
. Et c'est tout! Nous avons maintenant des valeurs d'index pour chaque quadrant contenant des points dans la grille, tous divisés en quatre listes correspondant à chaque quadrant. Nous pouvons maintenant utiliser ces 4 listes (W, T, G, C) pour indiquer au programme quels caractères il doit remplacer dans la grillel[-1]
par chaque caractère de la grillel[0]
, qui est le tout premier élément de la listel
. Puisque la valeur est0
ici, elle remplacerait tous les points du premier quadrant (index 0) par une grillel[0]
utilisant la listeW
.Par conséquent, nous avons enfin les éléments suivants:
Ouf! Un long processus, n'est-ce pas? Cependant, cela fonctionne parfaitement et, encore une fois, je ne pourrais pas être plus heureux. :)
la source