Disons que votre travail consiste à peindre des poteaux, et un client vous demande de peindre un poteau avec 4 sections rouges et 3 sections jaunes. Vous pouvez le faire assez facilement comme suit:
r y r y r y r
Avec juste des rayures jaunes et rouges. Supposons maintenant que votre client vous demande de peindre un poteau avec 2 sections rouges, 2 sections jaunes et 1 section verte . Il y a deux façons de peindre votre poteau
g y r y r
y g r y r
y r g y r
y r y g r
y r y r g
g r y r y
r g y r y
r y g r y
r y r g y
r y r y g
y r g r y
r y g y r
Plus précisément, c'est 12 façons de peindre le poteau. Cela fait exploser le plus de couleurs et de sections impliquées
Maintenant, si votre client dit qu'il veut 3 sections rouges et 1 section jaune, il n'y a aucun moyen de peindre un poteau comme ça. Parce que peu importe comment vous essayez d'organiser les sections, deux sections rouges se toucheront et lorsque deux sections rouges se toucheront, elles deviendront une seule section rouge.
Et c'est à peu près notre seule règle pour peindre les poteaux
Les sections adjacentes peuvent ne pas être de la même couleur
Tâche
Étant donné une liste de couleurs et de sections requises, affichez le nombre de façons possibles de peindre un poteau comme demandé. Vous pouvez représenter les couleurs de toute manière raisonnable (entiers, caractères, chaînes), mais vous ne recevrez jamais plus de 255 couleurs différentes à la fois. Si vous le souhaitez, vous pouvez même choisir de ne pas attribuer de noms aux couleurs et simplement prendre une liste des sections si cela est plus facile.
Cas de test
Celles-ci sont assez difficiles à calculer à la main, d'autant plus qu'elles grossissent. Si quelqu'un a un cas de test suggéré, je l'ajouterai.
[4,3] -> 1
[2,2,1] -> 12
[3,1] -> 0
[8,3,2] -> 0
[2,2,1,1]-> 84
la source
[1, 1, 1, 1, 2, 2, 2]
? Je suppose.Réponses:
Mathematica, 37
44486062octetsPrenez l'entrée comme une liste d'entiers
{1, 1, 1, 2, 2}
. Essayez-le sur Wolfram Sandbox .Méthode de correspondance de motifs, merci @Not a tree!
Split
divise une seule liste en sous-listes d'éléments consécutifs, par exemple{1, 1, 2, 3, 4, 4}
en{{1, 1}, {2}, {3}, {4, 4}}
{{_}..}
est, à savoir{{_}, {_}, {_}, ...}
. Le motif correspond à une liste de sous-listes unaires.Differences
méthode, 48 octets:Le code utilise
Differences
pour déterminer si les éléments adjacents sont identiques.Pas à pas:
Permutations@#
génère toutes les permutations de la liste d'entrée vers une liste N! * N.Differences/@
calcule la différence entre N éléments et donne une liste N! * (N-1).1##&@@@
calcule la multiplication de toutes les listes. Si une liste contient0
(deux éléments adjacents sont les mêmes), le résultat sera0
, sinon différent de zéro, en N! liste.Clip[]
agit commeSign[]
, transformer la liste de (-inf, inf) en [-1, 1]Tr@Abs
transforme tout-1
en1
et maintenant la liste de longueur N! contient seulement0
(invalide) et1
(valide). Nous résumons donc simplement la liste.la source
Permutations@#~Count~Except@{___,x_,x_,___}&
.Count[Split/@Permutations@#,{{_}..}]&
37 octets!Gelée , 7 octets
Essayez-le en ligne!
Prend l'entrée comme par exemple
[1,1,1,1,2,2,2]
pour[4,3]
. Le[8,3,2]
testcase prend trop de temps pour fonctionner sur TIO.Comment ça marche
la source
Œ!QIẠ€S
marche? Essayez-le en ligne!P
atome à tout atome pour sa simplicité.P€
au lieu deẠ€
fonctionnerait toujours.05AB1E , 7 octets
Essayez-le en ligne!
-1 merci à nmjcman101 pour une autre réponse.
la source
Mathematica, 50 octets
Essayez-le en mathématiques ou au bac à sable Wolfram !
Prend la saisie comme dans les cas de test - par exemple
{4,3}
signifie "4 bandes rouges, 3 bandes jaunes".Il s'agit d'une mise en œuvre naïve d'une formule que j'ai trouvée ici . "Naïve" signifie "Je n'ai aucune idée du fonctionnement des mathématiques, alors ne me demandez pas d'explication ..."
la source
Python 3.5 , 65 octets
Essayez-le en ligne!
la source
Ruby 2.4, 47 octets
L' entrée est une liste de caractères: Pour le cas de test
[4,3]
, l' entrée peut être%w[a a a a b b b]
,"1111222".chars
ou une autre méthode mise en forme de tableau qui est valable dans Ruby.Nécessite 2.4 pour
Enumerator#uniq
(les versions antérieures ne le proposaient que sur laArray
classe). En tant que tel, le lien TIO ajoute 5 octets pour convertir d'abord l'énumérateur de permutation en un tableauto_a
, car il n'a pas la fonction ci-dessus.Essayez-le en ligne!
la source
R, 72 octets
Crée la fonction
Prend entrée dans le formulaire
[1,1,1,1,2,2,2]
selon le commentaire d'Erik le Outgolfer. Utilisecombinat
lapermn
fonction pour créer une liste de toutes les permutations, puisunique
pour obtenir toutes les entrées distinctes.sapply
applique ensuite la fonction suivante à toutes les entrées:Qui évalue à
Notez que ce
x
n'est pas la même chose quex
dans l'entrée de la grande fonction. Utiliser un autre caractère dans cette fonction serait dupe depryr::f
croire que la grande fonction a besoin d'un autre argument.Quoi qu'il en soit, quand donné une permutation, cette fonction prend la différence entre le vecteur:
2 1 3 4 2 1 -> -1 2 1 -2 -1
.!
convertit desFALSE
zéros et des zéros enTRUE
, de sorte que le vecteur devientFALSE FALSE FALSE FALSE FALSE
. En sommant cela pour vérifier s'il y a desTRUE
s (TRUE
cela impliqueraitdiff=0
-> deux les mêmes nombres consécutifs). Nous pouvons à nouveau inverser ceci avec!
pour obtenir un booléen sur la présence ou non de valeurs consécutives dans la permutation.La somme de ces booléens nous donne le nombre total de permutations où ce n'est pas le cas.
Ne fonctionne pas pour le
[8,3,2]
testcase car il nécessite un vecteur de 46 Go pour stocker ces permutations.la source
Gelée , 11 octets
Essayez-le en ligne!
la source
Python 2 ,
14089 octetsLe format d'entrée est
'aaaabbb'
pour le cas de test[4,3]
.Essayez-le en ligne!
la source
Husk , 8 octets
Essayez-le en ligne! Prend l'entrée au format
"aaabb"
pour[3,2]
. Expire le plus long cas de test.Explication
Rien d'extraordinaire ici, juste compter les permutations uniques où tous les groupes d'éléments adjacents ont une longueur 1.
la source
Rubis,
8476 octetsUne fonction lambda récursive. Examine chaque couleur possible et dose une recherche d'arborescence récursive, en comptant le nombre de fois où elle utilise toutes les rayures.
Explication (pour l'ancienne version):
la source
x=p
comme condition initiale?p
agit comme un aliasnil
dans ce cas et doit satisfaire la vérification pour laquelle il est utilisé.MATL ,
118 octetsLe format d'entrée est
[1 1 1 1 2 2 2]
pour[4 3]
, etc.Manque de mémoire pour le dernier cas de test.
Essayez-le en ligne!
Explication
la source