如何在python中实现这个算法?

时间:2014-05-17 08:32:45

标签: python algorithm

这是某种类型的笛卡尔积,它是从初始固定长度的整数序列中生成的,使用由符号决定的规则生成其他序列,该符号规定了必须遵循的n个附加序列数。 / p> 例如

^产生额外的1个系列,*产生额外的3个系列)

1 0^ 1* 1

产生

1 0 2 1
1 0 3 1
1 0 4 1 (we stop here because we have produced 3 additional series)

1 1 1* 1 (we have produced an additional series from the `^` symbol. still have the `*`)

1 1 2 1
1 1 3 1 
1 1 4 1

另一个例子,现在有更大的长度系列和附加规则。

1 0^ 1* 0^ 1

产生

1 0 2 0 1
1 0 3 0 1
1 0 4 0 1

1 0^ 1* 1 1

1 0 2 1 1 
1 0 3 1 1 
1 0 4 1 1 

1 1 1* 1 1 

1 1 2 1 1 
1 1 3 1 1 
1 1 4 1 1 

我感到很无聊并且开始在纸上写下这样的一系列数字,并且很想知道是否已经有一个算法或实现产生了一系列整数序列。请注意,系列之间有新的行,可生成其他系列以便于理解。

1 个答案:

答案 0 :(得分:1)

一般情况下,您可以将itertools.product用于笛卡尔积。具体来说,我将在两个单独的步骤中实现您的算法:

  1. 将输入字符串(例如"1 0^ 1* 0^ 1")解析为整数列表列表;和
  2. 制作列表清单的产品。
  3. 一个相对简单的基于生成器的实现,为了清晰起见,它具有辅助函数,如下所示:

    def algorithm(input_):
        # Step 1
        instructions = []
        for s in input_.split():
            try:
                instructions.append([int(s)])
            except ValueError:
                instructions.append(list(values(s)))
        # Step 2
        for prod in itertools.product(*instructions):
            yield prod
    
    def values(s):
        RULES = {'*': 4, '^': 2}
        n = int(s[:-1])
        for x in range(RULES[s[-1]]):
            yield n + x
    

    例如:

    >>> print("\n".join(" ".join(map(str, t)) for t in algorithm("1 0^ 1* 1")))
    1 0 1 1
    1 0 2 1
    1 0 3 1
    1 0 4 1
    1 1 1 1
    1 1 2 1
    1 1 3 1
    1 1 4 1
    

    你必须修补它以获得准确的顺序(你似乎有一个操作符,而不是从左到右的优先顺序)和格式化(例如组之间的空格)你正在寻找。