Description du défi
Dominoes est un jeu joué avec des tuiles avec deux valeurs dessus - une à gauche, une à droite, par exemple [2|4]
ou [4|5]
. Deux tuiles peuvent être jointes si elles contiennent une valeur commune. Les deux tuiles ci-dessus peuvent être jointes comme ceci:
[2|4][4|5]
Nous appellerons une séquence de n
tuiles jointes une chaîne de longueur n. Bien sûr, les tuiles peuvent être tournées, donc les tuiles [1|2]
, [1|3]
et [5|3]
peuvent être réarrangées en une chaîne [2|1][1|3][3|5]
de longueur 3.
À partir d'une liste de paires d'entiers, déterminez la longueur de la chaîne la plus longue pouvant être formée à l'aide de ces tuiles. Si la liste est vide, la bonne réponse est 0
(notez que vous pouvez toujours former une chaîne de longueur à 1
partir d'une liste de tuiles non vide).
Exemple d'entrée / sortie
[(0, -1), (1, -1), (0, 3), (3, 0), (3, 1), (-2, -1), (0, -1), (2, -2), (-1, 2), (3, -3)] -> 10
([-1|0][0|-1][-1|2][2|-2][-2|-1][-1|1][1|3][3|0][0|3][3|-3])
[(17, -7), (4, -9), (12, -3), (-17, -17), (14, -10), (-6, 17), (-16, 5), (-3, -16), (-16, 19), (12, -8)] -> 4
([5|-16][-16|-3][-3|12][12|-8])
[(1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1)] -> 7
([1|1][1|1][1|1][1|1][1|1][1|1][1|1])
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9), (10, 11)] -> 1
(any chain of length 1)
[] -> 0
(no chain can be formed)
O(n!)
lancez votre comme vous le souhaitezI guess it's P
Réponses:
Brachylog , 23 octets
Essayez-le en ligne!
Explication
En d'autres termes, pour une entrée comme
[[1:2]:[1:3]:[5:3]]
, nous essayons de la réorganiser en une chaîne valide[[2:1]:[1:3]:[3:5]]
, puis d'aplatir / décapiter / détacher pour produire[1:1:3:3:5:_]
(où_
représente une inconnue). La combinaison de~c
et:{…l2}a
divise efficacement cela en groupes de 2 éléments, et nous nous assurons que tous les groupes sont égaux. Au fur et à mesure que nous aplatissons (doublons la longueur), supprimons un élément du début et en ajoutons un à la fin (pas de changement), et regroupés en paires (divisant par deux la longueur), cela aura la même longueur que la chaîne de dominos d'origine.L'instruction "behead" échouera s'il n'y a pas de dominos dans l'entrée (en fait, IIRC
:pa
échouera également;a
n'aime pas les listes vides), donc nous avons besoin d'un cas spécial pour 0. (Une grande raison pour laquelle nous avons l'asymétrie entreb
et~k
est si que nous n'avons pas besoin d'un cas spécial pour 1.)la source
Brachylog , 29 octets
Essayez-le en ligne!
Je suis sûr que c'est terriblement long, mais peu importe. C'est aussi terriblement lent.
Explication
La raison pour laquelle il trouvera le plus grand est parce qu'il
s - subset
génère des points de choix du plus grand au plus petit sous-ensemble.la source
Mathematica, 191 octets
Peut être joué un peu au golf, j'en suis sûr. Mais fondamentalement le même algorithme que dans la réponse Brachylog de Fatalize , avec un test légèrement différent à la fin.
la source
Differences/@Rest@Flatten@#~Partition~2
Differences/@Partition[Rest@Flatten@#,2]
Infix
Map
JavaScript (Firefox 30-57), 92 octets
l
est la dernière valeur, ouundefined
pour l'invocation initiale.l-n
est donc une valeur fausse si le domino peut être joué.d
est le domino considéré.n
est la fin du domino envisagé pour l'enchaînement au domino précédent. L'autre extrémité peut facilement être calculée commed[0]+d[1]-n
.0,
gère simplement le cas de base des dominos non jouables.la source
Haskell ,
180 134131 131117 octetsEssayez-le en ligne! La nouvelle approche s'est avérée à la fois plus courte et plus efficace. Au lieu de toutes les permutations possibles, seules toutes les chaînes valides sont construites.
Edit: La version 117 octets est encore beaucoup plus lente, mais toujours plus rapide que la force brute.
Ancienne méthode de force brute:
Il s'agit d'une implémentation par force brute qui essaie toutes les permutations possibles (le nombre de permutations possibles semble être donné par A000165 , la " double factorielle des nombres pairs "). L'essayer en ligne gère à peine les entrées jusqu'à la longueur 7 (ce qui est assez impressionnant car 7 correspond à 645120 permutations).
Usage:
la source
Python 2, 279 octets
Golfé:
Essayez-le en ligne!
Même chose avec quelques commentaires:
Je poste parce que je n'ai vu aucune réponse en python ... quelqu'un verra ma réponse et, dégoûté, sera forcé de publier quelque chose de beaucoup plus court et efficace.
la source
Clojure,
198183 octetsMise à jour: meilleure gestion du "maximum de séquence éventuellement vide"
Version précédente:
Convention d'appel et cas de test:
F
retourne les éléments de la listeC
sans l'élémenta
,M
retourne le maximum de chiffres d'entrée ou 1.L
est la fonction principale, lorsqu'elle est appelée avec un seul argument, elle génère toutes les pièces de départ possibles et trouve la longueur maximale pour chacune d'elles. Lorsqu'il est appelé avec deux arguments, lel
est le premier élément de la séquence auquel le morceau suivant doit correspondre etR
est le reste des morceaux.Générer des permutations et "choisir un élément et le diviser pour se reposer" était assez difficile à mettre en œuvre de manière succincte.
la source