这是我测试的代码:
def rule(n):
rules_numbers = {128: 'xxx', 64: 'xx.', 32: 'x.x', 16: 'x..',
8: '.xx', 4: '.x.', 2: '..x', 1: '...'}
rules = {'...': '.', '..x': '.', '.x.': '.', '.xx': '.', 'x..': '.', 'x.x': '.', 'xx.': '.', 'xxx': '.'}
while n != 0:
for r in rules_numbers:
if n - r >= 0:
rules[rules_numbers[r]] = 'x'
n -= r
break
return rules
def cellular_automaton(string, pattern, n):
if n == 0:
return string
rules = rule(pattern)
ng = ""
for j in range(len(string)):
nxt = j + 1
if j == len(string) - 1:
nxt = 0
ng += rules[string[j - 1] + string[j] + string[nxt]]
j += 1
return cellular_automaton(ng, pattern, n - 1)
以下是一些示例输入和代码正确时我们应该得到的输出:
print(cellular_automaton('.x.x.x.x.', 17, 2))
#>>> xxxxxxx..
print(cellular_automaton('.x.x.x.x.', 249, 3))
#>>> .x..x.x.x
print(cellular_automaton('...x....', 125, 1))
#>>> xx.xxxxx
print(cellular_automaton('...x....', 125, 2))
#>>> .xxx....
print(cellular_automaton('...x....', 125, 3))
#>>> .x.xxxxx
print(cellular_automaton('...x....', 125, 4))
#>>> xxxx...x
print(cellular_automaton('...x....', 125, 5))
#>>> ...xxx.x
print(cellular_automaton('...x....', 125, 6))
#>>> xx.x.xxx
print(cellular_automaton('...x....', 125, 7))
#>>> .xxxxx..
print(cellular_automaton('...x....', 125, 8))
#>>> .x...xxx
print(cellular_automaton('...x....', 125, 9))
#>>> xxxx.x.x
print(cellular_automaton('...x....', 125, 10))
#>>> ...xxxxx
以下是解释我试图解决的问题的视频:https://youtu.be/M_pkidxeGMY
当我使用Python3运行此代码时,我得到所有输出,当我使用Python2时,我得到不同的结果。 你能告诉我,代码的哪一部分有所不同?谢谢!
来自Python2的resluts:
..xxxxxxx
.x.xxxxxx
xxx..xxx
..x.x...
xx....xx
.x.xxx..
x....x.x
x.xxx...
....x.xx
.xxx...x
...x.xx.
xxx...x.
答案 0 :(得分:3)
您的rules()
函数产生不同的结果,因为它依赖于字典迭代顺序。字典没有排序,对密钥的迭代是implementation dependent。 Python 3.6切换实现,例如迭代顺序也改变了。
对于你的第一条规则,第17条,我得到以下结果:
Python 2.7:
>>> sorted(rule(17).items())
[('...', 'x'), ('..x', 'x'), ('.x.', '.'), ('.xx', '.'), ('x..', '.'), ('x.x', '.'), ('xx.', '.'), ('xxx', '.')]
Python 3.6:
>>> sorted(rule(17).items())
[('...', 'x'), ('..x', '.'), ('.x.', '.'), ('.xx', '.'), ('x..', 'x'), ('x.x', '.'), ('xx.', '.'), ('xxx', '.')]
请注意'..x'
如何映射到一个'.'
,另一个'x'
。
您必须更改规则功能才能生成固定订单。您可以对键进行排序,例如:
for r in sorted(rules_numbers):
现在所有Python版本都会产生相同的输出:
>>> sorted(rule(17).items())
[('...', 'x'), ('..x', '.'), ('.x.', '.'), ('.xx', '.'), ('x..', '.'), ('x.x', '.'), ('xx.', '.'), ('xxx', '.')]