Objectif
Le but de ce défi est de produire une fonction n
qui calcule le nombre de façons de partitionner la n X 1
grille en triangles où tous les sommets des triangles sont sur des points de grille.
Exemple
Par exemple, il existe 14 façons de partitionner la grille 2 x 1, donc f(2) = 14
via les partitions suivantes
où les partitions ont respectivement 2, 2, 2, 2, 4 et 2 orientations distinctes.
Notation
C'est le code-golf , donc le code le plus court l'emporte.
code-golf
geometry
combinatorics
grid
Peter Kagey
la source
la source
Réponses:
05AB1E , 13 octets
Réponse de Port of @Bubbler 's Jelly .
Très lent en raison des permutations intégrées.
Essayez-le en ligne ou vérifiez les quatre premières entrées .
Explication:
la source
Haskell ,
60 55 5452 octetsAprès un dessin et une programmation de nombreux exemples, il m'est venu à l'esprit que c'est la même chose que le problème des tours:
Fondamentalement, vous avez le haut et le bas de la grille1 × n . Vous devez maintenant remplir la ligne non horizontale. Chaque triangle doit avoir deux lignes non horizontales. Que l'un de ses côtés fasse partie du haut ou de la ligne du bas correspond à la direction et à la longueur dans lesquelles vous iriez dans le problème des tours. Il s'agit d' OEIS A051708 . Pour illustrer cette correspondance, considérez les exemples suivants. Ici, la ligne supérieure correspond aux mouvements vers le haut, tandis que la ligne inférieure correspond aux mouvements vers la droite.
Merci @PeterTaylor pour -6 octets et @PostLeftGarfHunter pour -2 octets!
Essayez-le en ligne!
la source
A051708(n+1)
. J'ai donc posté la première bonne réponse :-PHaskell , 42 octets
Essayez-le en ligne!
Une implémentation assez directe qui se répète sur 2 variables.
Voici comment nous pouvons obtenir cette solution. Commencez avec le code implémentant une formule récursive directe:
54 octets
Essayez-le en ligne!
En utilisant l'interprétation de déplacement de tour de flawr ,
a%b
c'est le nombre de chemins qui amènent la tour de(a,b)
à(0,0)
, en utilisant uniquement les mouvements pour diminuer une coordonnée. Le premier mouvement diminuea
ou diminueb
, en gardant l'autre le même, d'où la formule récursive.49 octets
Essayez-le en ligne!
Nous pouvons éviter la répétition en
map(a%)[0..b-1]++map(b%)[0..a-1]
notant que les deux moitiés sont identiquesa
etb
échangées. L'appel auxiliairea?b
compte les chemins où le premier mouvement diminuea
, etb?a
compte donc ceux où le premier mouvement diminueb
. Ce sont en général différents, et ils s'ajoutenta%b
.La sommation en
a?b
peut également être écrite comme une compréhension de listea?b=sum[a%i|i<-[0..b-1]]
.42 octets
Essayez-le en ligne!
Enfin, nous nous débarrassons
%
et écrivons simplement la récursivité en termes de?
en remplaçanta%i
para?i+i?a
dans l'appel récursif.Le nouveau cas de base fait que cela
?
donne des sorties le double de celles de la?
version 49 octets, car avec0?0=1
, nous aurions0%0=0?0+0?0=2
. Cela permet d'utiliser définirf n=n?n
sans réduire de moitié ce que nous aurions dû faire d'autre.la source
a%b
compte le nombre de partitions utilisant les nœuds0,1,...,a
sur la ligne supérieure et les hochements0,1,..,b
de tête sur la ligne inférieure. L'opérateura?b
compte le nombre de façons dont vous pouvez ajouter une nouvelle ligne à partir du nœud supérieura
si le nœud inférieurb
est déjà utilisé. (Vous pouvez vous connectera
à tous les noeuds[0,1,...,b-1]
, mais vous devez alors recurse pour chacun d'entre eux.)?
de 42 octets que je ne connais pas, et ce qui est particulièrement curieux, c'est qu'il n'est pas symétrique.map...
par une compréhension de liste, dans la deuxième étape, nous ajoutons simplement la définition de%
:a?b=sum$map(a%)[0..b-1], a%b=a?b+b?a
a?b=sum[a%i|i<-[0..b-1]], a%b=a?b+b?a
a?b=sum[a?i+i?a|i<-[0..b-1]]
CJam (24 octets)
Démo en ligne
Cela utilise l'approche de Bubbler consistant à additionner les permutations de
n
0 et den
1.Dissection
Approche alternative (28 octets)
Démo en ligne
Dissection
Les triangles ont tous un bord horizontal et deux bords qui relient les lignes horizontales. Étiquetez les bords non horizontaux par un tuple de leurs deux x-coords et triez lexicographiquement. Ensuite, le premier bord est
(0,0)
, le dernier bord est(n,n)
, et deux bords consécutifs diffèrent précisément dans l'une des deux positions. Cela en fait une récursivité simple, que j'ai implémentée en utilisant l'opérateur de récursion mémoriséj
:Remarque
Ce n'est pas la première fois que je veux
fj
être soutenu dans CJam. Ici, cela ramènerait le score à 24 octets également. Je devrais peut-être essayer d'écrire un patch ...la source
Gelée ,
1514 octetsEssayez-le en ligne!
-1 octet basé sur le commentaire de Peter Taylor.
Utilise l'illustration de flawr directement, au lieu de la formule résultante.
Comment ça fonctionne
Prenez tous les itinéraires possibles sur une grille carrée. Le nombre de façons de déplacer les unités L dans une direction comme une tour est
2**(L-1)
. Appliquez ceci à chaque itinéraire et additionnez le nombre de façons de parcourir chaque itinéraire.la source
Fusain ,
4431 octetsbarré 44 est toujours régulier 44
Essayez-le en ligne! Explication: Fonctionne en calculant le nombre de façons de partitionner un trapèze de longueurs de côtés opposés
m,n
en triangles qui reposent tous sur des décalages entiers. Il s'agit simplement d'un cas général du rectangle de taillen
dans la question. Le nombre de partitions est donné récursivement comme la somme des nombres de partitions pour tous les côtésm,0..n-1
etn,0..m-1
. Cela équivaut au problème généralisé des tours , OEIS A035002 . Le code calcule simplement le nombre de partitions fonctionnant0,0
jusqu'à l'n,n
utilisation des valeurs précédemment calculées au fur et à mesure.Faites une boucle sur les rangées
0..n
.Commencez avec une ligne vide.
Faites une boucle sur les colonnes de la ligne
0..n
.Prenez la ligne jusqu'à présent et les valeurs des lignes précédentes dans la colonne actuelle, et ajoutez la somme totale à la ligne actuelle. Cependant, s'il n'y a aucune valeur, remplacez-la
1
à la place de la somme.Ajoutez la ligne terminée à la liste des lignes jusqu'à présent.
Sortez la valeur finale calculée.
la source
JavaScript (ES6),
45 4442 octetsUtilise la formule récursive trouvée par Peter Taylor et flawr .
Essayez-le en ligne!
la source
Pari / GP , 43 octets
Selon OEIS , la fonction génératrice de cette séquence est
Essayez-le en ligne!
la source
Python 3 , 51 octets
Essayez-le en ligne!
Port de Flawr's Answer
la source