6□4□5□2□1で0〜35を作る問題

6□4□5□2□1の□に+-×÷を入れて0〜35を作る問題をPythonで解いてみよう。まずは集合を使ってみる。

ex = ["6", "", "4", "", "5", "", "2", "", "1"]
op = ["+", "-", "*", "/"]

s = set()
for i in op:
    ex[1] = i
    for j in op:
        ex[3] = j
        for k in op:
            ex[5] = k
            for l in op:
                ex[7] = l
                e = "".join(ex)
                v = eval(e)
                if int(v) == v:
                    s.add(int(v))
s
{-35,
 -34,
 -33,
 ……中略……
 239,
 240,
 241}

集合でなく辞書にしてみよう。s = set()d = {} にして、最後の s.add(int(v))d[int(v)] = e にする。

sorted(d.items())
[(-35, '6-4*5*2-1'),
 (-34, '6-4*5*2/1'),
 (-33, '6-4*5*2+1'),
 ……中略……
 (0, '6/4-5/2+1'),
 (1, '6+4-5*2+1'),
 (2, '6+4-5-2-1'),
 (3, '6/4+5/2-1'),
 (4, '6/4+5/2/1'),
 (5, '6/4+5/2+1'),
 (6, '6-4+5-2+1'),
 (7, '6+4-5+2/1'),
 (8, '6-4+5+2-1'),
 (9, '6-4+5+2/1'),
 (10, '6-4+5+2+1'),
 (11, '6-4+5*2-1'),
 (12, '6-4+5*2/1'),
 (13, '6*4-5*2-1'),
 (14, '6/4*5*2-1'),
 (15, '6/4*5*2/1'),
 (16, '6/4*5*2+1'),
 (17, '6*4-5-2/1'),
 (18, '6*4-5-2+1'),
 (19, '6+4+5*2-1'),
 (20, '6*4-5+2-1'),
 (21, '6*4-5+2/1'),
 (22, '6*4-5+2+1'),
 (23, '6+4*5-2-1'),
 (24, '6+4*5-2/1'),
 (25, '6+4*5-2+1'),
 (26, '6*4+5-2-1'),
 (27, '6*4+5-2/1'),
 (28, '6*4+5-2+1'),
 (29, '6+4*5+2+1'),
 (30, '6*4+5+2-1'),
 (31, '6*4+5+2/1'),
 (32, '6*4+5+2+1'),
 (33, '6*4+5*2-1'),
 (34, '6*4+5*2/1'),
 (35, '6*4+5*2+1'),
 ……中略……
 (239, '6*4*5*2-1'),
 (240, '6*4*5*2/1'),
 (241, '6*4*5*2+1')]