第123回【Python】出口のない迷路

現在取り組んでいるのは、paiza ラーニング問題集「クラス・構造体メニュー」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

Python をゼロから勉強してみよう、のコーナー 123 回目です。

会社の同世代メンバーと若手メンバーには、働き方についての考え方に大きな隔たりがあります。同世代メンバーはどちらかというとブラック時代を生き抜いてきたので、多少の残業や休出はなんとも思っていません。しかし、若手メンバーは普通に嫌そうな顔をします。昔はそんな顔したら上司に烈火のごとく怒鳴られたものです。

それでは、今日も頑張ってみようと思います。

出口のない迷路

洞窟を探検していたあなたは出口のない迷路に迷い込んでしまいました。
脱出するには、迷路の地点を与えられた指示通りに移動し、移動で訪れた(移動の開始・終了地点を含む)地点に置かれたアルファベットを
つなげた文字列を呪文として唱える必要があります。
各頂点からは、他の頂点に向かって一方通行の 2 つの道が伸びています。
各ポイントの情報と移動の指示が与えられるので、呪文となる文字列を出力してください。

N K S
a_1 r1_1 r2_1
...
a_N r1_N r2_N
M_1
...
M_K

・ 1 行目では、地点の数 N と、移動の回数 K , 移動を開始する地点の番号 S が与えられます。
・ 続く N 行のうち i 行目(1 ≦ i ≦ N)では、番号 i 地点に置いてあるアルファベット a_i と 1 つめの道のつながっている地点の番号 r1_i , 2 つめの道のつながっている地点の番号 r2_i が与えられます。
・ 続く K 行のうち i 行目(1 ≦ i ≦ K)では、 i 回目の移動で選んだ道の番号 M_i が与えられます。


すべてのテストケースにおいて、以下の条件をみたします。

・ 与えられる値は全て整数
・ 1 ≦ N , K ≦ 10^5
・ 1 ≦ S ≦ N
・ a_i (1 ≦ i ≦ N) はアルファベット 1 文字
・ 1 ≦ r1_i , r2_i ≦ N (1 ≦ i ≦ N)
・ M_i (1 ≦ i ≦ K) は 1 または 2 である。


入力例

4 4 1
p 2 4
a 3 1
i 4 2
z 1 2
1
1
1
2

出力例

paiza

クラスを使わなくても、辞書とかで出来ちゃいそうな気がしなくもないですが、クラスを使うとスッキリ素敵にコードが書けそうなので、挑戦してみます。

Python
class Mapping:
    def __init__(self,moji,r1,r2):
        self.moji = moji
        self.r1 = r1
        self.r2 = r2
    
    def get_moji(self):
        return self.moji
    
    def get_next(self,direction):
        if direction == 1:
            return self.r1
        else:
            return self.r2

N,K,S = map(int,input().split())
maze = [None] * N

for i in range(N):
    moji,r1,r2 = input().split()
    r1,r2 = int(r1)-1,int(r2)-1
    maze[i] = Mapping(moji,r1,r2)

now_p = maze[S-1]
keyword = now_p.get_moji()

for i in range(K):
    direction = int(input())
    now_p = maze[now_p.get_next(direction)]
    keyword += now_p.get_moji()
    
print(keyword)
VBA
## class_mapping
Private maze As MazeMultiple

Private Type MazeMultiple

    moji As String
    r1 As Long
    r2 As Long
    
End Type

Property Let set_maze(moji, r1, r2)

    maze.moji = moji
    maze.r1 = r1
    maze.r2 = r2
    
End Property

Property Get get_moji()

    get_moji = maze.moji
    
End Property

Property Get get_next(direction)

    If direction = 1 Then
        get_next = maze.r1
    Else
        get_next = maze.r2
    End If
    
End Property
## 標準モジュール
Sub class_primer__closed_maze()

    NKS = Split(Cells(1, 1), " ")
    N = Val(NKS(0))
    K = Val(NKS(1))
    S = Val(NKS(2))
    
    Dim maze() As New class_mapping
    ReDim maze(N - 1)
    
    For i = 0 To N - 1
        mrr = Split(Cells(i + 2, 1), " ")
        moji = mrr(0)
        r1 = Val(mrr(1)) - 1
        r2 = Val(mrr(2)) - 1
        maze(i).set_maze(moji, r1) = r2
    Next
    
    Set now_p = maze(S - 1)
    keyword = now_p.get_moji()
    
    For i = 1 To K
        direction = Cells(i + N + 1, 1)
        Set now_p = maze(now_p.get_next(direction))
        keyword = keyword & now_p.get_moji()
    Next
    
    Debug.Print keyword
    
End Sub

最後に

英語の単語力が低すぎて格好がつかない。paiza が出してくれているテストケース、N K S が 28542 92836 27589 のものを VBA で回してみても、ほぼ一瞬で回答が出力されました。連想配列で・・・は・・・試していない。

Python で書いたコードは、とても普通でよくあるやつだと思うのですが、VBA でも書けるんだなぁと少し感動。どうしても VBA は業務効率化的な使い方が多く、あまりクラスを活用してこなかったもので。

引き続き、よろしくお願いいたします!

Pythonpaiza,学習,Python

Posted by LeoSaki