ここ数週間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例
$ ./ch-2.py g2 a8 4 $ ./ch-2.py g2 h2 3
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3