毎朝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'
初版(多重ループを抜ける方法)
- 初期座標を求める時に、index()メソッドが使えることに気づかず書いたもの。
- 多重ループを抜ける方法の参考に残しておく。
- 参考にさせてもらった記事:
Pythonで多重ループ(ネストしたforループ)からbreak | note.nkmk.me
# 初期位置を決める 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で範囲を指定できる。戻り値は元のリストのインデックス。