Il existe un résultat combinatoire classique selon lequel le nombre de façons de carreler une 2*n
bande par des 1*2
dominos est le nième nombre de Fibonacci. Votre objectif est d'imprimer tous les pavages pour une donnée n
, dessinés avec des tirets et des lignes verticales comme ces 8 pavages pour n=5
:
|————
|————
——|——
——|——
|||——
|||——
————|
————|
||——|
||——|
|——||
|——||
——|||
——|||
|||||
|||||
Vous devez fournir un programme ou une fonction nommée qui prend n
en entrée et imprime la sortie requise. Le moins d'octets gagne.
Contribution
Un nombre n
entre 1
et 10
inclus via STDIN ou entrée de fonction.
Production
Imprimez tous les carrelages domino possibles de la 2*n
bande, dessinés horizontalement. Les pavages peuvent être dans n'importe quel ordre, mais chacun doit apparaître exactement une fois. Ils doivent être séparés par une ligne vierge.
Un domino vertical est composé de deux barres verticales ( |
) et un domino horizontal est composé de deux tirets ( —
). Vous pouvez utiliser des tirets ( -
) à la place des tirets pour rester en ASCII.
Vous pouvez tout faire avec des espaces tant que la sortie imprimée est identique.
——
et|
par longueur comme celles de Dennis, pas desn
chaînes de longueur—
et|
filtrées en—
apparaissant par paires. Et pour ce dernier, je m'attendrais à ce que ce soit via des expressions rationnelles ou des opérations de chaîne sur la chaîne produite, commes.split('——
), et non par une approche arithmétique comme la vôtre.Réponses:
C, 106
Version golfée
Version originale
Comment ça fonctionne
La variable
i
va de1<<n-1
0 à 0, produisant tous les nombres binaires possibles avec desn
chiffres. 0 code pour|
et 1 code pour-
. Nous sommes intéressés par les nombres qui contiennent des paires de 1. De toute évidence, ces nombres sont divisibles par 3.Lorsqu'un nombre est divisé par 3, le nombre d'origine peut être récupéré en multipliant le résultat par 2 et en l'ajoutant à lui-même (en le multipliant par 3). La plupart des nombres nécessitent un report, mais lorsque le processus est effectué sur le nombre de l'intérêt, aucun report n'est requis, donc dans ces cas seulement, OU peut être utilisé à la place de l'addition. Ceci est utilisé pour tester les nombres d'intérêt, car ce sont les seuls où l'expression
i/3|i/3*2
renvoie la valeur d'origine dei
. Voir l'exemple ci-dessous.1111
= 15 --->0101
= 5 --->1111
= 15 (valide,0101|1010
==0101+1010
)1001
= 9 --->0011
= 3 --->0111
= 7 (invalide0011|0110
,! =0011+0110
)La valeur de test est toujours égale ou inférieure à la valeur d'origine. Comme les nombres qui ne sont pas des multiples de 3 renvoient également un nombre inférieur à l'original lorsqu'ils sont divisés par 3 puis multipliés par 3, le test donne également le FAUX souhaité sur ces nombres.
Dans la version originale, quelques boucles
j
sont utilisées pour parcourir les bitsi
et produire la sortie. Dans la version golfée, une seulefor
boucle est utilisée, dans laquelleh
passe tous les nombres de(n*2)*(1<<n)-1
0 à 0. Les valeurs dei
sont générées parh/2/n
. La variablej
n'est plus utilisée, car la quantité équivalente est obtenue à partir deh%n
. L'utilisation den*2
permet aux deux lignes d'être imprimées à partir de la même boucle, avec un multiplexage astucieux dans l'puts
instruction pour imprimer une ou deux nouvelles lignes à la fin de la ligne.Notez que la viande de ceci est dans la position d'incrémentation du
for()
support et est donc exécutée après lei=h/2/h
.Exemple de sortie n = 6:
la source
i/3|i/3*2
astuce est ingénieuse! Je ne m'attendais pas à une expression arithmétique pour la grammaire.CJam,
3327 octetsMerci à @ jimmy23013 pour avoir joué au golf sur 6 octets!
Essayez-le en ligne!
Contexte
Il s'agit d'une implémentation itérative d'un algorithme récursif:
Les pavages possibles pour n peuvent être obtenus en ajoutant un domino vertical aux pavages possibles pour n - 1 et deux dominos horizontaux aux pavages possibles pour n - 2 .
De cette façon, le nombre de pavages pour n est la somme des nombres de pavages pour n - 1 et n - 2 , c'est-à-dire le n ème nombre de Fibonacci.
Comment ça fonctionne
Exemple d'exécution
la source
LNli{_'|f\@"——"f\+2/}*\;{_N}/
.f\
n'avait pas encore été implémenté en 0.6.2, mais j'ai pu combiner nos approches. Merci!Haskell, 89 octets
f
est une fonction qui, étant donné un nombre, renvoie une liste d'une ligne de tous les pavages de Fibonacci possibles de longueur n possible. peu importe qu'il renvoie une ligne, car les deux lignes de tous les pavages sont identiques.f
fonctionne en appelant récursivement surn-1
etn-2
et en ajoutant"|"
et"--"
(respectivement) aux chaînes.g
est la fonction qui répond aux questions. il appelle essentiellementf
l'entrée, double chaque chaîne de sorte qu'il affiche deux lignes et les joint toutes par des retours à la ligne.exemple de sortie:
la source
CJam,
4237 octetsJ'ai compté les tirets comme un octet chacun puisque la question permet de les remplacer par des tirets ASCII.
Essayez-le en ligne.
Comment ça fonctionne
Pour obtenir tous les pavages possibles de 2 × L , nous itérons sur tous les entiers non négatifs I <3 L , en faisant correspondre les chiffres pairs de la base 3 aux dominos horizontaux et les chiffres impairs aux verticaux.
Étant donné que chaque I a L ou moins de chiffres dans la base 3, cela génère toutes les façons possibles de couvrir la bande 2 × L. Il ne reste plus qu'à filtrer les revêtements plus grands ou plus petits que 2 × L et imprimer les revêtements restants.
Exemple d'exécution
la source
3b
. Est-ce correct?JavaScript (E6) 102
Générez des configurations à partir de séquences de bits, 0 -> '-' et 1 -> '|'.
Test dans la console Firefox / Firebug
Production
la source
Haskell: 109 octets
Ceci est une traduction de la célèbre ligne unique de Haskell pour calculer paresseusement la séquence des nombres de Fibonacci:
La séquence principale des cordes de carrelage, non golfée:
Et le Fibonacci one-liner pour comparaison:
Exemple d'utilisation:
la source
Cobra - 176
J'ai hâte d'avoir terminé le forfait golf Cobra.
la source
J - 54 car
Prise de fonction
n
comme argument à droite.La racine principale de ce golf est le
(];'--'&,"1@[,'|',"1])&>/
. Cela prend une liste de pavages de longueur (N-2) et (N-1), et renvoie une liste de pavages de longueur (N-1) et N. Il s'agit de la récurrence standard de Fibonacci, à l'algèbre linéaire.];
renvoie la liste de droite comme nouvelle gauche (car il n'y a pas de changement).'--'&,"1@[
ajoute des--
tuiles à la liste de gauche, tandis que'|',"1]
ajoute des|
tuiles à la liste de droite, et celles-ci constituent la nouvelle liste de droite.Nous répétons cela maintes et maintes
n
fois (c'est le@[&0
) et commençons par le pavage vide et le pavage unique de longueur 1. Ensuite, nous retournons le premier de la paire avec0{::
. Cela signifie que si nous l'exécutons zéro fois, nous renvoyons simplement le premier, c'est-à-dire le pavage vide. Si nous l'exécutonsn
fois, nous calculons jusqu'à la pairen
et (n
+1), mais jetons cette dernière. C'est du travail supplémentaire mais moins de personnages.C'est
(1 2$,:)
quelque chose que J doit faire pour rendre les pavages dans les listes facilement extensibles. Nous faisons de la liste de départ gauche une liste à 1 élément d'une matrice de caractères à 2 lignes, chaque ligne ayant une longueur 0. La liste de départ droite est la même, mais les lignes ont une longueur 1, remplie de|
. Ensuite, nous ajoutons les nouvelles tuiles à chaque ligne et ajoutons les listes de matrices lorsque nous joignons les deux ensembles de mosaïques ensemble. Il s'agit d'une simple application d'un concept que J appelle rang: manipuler essentiellement la dimensionnalité de ses arguments et boucler implicitement lorsque cela est nécessaire.Essayez - le pour vous - même à tryj.tk .
la source
Python 3: 70 octets
Génère récursivement toutes les chaînes possibles
s
représentant une ligne de dominos, qui sont dupliquées et imprimées. En commençants
par le caractère de nouvelle ligne, la ligne vierge apparaît automatiquement.le
==
entre les deux appels àf
est juste pour effectuer les appels de fonction. Celles-ci reviennent généralementNone
parce qu'elles impriment simplement et==
sont l'un des rares opérateurs définis pourNone
.le
and
s etor
s doivent produire le bon comportement de court-circuit pour reproduire lesif
s etelse
s du code non golfé.Non golfé:
la source
Rétine , 44 octets
Remarque: la rétine est plus jeune que ce défi.
Prend entrée en unaire avec une nouvelle ligne de fin.
Chaque ligne doit aller dans son propre fichier et
#
doit être remplacée par un retour à la ligne dans le fichier. Ceci n'est pas pratique, mais vous pouvez exécuter le code tel quel comme un fichier avec l'-s
indicateur, en conservant les#
marqueurs (et en changeant la nouvelle ligne#
en entrée également).#
Si vous le souhaitez, vous pouvez remplacer le retour par des sauts de ligne dans la sortie pour plus de lisibilité. Par exemple:Méthode:
1
changement en|
et une avec les deux premiers1
en--
. Nous faisons cela jusqu'à ce que nous ayons des lignes avec au moins deux1
.1
, nous les avons remplacés par|
des.la source