很抱歉在過去幾週我失踪了。我搬了家,換了新工作,所以這段時間沒有機會參與挑戰。
穆罕默德·S·安瓦爾 (Mohammad S. Anwar) 每週都會發出“每週挑戰”,為我們所有人提供了為兩週任務提出解決方案的機會。我的解決方案先用Python編寫,然後轉換為Perl。這對我們所有人來說都是練習編碼的好方法。
挑戰,我的解決方案
給定座標,一個字串,表示棋盤正方形的座標,如下所示:
編寫一個腳本,如果方塊較亮則傳回 true,如果方塊較暗則傳回 false。
這相對簡單。我做的第一件事是檢查提供的位置是否有效(第一個字元是 a-h,第二個字元在 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
西洋棋中的馬可以從目前位置移動到兩行或兩列加一列或一行之外的任意方格。所以在下圖中,如果它以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 代表騎士的新座標。如果這導致了棋盤之外的位置或我們已經去過的座標,我會跳過它。如果它落在目標上,我將返回移動值。
循環結束後,我將座標列表重設為透過迭代收集的座標,並將移動值加一。這一直持續到我們到達目標座標。
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