问题描述
我不知道我应该如何表述这个问题,但我希望我能解释我想要达到的目标。
所以我得到了一组字符 [A,B,C]。
我想生成包含 [A,C] 的所有可能组合所需的长度为 N 的最少行数。
示例:当 N = 4 时,它会生成类似这样的 9 行长度 N(1 列 = 1 行)
AAABBBCCC
ABCCABBCA
BACACBCBA
ABCABCABC
例如第一行 [A,A,A] 包含以下组合(1 列 = 1 组合),注意组合如何环绕行。
A,B
A,A
A,A
B,A
如何允许组合在所有生成的行中出现超过 1 次,但应保持在最佳最小值。
我应该如何以编程方式解决这个问题?
解决方法
您在计算 base 3 吗?用数字 1,2,3 而不是 0,1,2。
如果您不知道如何以三为基数进行计数,那么现在就开始吧。 0,10,11,12,20,21,22,100
如果您想知道 N
位数的行数是多少,那么答案是 3^N
。
如果您想知道在排序列表中给定位置(第一个位置为零)的给定长度的给定行中的序列,您可以使用以下函数
def row(k,N):
d = []
assert(k < 3**N)
for _ in range(N):
k,r = divmod(k,3)
d.append(r+1)
return ''.join(str(di) for di in d[::-1])
易于验证的 row(1,3)='112'
是长度为 3 的行中的第二项。
一个不太容易验证的是,长度为 25 的第 10 亿项由 row(10**9-1,25)='1111113231311311132121111'
给出。
使用通用符号
如果你想返回一个任意对象的列表(不一定是三个),它只是改变了输出的映射方式。
def row(k,symbols,N):
d = []
B = len(symbols)
assert(k < B**N)
for _ in range(N):
k,B)
d.append(symbols[r])
return d[::-1];
使用它
print(row(1,['red','green','blue'],6))
print(row(100,6))
> ['red','red','green']
> ['red','blue','green']