ビジネスパーソン・ガジェット置場 empty lot for business

営業や仕事、それに伴う生活を便利に楽にするツール、ガジェットを作ります。既にあるツールも自分用にカスタマイズ。

ユニコードポイントへの変換(ord) Unicodeコードポイントからの変換(chr)を利用してチェス盤上の安全なポーンを探す(checkio)

備忘録です。

チェス盤上の安全なポーンを探すって何?という感じなのですが、こちらはcheckioをしているときに出てきた問題chr()という関数を初めて使ったのでそちらの備忘録です。

ポーンが安全かどうかをチェックする関数

むかーしちょっとやったことのあるチェスですが、すでに動かし方やルールを忘れていました。ただ、ルールはともかくとしてある位置に駒があるのかどうかを確認するという関数を作れば今回の目的は達成します。

 

位置を確認する条件

ポーンっていう駒は自分の右上と左上のエリアにいる駒を保護してくれるらしいので、例えばあるポーンが盤上に存在すると、そのポーンは右下、または左下に別のポーンがいれば安全圏にいるということになるみたいです。なので、今回は盤上に複数のポーンがいて、それぞれのポーンが安全かどうか、つまりそのポーンの右下、もしくは左下に別のポーンがいるかどうかをチェックします。

※説明がむずい。。。

※ちなみにチェスは列方向にa~h、行方向に1~8の番号がふってあるのでそれぞれのマスはa1, b3などのように呼ぶようです。

 

右下、左下にポーンがいるかの確認方法

 

今回、ポーンが今いる位置の右下、左下にポーンがいるか確認するということなので、今いる位置のマス目から右下、左下のマス目を求めれば良いということになります。求め方は色々あると思うのですが、例えばマス目「b5」の左下は「a4」右下は「c4」になります。つまりアルファベットはひとつ前と後、数字はひとつ下になるのでそれを求めれば良いことになります。

※説明がやばい。。。わかりずらい

 

とりあえずコード

こんな感じで求めてみました

def safe_pawns(pawns: set) -> int:
    # set型なのでlistに変換してインデックスで取得できるようにしておく
    l_pawns = list(pawns)
    l_safe =[]
    # 文字列と Unicodeポイントを辞書化しておく
    d_col = {'a': 97, 'b': 98, 'c': 99, 'd':100, 'e':101, 'f':102, 'g':103, 'h':104}
    # 与えられたリストから一つずつ取り出して確認
    for pawn in l_pawns:
        # chrを使用して右隣、左隣のアルファベットを取得、また数字から1引くことで直下の行番号を取得
        lower_right = chr(d_col[pawn[0]]+1) + str(int(pawn[1])-1)
        lower_left = chr(d_col[pawn[0]]-1) + str(int(pawn[1])-1)
        # a列は左側が盤外になるため右側だけ確認
        if chr(d_col[pawn[0]]) == 'a':
            if lower_right in l_pawns:
                l_safe.append(pawn) 
        # h列は左側が盤外になるため左側だけ確認
        elif chr(d_col[pawn[0]]) == 'h':
            if lower_left in l_pawns:
                l_safe.append(pawn)
        else:
            if lower_right in l_pawns or lower_left in l_pawns:
                l_safe.append(pawn)
    return len(l_safe)

# 引数の集合はポーンの位置です。
safe_pawns({"b4", "d4", "f4", "c3", "e3", "g5", "d2"})

# > 6

 

上記で関数にわたしている引数はポーンが置いてある位置です。上記の例では"b4", "d4", "f4", "c3", "e3", "g5", "d2"この7つの位置にポーンが置いてあります。そして自分の右下、左下の位置にポーンがあればいいので、この集合内にそのマス目が入っていれば良いということになります。

 

例えば、b4から見るとc3は右下に位置するのでb4は安全!という感じです。

今回、chrを使用したのは、アルファベットの並びを式として求めるのにアルファベット自体を数字にできたら簡単だなということからでした。

 

aは Unicodeコードポイントでは97になります。ということはbは98になります。この数字を利用したのが今回の関数です。

 

今回は以上ですが、これ備忘録で後で見直しても自分の文章見て思い出すことができるかな。。。心配です。