毎朝Codewars@2019.06.21(金): Maze Runner

毎朝ちびちびCodewars。

[6 kyu] Maze Runner www.codewars.com

今日のお題:

"""指示に従って2D迷路を進み、脱出できるか否かの結果を返す

def maze_runner(maze, directions):
Args:  
    maze (list): N x N の2D迷路を成す。
            例:
            maze = [[1,1,1,1,1,1,1],
                    [1,0,0,0,0,0,3],
                    [1,0,1,0,1,0,1],
                    [0,0,1,0,0,0,1],
                    [1,0,1,0,1,0,1],
                    [1,0,0,0,0,0,1],
                    [1,2,1,0,1,0,1]]
           値の意味は
                0 = Safe place to walk
                1 = Wall
                2 = Start Point
                3 = Finish Point

    directions (list): 次ステップの行き先(方向 N/S/W/E/)の指示 
        direction = ["N","N","N","N","N","E","E","E","E","E"]

Returns:  
    ・壁にあたるか、枠外に出たら 'Dead'
 ・directionが尽きたら 'Lost'
    ・無事に出口に着いたら 'Finish' を返す
"""

コード

最終

def maze_runner(maze, directions):
    # 初期位置 maze[y][x] を求める
    for y, m in enumerate(maze):
        if 2 in m:
            x = m.index(2)
            break

    # 座標の上限を求める
    max_pos = len(maze) - 1

    # 迷路を行く
    for d in direction:
        # step
        if   d == 'S': y += 1
        elif d == 'N': y -= 1
        elif d == 'E': x += 1
        elif d == 'W': x -= 1

        if x < 0 or x > max_pos or y < 0 or y > max_pos or maze[y][x] == 1:
        # 移動後の, x, y が 0以下かlen(maze(軸))以上になったら 'Dead'
            return 'Dead'
        elif maze[y][x] == 3:
            # 移動後の maze[y][x]が '3'なら 'Finish'
            return 'Finish'
    # directionが尽きたら'Lost'
    return 'Lost'

初版(多重ループを抜ける方法)

   # 初期位置を決める
    for _y, raw in enumerate(maze):
        if 2 in raw:
            y = _y
            for _x, r in enumerate(raw):
                if r == 2:
                    x = _x
                    break
            else:
                # 内側のforをbreakなしに抜けたらelseが実行されてcontinue
                continue
        else:
            continue
        break
    else:
        # 外側のforをbreak なしに抜けた
        return 'Start point do not exist.'

文法、関数・メソッドnote

list.index(x[, start[, end]])

5. データ構造 — Python 3.7.4rc1 ドキュメント

  • x と等しい値を持つ最初の要素のインデックスを返す
  • 該当する要素がなければ ValueError
  • start, endで範囲を指定できる。戻り値は元のリストのインデックス。