Python:创建变量和运算符的排列

时间:2013-06-24 09:52:08

标签: python permutation

这是一个非常简单的骰子游戏,具有以下规则:

  1. 选择1到100之间的数字
  2. 同时扮演三个骰子
  3. 使用滚动点和以下选项尽可能接近所选数字:

    • 加法,减法,乘法和/或
    • 将这些点乘以10
  4. 示例1:

    Dice1 = 2, Dice2 = 3, Dice3 = 1, Chosen number = 5
    
    Possible calculations:           
             2 + 3 * 1 = 5 or 
             2 * 3 - 1 = 5
    

    示例2:

    Dice1 = 6, Dice2 = 2, Dice3 = 2, Chosen number = 42
    
    Possible calculation:
             (6*10) - (2*10) + 2 = 42
    

    我的计划的目标是找到组合点和操作员的最佳方法。

    到目前为止我所拥有的:

    import sys
    import operator
    
    a = int (sys.argv[1])   # Dice 1
    b = int (sys.argv[2])   # Dice 2
    c = int (sys.argv[3])   # Dice 3
    d = int (sys.argv[4])   # Number to reach
    
    class Calc():
    
        def __init__(self):
            self.resultsdict = dict()
            self.werte = dict()
            permutations = [[a,b,c], [a,c,b], [b,a,c], [b,c,a], [c,a,b], [c,b,a]]
            for p in permutations:
                aa = int(p[0])
                bb = int(p[1])
                cc = int(p[2])
                self.compute(aa,bb,cc, d)
            self.getBest(d, a, b, c)
    
        def compute(self, a,b,c,d):
            func = [a+b+c, a+b-c, a+b*c, (a+b)*c, (a-b)+c, a-(b+c), a-b-c, a-b*c, (a-b)*c, a*b+c, a*(b+c), a*b-c, a*(b-c), a*b*c]
            func1 = ["a+b+c", "a+b-c", "a+b*c", "(a+b)*c", "(a-b)+c", "a-(b+c)", "a-b-c", "a-b*c", "(a-b)*c", "a*b+c", "a*(b+c)", "a*b-c", "a*(b-c)", "a*b*c"]
            i = 0
            while i < len(func):
                dictkey = str(a)+str(b)+str(c)+ ", " +str(func1[i])
                if  not func[i] < 0 :
                    self.resultsdict[dictkey] = abs(d-func[i])
                    self.werte[dictkey] = func[i]
                i += 1
    
        def getBest(self, d, d1, d2, d3):
            self.bestresults = dict()
            keys = self.resultsdict.keys()
            minval = 1000000000
            for k in keys:
                if int(self.resultsdict[k]) <= int(minval):
                    minval = int(self.resultsdict[k])
            print("THE BEST COMBINATION FOR REACHING " + str(d) + " WITH " + str(d1) + ", " + str(d2) + ", " + str(d3) + " HAS BEEN GAINED WITH REST: " + str(minval)) 
            for k in keys:
                if int(self.resultsdict[k]) == int(minval):
                    ergebnis = self.werte[k]
                    print('\t' + "Combination: " + str(k) + ", Result: " + str(ergebnis))   
    t = Calc()
    

    在func中,我硬编码了部分可能的组合。

    现在我正在寻找一种自动生成这些组合的算法,因此我不必手动将它们全部写下来。

    你会怎么做?

1 个答案:

答案 0 :(得分:0)

您可以使用

python&#34; itertools&#34; http://docs.python.org/2/library/itertools.html

生成['+','-','*','a','b','c',10]

的所有组合

这样您就可以获得所有可能的组合,然后只过滤掉有效的表达式。 但它不会产生副作用。

您可以加入['(',')'] 但这需要更多时间。