」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 關於棋盤的一個

關於棋盤的一個

發佈於2024-08-27
瀏覽:137

每週挑戰 281

很抱歉在過去幾週我失踪了。我搬了家,換了新工作,所以這段時間沒有機會參與挑戰。

穆罕默德·S·安瓦爾 (Mohammad S. Anwar) 每週都會發出“每週挑戰”,為我們所有人提供了為兩週任務提出解決方案的機會。我的解決方案先用Python編寫,然後轉換為Perl。這對我們所有人來說都是練習編碼的好方法。

挑戰,我的解決方案

任務 1:檢查顏色

任務

給定座標,一個字串,表示棋盤正方形的座標,如下所示:

The one about a chess board

編寫一個腳本,如果方塊較亮則傳回 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

任務2:騎士的行動

任務

西洋棋中的馬可以從目前位置移動到兩行或兩列加一列或一行之外的任意方格。所以在下圖中,如果它以S開頭,它可以移動到任何標記為E的方塊。

The one about a chess board

編寫一個腳本,該腳本採用起始位置和結束位置併計算所需的最少移動次數。

我的解決方案

這個比較詳細。我從以下變數開始:

  • deltas 是一個列表元組(Perl 中的數組的數組),其中包含騎士從當前位置移動的八種方式。
  • target 是我們想要到達的儲存格。為此,我將第一個字母轉換為從 1 到 8 的數字。它儲存為元組,第一個值是列,第二個值是行。
  • move 是移動次數,從 1 開始。
  • see 是我們已經造訪過的儲存格清單。
  • 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 代表騎士的新座標。如果這導致了棋盤之外的位置或我們已經去過的座標,我會跳過它。如果它落在目標上,我將返回移動值。

循環結束後,我將座標列表重設為透過迭代收集的座標,並將移動值加一。這一直持續到我們到達目標座標。

    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]刪除
