毎朝ちびちび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で範囲を指定できる。戻り値は元のリストのインデックス。