チェス盤に関するもの

WBOY
リリース: 2024-08-12 18:32:32
オリジナル
726 人が閲覧しました

ウィークリーチャレンジ 281

ここ数週間、MIAになってしまい申し訳ありません。私は引っ越しと新しい仕事をしたので、この間チャレンジに参加する機会がありませんでした。

Mohammad S. Anwar は毎週、毎週 2 つのタスクに対する解決策を全員が考え出すチャンスであるウィークリー チャレンジを送信します。私のソリューションは最初に Python で書かれ、次に Perl に変換されます。これは、私たち全員がコーディングを練習するのに最適な方法です。

挑戦、私の解決策

タスク 1: 色の確認

タスク

以下に示すように、チェス盤の正方形の座標を表す文字列である座標が与えられます。

The one about a chess board

四角形が明るい場合は true を返し、四角形が暗い場合は false を返すスクリプトを作成します。

私の解決策

これは比較的簡単です。最初に行うことは、指定された位置が有効であることを確認することです (最初の文字は a ~ h で、2 番目の文字は 1 ~ 8 の間です)。

次に、最初の文字が a、c、e、または g で数値が偶数であるか、最初の文字が b、d、f または h で数値が奇数であるかを確認し、true を返します。それ以外の場合は false を返します。

def check_color(coords: str) -> bool:
    if not re.search('^[a-h][1-8]$', coords):
        raise ValueError('Not a valid chess coordinate!')

    if coords[0] in ('a', 'c', 'e', 'g') and int(coords[1]) % 2 == 0:
        return True
    if coords[0] in ('b', 'd', 'f', 'h') and int(coords[1]) % 2 == 1:
        return True
    return False
ログイン後にコピー

$ ./ch-1.py d3
true

$ ./ch-1.py g5
false

$ ./ch-1.py e6
true
ログイン後にコピー

タスク 2: 騎士の一手

タスク

チェスのナイトは、現在の位置から 2 行または列 + 1 列または行離れた任意のマス目に移動できます。したがって、下の図では、S から始まる場合、E とマークされた任意の四角形に移動できます。

The one about a chess board

開始位置と終了位置を取得し、必要な最小移動数を計算するスクリプトを作成します。

私の解決策

こちらの方が詳しいです。次の変数から始めます:

  • デルタは、ナイトが現在の位置から移動できる 8 つの方法を含むリストのタプル (Perl では配列の配列) です。
  • target は到達したいセルです。このために、最初の文字を 1 から 8 までの数値に変換します。これはタプルとして保存され、最初の値は列、2 番目の値は行です。
  • 移動数は実行された移動数であり、1 から始まります。
  • 表示されているのは、すでに訪問したセルのリストです。
  • coords は騎士の現在の役職のリストです。開始座標から始まります。
def knights_move(start_coord: str, end_coord: str) -> int:
    for coord in (start_coord, end_coord):
        if not re.search('^[a-h][1-8]$', coord):
            raise ValueError(
                f'The position {coord} is not a valid chess coordinate!')

    deltas = ([2, 1], [2, -1], [-2, 1], [-2, -1],
              [1, 2], [1, -2], [-1, 2], [-1, -2])
    coords = [convert_coord_to_list(start_coord)]
    target = convert_coord_to_list(end_coord)
    moves = 1
    seen = []
ログイン後にコピー

その後、現在の座標リストとデルタ リストの二重ループができます。ナイトの新しい座標を表す変数 new_pos を設定します。これがボードの外側の位置や、すでに行ったことのある座標につながる場合は、スキップします。ターゲットに着地した場合は、移動値を返します。

ループの後、座標リストを反復を通じて収集された座標にリセットし、移動値を 1 つ増やします。これは、ターゲット座標に到達するまで続きます。

    while True:
        new_coords = []

        for coord in coords:
            for delta in deltas:
                new_pos = (coord[0] + delta[0], coord[1] + delta[1])

                if not 0 < new_pos[0] < 9 or not 0 < new_pos[1] < 9 or new_pos in seen:
                    continue

                if new_pos == target:
                    return moves

                new_coords.append(new_pos)
                seen.append(new_pos)

        coords = new_coords
        moves += 1
ログイン後にコピー

$ ./ch-2.py g2 a8
4

$ ./ch-2.py g2 h2
3
ログイン後にコピー

以上がチェス盤に関するものの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート