「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > チェス盤に関するもの

チェス盤に関するもの

2024 年 8 月 27 日に公開
ブラウズ:865

ウィークリーチャレンジ 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 番目の値は行です。
  • move は実行された移動数であり、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 



$ ./ch-2.py g2 a8
4

$ ./ch-2.py g2 h2
3
リリースステートメント この記事は次の場所に転載されています: https://dev.to/simongreennet/the-one-about-a-chess-board-57mh?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3