ここにあるPythonでRuby Quizの問題60を解こうとしていました: http://rubyquiz.com/quiz60.html
基本的に、ある数値から別の数値への最短経路を見つけるには、数値を 2 倍にする、半分にする、または 2 を足すだけです。
この問題を実際に解決するプログラムを作成することは、それほど難しくありませんでした。
def maze_solver(a, b):
paths = [[a]]
final = []
for ind, path in enumerate(paths):
if path[-1] == b:
return path
last = path[-1]
paths.append(path + [last * 2])
paths.append(path + [last + 2])
if last % 2 == 0:
paths.append(path + [last / 2])
print maze_solver(979, 2)
>>> maze_solver(9, 2)
[9, 18, 20, 10, 12, 6, 8, 4, 2]
>>> maze_solver(2, 9)
[2, 4, 8, 16, 18, 9]
しかし、それを最適化しようとすると失敗しました。2 つのパスの終点が同じで、一方のパスが他方より短い場合、長い方のパスを削除できると考えました。
この最適化を試しました:
def maze_solver(a, b):
paths = [[a]]
final = []
for ind, path in enumerate(paths):
if path[-1] == b:
return path
for other in paths:
if ind != paths.index(other):
if path[-1] == other[-1] and len(other) >= len(path):
paths.remove(other)
last = path[-1]
paths.append(path + [last * 2])
paths.append(path + [last + 2])
if last % 2 == 0:
paths.append(path + [last / 2])
しかし、これでは正しい答えさえ得られません。
>>> maze_solver(9, 2)
[9, 11, 22, 24, 48, 24, 12, 6, 8, 4, 2]
このコードが機能しない理由がわからないので、誰かが私が間違っていることを説明してくれたら、とても助かります。ありがとう!