1

ここにある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]

このコードが機能しない理由がわからないので、誰かが私が間違っていることを説明してくれたら、とても助かります。ありがとう!

4

1 に答える 1