这是一个非常简单的骰子游戏,具有以下规则:
使用滚动点和以下选项尽可能接近所选数字:
示例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中,我硬编码了部分可能的组合。
现在我正在寻找一种自动生成这些组合的算法,因此我不必手动将它们全部写下来。
你会怎么做?
答案 0 :(得分:0)
您可以使用
python&#34; itertools&#34; http://docs.python.org/2/library/itertools.html
生成['+','-','*','a','b','c',10]
这样您就可以获得所有可能的组合,然后只过滤掉有效的表达式。 但它不会产生副作用。
您可以加入['(',')']
但这需要更多时间。