Je parcourais Stackoverflow et j'ai vu cette question sur le carrelage d'un rectangle MxN, et j'ai pensé que ce serait parfait pour le golf. Voici la tâche.
Compte tenu de la dimension M et N, écrivez un programme qui affiche le nombre de façons uniques dont un rectangle MxN (N est le nombre de lignes, pas de colonnes. Pas vraiment important) peut être mis en mosaïque compte tenu de ces contraintes.
- Toutes les tuiles sont 2x1 ou 3x1
- Toutes les tuiles restent dans leur rangée (c'est-à-dire qu'elles sont toutes horizontales)
- Entre toutes les deux rangées adjacentes, les tuiles ne doivent pas être alignées, sauf aux deux extrémités
- M et N sont garantis être au moins 1
Par exemple, un pavage valide d'une matrice 8x3 serait
2 3 3
| | |
v v v
_______________
|___|_____|_____|
|_____|_____|___|
|___|_____|_____|
Mais ce qui suit ne serait pas valide, car les lignes s'alignent
2 3 3
| | |
v v v
_______________
|___|_____|_____|
|_____|___|_____|
|_____|_____|___|
Cas de test:
8x3: 4
3x1: 1
1x1: 0
9x4: 10
Code golf, donc la réponse la plus courte l'emporte.
2x1
ou3x1
? La sortie est-elle également à4x1
zéro?|
pas contribuer à la longueur de la ligne, en utilisant une représentation comme celle-ci (où, s'il n'y a pas de pipe (|
), il y a un espace).Réponses:
Gelée , 20 octets
Essayez-le en ligne!
la source
JavaScript (ES6), 119110106
9691 octetsEssayez-le en ligne!
Commenté
la source
R ,
243231 octetsEssayez-le en ligne!
Version avec sauts de ligne:
Notez pas de récursivité, et gère des valeurs assez grandes de m et n (par exemple 24x20 -> 3.3e19)
Voici une réponse commentée qui fonctionne plus ou moins de la même manière que ci-dessus, mais j'ai désarchivé toutes les fonctions, donc elle est en fait lisible:
La méthode pour prendre une matrice et la multiplier à plusieurs reprises par elle-même provient d' une question sur stackoverflow . Cette approche fonctionne ici car elle calcule efficacement le nombre cumulé de branches à travers les différentes rangées possibles de briques.
Si les packages externes sont autorisés, je peux le réduire à 192:
la source
Gelée , 26 octets
Essayez-le en ligne!
En panne:
Générez une liste des murs possibles sous forme de sommes cumulées avec la fin supprimée:
Trouvez la table extérieure de tous les murs possibles les uns contre les autres qui n'ont aucune intersection:
Prenez cette matrice à la puissance de (N-1) et résumez le tout:
Utilise le premier bit de la réponse de @ EriktheOutgolfer pour générer la liste des murs possibles, puis utilise l'approche d'intersection matricielle et d'exponentiation matricielle de ma réponse R. En tant que tel, cela fonctionne bien même avec un grand N. C'est ma première réponse Jelly, et je soupçonne qu'il peut être joué au golf plus. J'aimerais également idéalement modifier la première section afin que les exigences de temps et de mémoire ne soient pas mises à l'échelle de façon exponentielle avec M.
la source
05AB1E , 42 octets
J'ai presque trop honte de poster ceci, et il peut certainement être joué par A LOT avec une approche différente, mais comme il a fallu un certain temps pour terminer, j'ai décidé de le publier de toute façon et de le jouer à partir d'ici. Le défi semble plus facile qu'il ne l'est, mais j'utilise certainement une mauvaise approche ici et j'ai le sentiment que 05AB1E pourrait faire environ 25 octets ..
Essayez-le en ligne. REMARQUE: non seulement il est long, mais il est également inefficace, car le
9x4
scénario de test s'exécute en environ 40 secondes sur TIO.Explication:
la source
Fusain , 89 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Fonctionne pour les rectangles de taille jusqu'à environ 12 sur TIO, mais pourrait être rendu environ trois fois plus rapide à un coût de 2 octets en utilisant le twiddling de bits au lieu de l'intersection de liste. Explication:
Saisissez la largeur.
Commencez avec une rangée sans briques.
Commencez sans lignes terminées.
Faites une boucle sur les rangées.
Faites une boucle sur les briques.
Ajoutez la largeur de brique à la largeur de ligne actuelle.
Si cela se traduit par la largeur d'entrée, ajoutez cette ligne à la liste des lignes terminées.
Sinon, si elle est toujours inférieure à la largeur d'entrée, ajoutez la nouvelle ligne à la liste des lignes, ce qui entraînera sa récupération par une itération ultérieure.
Faites une liste des murs d'une rangée.
Boucle sur un de moins que la hauteur.
Enregistrez la liste des murs.
Effacez la liste des murs.
Parcourez la liste des murs enregistrée.
Faites une boucle sur les lignes terminées.
Si la ligne peut être ajoutée à ce mur, ajoutez-la à la liste des murs.
Affiche la longueur de la liste finale des murs.
la source