ここ数週間、MIAになってしまい申し訳ありません。私は引っ越しと新しい仕事をしたので、この間チャレンジに参加する機会がありませんでした。
Mohammad S. Anwar は毎週、毎週 2 つのタスクに対する解決策を全員が考え出すチャンスであるウィークリー チャレンジを送信します。私のソリューションは最初に Python で書かれ、次に Perl に変換されます。これは、私たち全員がコーディングを練習するのに最適な方法です。
挑戦、私の解決策
以下に示すように、チェス盤の正方形の座標を表す文字列である座標が与えられます。
四角形が明るい場合は 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 行または列 + 1 列または行離れた任意のマス目に移動できます。したがって、下の図では、S から始まる場合、E とマークされた任意の四角形に移動できます。
開始位置と終了位置を取得し、必要な最小移動数を計算するスクリプトを作成します。
こちらの方が詳しいです。次の変数から始めます:
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 サイトの他の関連記事を参照してください。