Je jouais avec des réseaux de résistances infinies (longue histoire) quand je suis tombé sur le motif récursif intéressant suivant:
|-||
|---
Chaque instance de ce modèle est deux fois plus large que haute. Pour passer d'un niveau du motif au suivant, vous divisez ce rectangle en deux sous-blocs (chacun étant un carré NxN):
AB =
|-||
|---
so A =
|-
|-
and B =
||
--
Ces moitiés sont ensuite dupliquées et réorganisées selon le modèle suivant:
ABAA
ABBB
giving
|-|||-|-
|---|-|-
|-||||||
|-------
Défi
Écrivez un programme / fonction qui, étant donné un nombre N
, produit la N
ième itération de cette conception récursive. C'est le golf.
Le format d'E / S est relativement indulgent: vous pouvez renvoyer une seule chaîne, une liste de chaînes, un tableau 2D de caractères, etc. Un espace de fin arbitraire est autorisé. Vous pouvez également utiliser l'indexation 0 ou 1.
Exemples
Les premières itérations du modèle sont les suivantes:
N = 0
|-
N = 1
|-||
|---
N = 2
|-|||-|-
|---|-|-
|-||||||
|-------
N = 3
|-|||-|-|-|||-||
|---|-|-|---|---
|-|||||||-|||-||
|-------|---|---
|-|||-|-|-|-|-|-
|---|-|-|-|-|-|-
|-||||||||||||||
|---------------
N = 4
|-|||-|-|-|||-|||-|||-|-|-|||-|-
|---|-|-|---|---|---|-|-|---|-|-
|-|||||||-|||-|||-|||||||-||||||
|-------|---|---|-------|-------
|-|||-|-|-|-|-|-|-|||-|-|-|||-|-
|---|-|-|-|-|-|-|---|-|-|---|-|-
|-|||||||||||||||-|||||||-||||||
|---------------|-------|-------
|-|||-|-|-|||-|||-|||-|||-|||-||
|---|-|-|---|---|---|---|---|---
|-|||||||-|||-|||-|||-|||-|||-||
|-------|---|---|---|---|---|---
|-|||-|-|-|-|-|-|-|-|-|-|-|-|-|-
|---|-|-|-|-|-|-|-|-|-|-|-|-|-|-
|-||||||||||||||||||||||||||||||
|-------------------------------
Je me demande s'il existe une méthode algébrique courte pour calculer cette structure.
f(n,x,y)
qui peut calculer directement si une coordonnée donnée doit contenir-
ou|
. Il peut s'agir d'opérations modulo ou d'opérations au niveau du bit. Les techniques que j'ai vues jusqu'à présent impliquent toutes de couper / joindre des tableaux comme indiqué dans la spécification.f(x,y)
fonctionne également, car six,y
est valide, le résultat ne dépend pas den
|-
?Réponses:
APL (Dyalog Classic) ,
2925 octetsEssayez-le en ligne!
⍳2
est le vecteur0 1
⍪
le transforme en matrice 2x1⍉
le transpose, il devient donc 1x2⎕
entrée évaluée{
}⍣⎕
appliquer une fonction plusieurs fois⍪⍨⍵
concaténer l'argument au-dessus de lui-même - une matrice 2x2a←
rappelez-vousa
~
nier⍉
transposer⌽
inverser horizontalement⊖
inverser verticalementa,
concaténer aveca
à gauche'|-'[
]
utiliser la matrice comme indices dans la chaîne'|-'
, c'est-à-dire transformer 0 en|
et 1 en-
la source
JavaScript (Node.js) ,
130...1069492 octetsGolfé à partir de ma méthode alternative et fixant les caractères, -14 octets Merci @Shaggy
Essayez-le en ligne!
Mon approche originale (
106102 octets)-4 octets Merci @ShaggyEssayez-le en ligne!
Explication & Ungolfed:
Ma méthode alternative d'origine, si elle
"|"->"2", "-"->"1"
est autorisée,105104 octets:Essayez-le en ligne!
Je viens de découvrir une méthode algébrique pour résoudre ce problème.
Essayez-le en ligne!
(enfin une fonction dont la longueur est comparable à ma réponse d'origine)
f(n, x, y)
calcule le type de bloc au bloc (x, y) à l'n
itération de la substitution suivante:d'où
0 = "|-", 1 = "||", 2 = "--"
, à partir def(0, 0, 0) = 0
.Ensuite,
g(x)(y)
calcule le symbole en (x, y) du motif d'origine.la source
Stax ,
241715 octetsExécuter et déboguer
Voici la représentation ascii du même programme.
L'idée de base est de commencer par la grille de génération 0, puis de répéter un bloc qui étend la grille.
la source
Toile ,
1716 octetsEssayez-le ici!
Explication, montrant la pile pour l'entrée de 1:
Mis à jour à 16 octets en corrigeant un bogue où les valeurs définies pour
α
/ω
pour travailler n'étaient pas copiées correctement (Canvas est censé être entièrement immuable, mais, hélas, ce n'était pas le cas).la source
Python 2 ,
8877 octets-11 octets merci à Lynn
Essayez-le en ligne!
la source
f=lambda x:x<1and['|-']or[n+2*n[i:i+2**x/2]for i in(0,2**x/2)for n in f(x-1)]
Perl 5 , 72 octets
Essayez-le en ligne!
la source
66
:$.=map{s/.{$.}$/$&$
$/,push@1,$
. $ & X3} @ 1pour (@ 1 = "| -") x <>; dire pour @ 1`Husk , 17 octets
1 indexé. Essayez-le en ligne!
Explication
la source
Gelée ,
2119 octetsEssayez-le en ligne!
Explication:
Initialement, la valeur est
⁾|-
, c'est-à-dire["|","-"]
.Le dernier lien (
Ç
), donné[A, B]
, renverra. Ils
¡
appliquent le dernier lien (entrée) à plusieurs reprises et leZY
formate.Explication du dernier lien:
la source
Nettoyer ,
121106 octetsEssayez-le en ligne!
la source
Haskell , 86 octets
Essayez-le en ligne!
Assez simple. La sortie est une liste de chaînes. Nous prenons la version précédente et divisons chaque ligne en deux, puis les collectons en deux nouvelles listes à l'aide
unzip
. Ensuite, il s'agit simplement de combiner les tableaux de la bonne façonla source
J , 49 octets
Une traduction maladroite de la solution APL de ngn. J'ai eu du mal à le faire tacite - je vous remercie de tout conseil.
Essayez-le en ligne!
la source
Fusain ,
4746 octetsEssayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Afin d'obtenir une position de curseur cohérente pour la boucle suivante, je dois imprimer l'étape 0 à la position (-2, -2) et laisser le curseur à (-2, 0). (Cela peut être dû à un bug dans Charcoal.)
Boucle sur les premiers
N
pouvoirs de 2.Faites des copies de la sortie précédente avec divers décalages, ce qui donne un canevas contenant l'étape suivante souhaitée dans un rectangle.
Déplacez-vous à la position de ce rectangle et découpez la toile.
Solution alternative, également 46 octets:
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Ce pas de temps 0 doit être imprimé à la position (2, 0), mais au moins la position du curseur n'a pas d'importance.
Boucle sur les premiers
N
pouvoirs de 2.Faites des copies de la sortie précédente avec divers décalages, ce qui donne un canevas contenant l'étape suivante souhaitée dans un rectangle.
Déplacez-vous à la position de ce rectangle et découpez la toile.
la source
R , 126 octets
Essayez-le en ligne!
Renvoie a
matrix
. Il y a un peu de code dans le lien TIO pour qu'il s'imprime bien pour faciliter la vérification.la source
K (ngn / k) , 25 octets
Essayez-le en ligne!
la source
Wolfram Language (Mathematica) ,
6765 octetsEssayez-le en ligne!
Implémentation simple de la récursivité. Renvoie un tableau de caractères enveloppé dans une liste.
la source