L'entrée est une chaîne (A, B, C, D, ...). Dans cette chaîne, un moyen une balle de la même couleur, B signifie B boules d'une autre couleur, etc. SO (2, 1, 3) signifierait 2 boules rouges, 1 boule bleue et 3 boules jaunes. P>
La sortie 1 est le nombre de permutations possibles, sans avoir 2 billes de même couleur côte à côte. p>
La sortie 2 est une liste de toutes ces permutations. P>
Par exemple: p>
entrée: (2, 1, 3) p>
sortie 1: 10 permutations p>
sortie 2: 131323, 132313, 231313, 312313, 313123, c. p>
alors ma question principale est la suivante: comment filtrer les permutations dans lesquelles 2 ou plusieurs balles de même couleur sont côte à côte dans un programme code> python code>? p>
4 Réponses :
Le code ci-dessous résoudra votre problème:
import numpy as np num = 221333 ## Any random permutation lst = list(map(int, str(num))) req_array = np.diff(lst) if 0 in req_array: print ("Yes")
C'est un peu compliqué et il y a probablement une version plus efficace, mais cela devrait faire l'astuce:
définitivement pas la manière la plus rangée de faire des choses, mais en utilisant la réponse de cette question:
https: // Stackoverflow. com / a / a / 36343769/9742036 p>
sur la façon de vérifier les voisins égaux dans une liste, cela devrait faire le tour. P>
Nous générerons d'abord une liste représentant votre combinaison des balles, regardez toutes les permutations d'entre eux, puis filtrez ceux qui ne sont pas valides. P>
from itertools import permutations from operator import eq input = (2, 1, 3) # Produce a list to represent the objects to order. (2,1,3) -> [0, 0, 1, 2, 2, 2] list_of_items = [] current_item = 1 for value in input: for number in range(value): list_of_items.append(current_item) current_item += 1 count_of_valid_permutations = 0 set_of_valid_permutations = set() # Generate all permutations of our list for permutation in permutations(list_of_items): # Permutations treat each ball as unique, even if the same colour, so check we're not over counting. if permutation not in set_of_valid_permutations: # Use the eq operator and map it to the permutation to see if any neighbours are equal. hasEqualNeigbours = any(map(eq, permutation, permutation[1:])) # If not, then this is a valid permutation. if not hasEqualNeigbours: # Record the permutation as seen. set_of_valid_permutations.add(permutation) count_of_valid_permutations += 1 print(count_of_valid_permutations) print(set_of_valid_permutations)
supposant que sortie2 code> est une matrice de vos chaînes de permutation, vous pouvez filtrer la matrice en rejetant les permutations ayant (au moins) deux codes de couleur consécutifs:
output2 = output2.split(', ')
Hey Rosa, travaillez-vous avec un grand nombre de permutations? Je suppose que vous pourriez le faire en boucle dans la liste des nombres dans vos permutations, mais si vous travaillez avec 1Million + permutations, ce sera trop lent
@Juanc Le nombre de permutations ne sera pas un problème, je ne travaille pas avec des montants Enoureux. Je me lance la plupart du temps avec la façon dont je peux déterminer quelles permutations ont des boules de la même couleur côte à côte, afin que je puisse les filtrer.
J'auusse la sortie 2 est au format de la liste, non?
@Juanc oui, c'est
@ROSA: Ma réponse a-t-elle résolu votre problème?
Toutes les réponses m'a aidé à vous rendre à une solution! Merci beaucoup tout le monde.
@ROSA, voudriez-vous marquer la réponse la plus appropriée comme solution au problème alors?