死魚是一種深奧的「編程」語言(創建爲一個笑話,而不是完整的)。在這裏面,有一個單一的可變 - 在0初始化的整數 - 與4個操作:在Python中優化死魚常數計算器
Counter += 1
= ICounter += -1
= dCounter = Counter * Counter
= Sprint(counter)
= O
儘管死魚通常使變量成爲一個字節,但爲了我的目的,它將是一個Python中的整數。我的程序試圖找到打印出任何給定數字的最快方式,即最少的命令。下面是一些例子
要達到10,
0> 1> 2> 3> 9> 10 = IIISI
達到15,
0> 1> 2> 4> 16 > 15 = iissd
我寫了一個簡單的蠻力程序,通過檢查i,d和s的組合來解決這個問題。以下是代碼:
#!/usr/bin/python
# -*- coding: utf-8 -*-
def baseN(num, base, numerals='abcdefghijklmnopqrstuvwxyz'):
return num == 0 and numerals[0] or baseN(num // base, base,
numerals).lstrip(numerals[0]) + numerals[num % base]
def validCode(code):
for k in range(0, len(code)):
if code[k] == '!':
return False
return True
def deadFish(code):
counter = 0
for l in range(0, len(code)):
cmd = code[l]
if cmd == 'i':
counter += 1
if cmd == 'd':
counter += -1
if cmd == 's':
counter = counter * counter
return counter
def format(code):
counter = 0
chain = "0"
for m in range(0, len(code)):
cmd = code[m]
if cmd == 'i':
counter += 1
if cmd == 'd':
counter += -1
if cmd == 's':
counter = counter * counter
chain += " -> " + str(counter)
return(chain)
codeChars = '!ids'
i = 0
solutions = [0]
while True:
i += 1
codeInt = baseN(i, 4)
codeStr = ''
for j in range(0, len(str(codeInt))):
codeStr += codeChars[int(str(codeInt)[j])]
if validCode(codeStr) and deadFish(codeStr) < 1000 and deadFish(codeStr) > -1:
if deadFish(codeStr) > len(solutions) - 1:
solutions += [0] * (deadFish(codeStr) - len(solutions) + 1)
if solutions[deadFish(codeStr)] == 0:
solutions[deadFish(codeStr)] = codeStr
print(codeStr, ':', format(codeStr))
else:
print(codeStr)
此代碼按預期工作,應該不言自明。但是,這是非常非常低效的。任何改進或優化的建議將不勝感激。
可能最好把它作爲代碼審查,如果它運作,但只是緩慢。 –
我真的很想找一個解決這個問題的更好方法。我的代碼很慢的原因是因爲它是蠻力。小的優化可能會有所幫助,但他們不回答我的問題。 –