在随机位置插入括号?

Inserting parentheses at random place?

Whosebug 社区!我再次请求您的帮助...

我制作了一个随机方程生成器,可以生成如下字符串:

def strmaker():
    picker = random.randint(2, 5)
    if picker == 5:
        return "1" + random.choice(RandomSymbols) + "2" + random.choice(RandomSymbols) + "3" + random.choice(
            RandomSymbols) + "4" + random.choice(RandomSymbols) + "5"
    elif picker == 4:
        return "1" + random.choice(RandomSymbols) + "2" + random.choice(RandomSymbols) + "3" + random.choice(
            RandomSymbols) + "4"
    elif picker == 3:
        return "1" + random.choice(RandomSymbols) + "2" + random.choice(RandomSymbols) + "3"
    else: return "1" + random.choice(RandomSymbols) + "2"

典型的结果如下所示:

1-2*3-4

所以基本上我想做的是: 制作一些插入一组或多组括号的 code/function 在随机地点。

像这样!

(1-2)*3-4

或者这个!

(1-2)*(3-4)

或者...

(1-2*3)-4

我想你现在明白了。 最简单的方法是什么?

当然,最懒惰的方法是添加更多案例,其中每个案例对应于一种特定的开闭括号排列。例如,我们可以添加案例:

elif picker == 6:
  return "(1" + random.choice(RandomSymbols) + "2)"

但是,我认为我们可以做得更好,特别是考虑到这个程序强制每个数字只有一位长的约束(如果我们想概括为更多位数的代码,那就有点摆弄,但我认为不应该太糟糕)。这个约束的意思是,如果我们要插入一个左括号,我们需要在正好 3, 5, 7, ... 个字符之外插入一个右括号。具体来说,我们可以编写如下代码:

s = strmaker()
i = 0
while i < len(s) - 2:  # len(s) - 2 since we never want a starting paren on the last number
  if random.randint(0, 1): # 50% chance of opening paren, can be tuned
    s = s[:i] + "(" + s[i:]
    i += 2
    while i < len(s) - 2:
      i += 2
      if random.randint(0, 1): # 50% chance of closing paren, again can be tuned
        s = s[:i] + ")" + s[i:]
        break
    if i >= len(s) - 2: # safety closing paren
      s = s + ")"
  i += 2

这不是我写过的最简洁的代码,但应该清楚解决方案的工作原理(它只是以 50% 的几率向每个可能的位置添加括号,然后继续)。如果您有任何问题/希望我稍微清理一下,请告诉我