-3
votes

Permutations d'une série de balles colorées, sans 2 de la même couleur côte à côte?

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.

La sortie 1 est le nombre de permutations possibles, sans avoir 2 billes de même couleur côte à côte.

La sortie 2 est une liste de toutes ces permutations.

Par exemple:

entrée: (2, 1, 3)

sortie 1: 10 permutations

sortie 2: 131323, 132313, 231313, 312313, 313123, c.

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 python ?


7 commentaires

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?


4 Réponses :


1
votes

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")


0 commentaires

0
votes

C'est un peu compliqué et il y a probablement une version plus efficace, mais cela devrait faire l'astuce: xxx


0 commentaires

0
votes

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)


0 commentaires

0
votes

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(', ')


0 commentaires