【问题标题】:how to implement this algorithm in python? [closed]如何在python中实现这个算法? [关闭]
【发布时间】:2014-05-17 08:32:44
【问题描述】:

这是某种类型的笛卡尔积,它是从初始固定长度的整数系列产生的,使用由符号规定的规则生成附加系列,该符号规定必须遵循的附加系列数量 n

例如(^ 产生额外的 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 

我很无聊,开始在纸上写一整套这样的数字,我很想知道是否已经有一种算法或实现可以生成这样的整数序列。请注意,系列之间有一条新线,可生成更多系列以使其更易于理解。

【问题讨论】:

  • 它模糊地让我想起了一个常规语言规范,从它生成字符串,但带有你似乎发明的自定义符号。

标签: python algorithm


【解决方案1】:

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

  1. 将输入字符串(例如"1 0^ 1* 0^ 1")解析为整数列表;和
  2. 产生列表列表的产品。

一个相对简单的基于生成器的实现,为了清楚起见带有一个辅助函数,如下所示:

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

您必须对其进行修改以获得您正在寻找的精确顺序(您似乎有一个运算符,而不是从左到右的优先级)和格式(例如组之间的空格)。

【讨论】:

  • 是的,必不可少的1 0 1 1 等于list(1,0,1,1)itertools 似乎可以完成这项工作
猜你喜欢
  • 2014-05-01
  • 2010-10-27
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
相关资源
最近更新 更多