Deadfish 是一种深奥的“编程”语言(作为一个笑话而创建的,不是图灵完备的)。其中,有一个变量——一个初始化为 0 的整数——有 4 个操作:
Counter += 1
= 我Counter += -1
= dCounter = Counter * Counter
= 小号print(counter)
= o
尽管 Deadfish 通常将变量设为一个字节,但出于我的目的,它在 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='0123456789abcdefghijklmnopqrstuvwxyz'):
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)
此代码按预期工作,并且应该是不言自明的。但是,它非常非常低效。任何改进或优化的建议将不胜感激。