一系列彩球的排列,没有彼此相邻的2种颜色?

问题描述 投票:-3回答:4

输入是一个字符串(a,b,c,d,...)。在这个字符串中,a表示相同颜色的球,b表示另一种颜色的球等。因此(2,1,3)表示2个红球,1个蓝色球和3个黄色球。

输出1是可能的排列的数量,没有彼此相邻的2个相同颜色的球。

输出2是所有这些排列的列表。

例如:

输入:(2,1,3)

输出1:10排列

输出2:131323,132313,231313,312313,313123等

所以我的主要问题是:如何在Python程序中过滤2个或更多相同颜色的球彼此相邻的排列?

python permutation
4个回答
0
投票

绝对不是最干净的做事方式,而是使用这个问题的答案:

https://stackoverflow.com/a/36343769/9742036

关于如何检查列表中的相等邻居,这应该可以解决问题。

我们首先生成一个表示您的球组合的列表,查看它们的所有排列,然后过滤掉那些无效的排列。

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)

1
投票

以下代码将解决您的问题:

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

上面的代码在下面的逻辑中工作:

  1. 逐个迭代你的排列列表。上面的代码是该列表中的1个这样的元素
  2. number转换为array
  3. 减去连续的元素
  4. 如果阵列为零则存在一个组合,其中2个球具有相同的颜色

0
投票

这有点令人费解,并且可能有一个更有效的版本,但这应该可以解决问题:

output2=['12234','22341','1234','12344']

permut=[]
for num in b: #For every element in the list output2
    for n,i in enumerate(num): #For every index and number inside every element of the list
        if n>0: #This is only for the next line to work on the first iteration
            if num[n]==num[n-1]: #If a number is the same than the previous number
                permut.append(num) #append into a new list the whole permutation number
                break #Go to the next loop
            else:
                continue
        else:
            continue

0
投票

假设output2是排列字符串的数组,您可以通过丢弃具有(至少)两个连续颜色代码的排列来过滤数组:

import re
output2 = filter(lambda perm: not re.search(r"(\d)\1", perm), output2)

正则表达式解释:\d匹配任何数字。周围的括号标记“匹配组”。 \1解析为第一个匹配组。因此,在组合中,(\d)\1匹配任何两个连续相同的数字。

如果output2不是一个数组,而是一个以逗号分隔的列表作为字符串,你可以像这样拆分它,以获得一个数组:

output2 = output2.split(', ')
© www.soinside.com 2019 - 2024. All rights reserved.