最新教學 更多>
  • Java中Arrays與Lists:何時選擇哪種以優化性能?
    Java中Arrays與Lists:何時選擇哪種以優化性能?
    在java中,您在存儲大量字符串時會選擇一個選擇:數組或列表。這個決定可能會影響性能,特別是在處理數千個元素時。 陣列的優勢但是,數組也有限制: 固定的大小:數組需要一個預定的大小,如果您的數據集會動態地成長或縮小數據集就會變得有問題。效率低下。 列表 附加功能:列表提供內置功能,例如迭代器,排序...
    程式設計 發佈於2025-04-16
  • jQuery AJAX調用接收數據錯誤,但PHP已返回JSON
    jQuery AJAX調用接收數據錯誤,但PHP已返回JSON
    PHP將JSON返回jquery Ajax調用 ,儘管您努力通過JQUERY的AJAX功能與PHP進行通信,但您仍在繼續遇到“選擇器激活”錯誤。此外,檢索到的數據似乎不正確。 Let's delve into the issue and identify the potential ca...
    程式設計 發佈於2025-04-16
  • 如何解決由於Android的內容安全策略而拒絕加載腳本... \”錯誤?
    如何解決由於Android的內容安全策略而拒絕加載腳本... \”錯誤?
    Unveiling the Mystery: Content Security Policy Directive ErrorsEncountering the enigmatic error "Refused to load the script..." when deployi...
    程式設計 發佈於2025-04-16
  • HTML格式標籤
    HTML格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2025-04-16
  • .NET應用無異常記錄堆棧跟踪方法
    .NET應用無異常記錄堆棧跟踪方法
    在.NET中記錄堆棧痕跡而沒有異常在調試應用程序時,對於捕獲當前堆棧跟踪以識別任何問題的來源很有用。但是,在沒有例外的情況下,記錄堆棧跟踪可能是一個挑戰。 system.diagnostics.diagnostics.stacktrace system.diagnostics.stacktra...
    程式設計 發佈於2025-04-16
  • 為什麼不````''{margin:0; }`始終刪除CSS中的最高邊距?
    為什麼不````''{margin:0; }`始終刪除CSS中的最高邊距?
    在CSS 問題:不正確的代碼: 全球範圍將所有餘量重置為零,如提供的代碼所建議的,可能會導致意外的副作用。解決特定的保證金問題是更建議的。 例如,在提供的示例中,將以下代碼添加到CSS中,將解決餘量問題: body H1 { 保證金頂:-40px; } 此方法更精確,避免了由全局保證金重置...
    程式設計 發佈於2025-04-16
  • 可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html </main> <section> { display:grid; grid-template-...
    程式設計 發佈於2025-04-16
  • 如何使用Python理解有效地創建字典?
    如何使用Python理解有效地創建字典?
    在python中,詞典綜合提供了一種生成新詞典的簡潔方法。儘管它們與列表綜合相似,但存在一些顯著差異。 與問題所暗示的不同,您無法為鑰匙創建字典理解。您必須明確指定鍵和值。 For example:d = {n: n**2 for n in range(5)}This creates a dict...
    程式設計 發佈於2025-04-16
  • eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    eval()vs. ast.literal_eval():對於用戶輸入,哪個Python函數更安全?
    稱量()和ast.literal_eval()中的Python Security 在使用用戶輸入時,必須優先確保安全性。強大的python功能eval()通常是作為潛在解決方案而出現的,但擔心其潛在風險。本文深入研究了eval()和ast.literal_eval()之間的差異,突出顯示其安全性含義...
    程式設計 發佈於2025-04-16
  • 如何從PHP中的數組中提取隨機元素?
    如何從PHP中的數組中提取隨機元素?
    從陣列中的隨機選擇,可以輕鬆從數組中獲取隨機項目。考慮以下數組:; 從此數組中檢索一個隨機項目,利用array_rand( array_rand()函數從數組返回一個隨機鍵。通過將$項目數組索引使用此鍵,我們可以從數組中訪問一個隨機元素。這種方法為選擇隨機項目提供了一種直接且可靠的方法。
    程式設計 發佈於2025-04-16
  • 如何使用PHP將斑點(圖像)正確插入MySQL?
    如何使用PHP將斑點(圖像)正確插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call fil...
    程式設計 發佈於2025-04-16
  • 如何在鼠標單擊時編程選擇DIV中的所有文本?
    如何在鼠標單擊時編程選擇DIV中的所有文本?
    在鼠標上選擇div文本單擊帶有文本內容,用戶如何使用單個鼠標單擊單擊div中的整個文本?這允許用戶輕鬆拖放所選的文本或直接複製它。 在單個鼠標上單擊的div元素中選擇文本,您可以使用以下Javascript函數: function selecttext(canduterid){ if(d...
    程式設計 發佈於2025-04-16
  • 如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    postgresql:為每個唯一標識符在postgresql中提取最後一行,您可能需要遇到與數據集合中每個不同標識的信息相關的信息。考慮以下數據:[ 1 2014-02-01 kjkj 在數據集中的每個唯一ID中檢索最後一行的信息,您可以在操作員上使用Postgres的有效效率: id dat...
    程式設計 發佈於2025-04-16
  • 在PHP中如何高效檢測空數組?
    在PHP中如何高效檢測空數組?
    在PHP 中檢查一個空數組可以通過各種方法在PHP中確定一個空數組。如果需要驗證任何數組元素的存在,則PHP的鬆散鍵入允許對數組本身進行直接評估:一種更嚴格的方法涉及使用count()函數: if(count(count($ playerList)=== 0){ //列表為空。 } 對...
    程式設計 發佈於2025-04-16
  • 您可以使用CSS在Chrome和Firefox中染色控制台輸出嗎?
    您可以使用CSS在Chrome和Firefox中染色控制台輸出嗎?
    在javascript console 中顯示顏色是可以使用chrome的控制台顯示彩色文本,例如紅色的redors,for for for for錯誤消息? 回答是的,可以使用CSS將顏色添加到Chrome和Firefox中的控制台顯示的消息(版本31或更高版本)中。要實現這一目標,請使用以下...
    程式設計 發佈於2025-04-16

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3