首頁 >後端開發 >Golang >Code n Golang 的出現:切片和切塊報告

Code n Golang 的出現:切片和切塊報告

Patricia Arquette
Patricia Arquette原創
2024-12-20 08:31:13192瀏覽

介紹

所以,這是 Golang 2024 年程式碼來臨的第二天,我們將探索我的方法和解決方案。問題沒那麼容易,但實施後發現很簡單,並發現正確。

您可以在 GitHub 上查看我的解決方案。

Advent of Code n Golang: Slicing and Dicing Reports 破壞先生 / 代碼出現

代碼的出現

第 1 部分

我們得到了一些稱為報告的行,每個報告都有許多層級。報告的要求是必須嚴格增加或減少至少1倍或最多3倍。

這意味著如果前兩個元素增加了1,那麼該報告中的其他後續元素也應該增加(增加1、2 或3)級別,並且不能有任何變化(即兩個相鄰元素的變化為0)數字,或兩個相鄰數字不能相同)

7 6 4 2 1
1 2 7 8 9
9 7 6 2 1
1 3 2 4 5
8 6 4 4 1
1 3 6 7 9
  • 我們首先進行輸入解析,這非常簡單,我們需要將其除以n 以獲得單獨的報告,這將是一個字符串,所以”7 6 4 2 1” ,我們想要得到一個切片整數。

  • 所以我們繼續並用空格/空白“”分割以獲得各個級別(數字),我們需要將它們轉換為整數。

  • 一旦我們有了報告的各個字串,即層級為 [“7”, “6”, “4”, “2”, “1”] ,我們需要將它們轉換為整數。

  • 我們迭代它們中的每一個並將它們轉換為整數並附加到列表中。

  • 建立清單後,我們將其追加到報告清單中,該清單將是數組的數組,即每一行都是一個報告,每個報告都有許多級別,因此是整數切片。

func SplitLevels(lines []string) [][]int {
    reportLevels := [][]int{}
    for i, reportLine := range lines {
        reportLevels = append(reportLevels, []int{})
        for _, levelStr := range strings.Split(reportLine, " ") {
            level, err := strconv.Atoi(levelStr)
            if err != nil {
                log.Fatal(err)
            }
            reportLevels[i] = append(reportLevels[i], level)
        }
    }
    return reportLevels
}

一旦我們建立了報告和級別,我們就會繼續實際分析各個報告中級別內的模式。

為此:

  • 我們首先取得單獨的報告,計算前兩個元素之間的差異,並記住在這裡小心使用絕對差異。

  • 我們需要維護一個標誌,指示報告中的等級是增加還是減少,這可以透過前兩個元素來確定。

    也就是說,如果前兩個元素增加,則後續等級也應增加,如果它們減少,則所有等級也應減少

  • 我們先進行警衛檢查,如果它們之間的差異是 0 或大於 3 或小於 -3,這是安全等級的條件。如果是這種情況,那麼我們回傳 false,即報告不安全。

  • 我們現在在前兩個元素之後迭代報告,然後計算接下來兩個層級之間的差異,如果標誌正在增加為true 並且當前差異小於或等於0 或超過3 我們也將其標記為false

  • 另一個條件是,如果標誌正在減少,這意味著前兩個元素具有負差,因此我們檢查當前差是否大於或等於0 或小於- 3,如果是這種情況,我們將其標記為false

  • 計算完所有等級的差異後,如果我們退出循環,我們將返回 true,因為我們沒有看到等級中存在任何差異。

7 6 4 2 1
1 2 7 8 9
9 7 6 2 1
1 3 2 4 5
8 6 4 4 1
1 3 6 7 9

第2部分

對於第二部分,我們需要做一些事情,我們需要計算報告是否安全,如果不安全,我們幾乎可以從報告中刪除一個元素以使其安全。

為此,方法是:

  • 取得我們第一次看到等級差異的索引

  • 透過從報告中刪除該元素進行檢查,如果這使報告安全,則傳回 true,即我們找到了安全報告

  • 如果我們仍然發現報告不安全,請刪除發現差異的索引之前的元素,如果現在我們在刪除該元素後發現它是安全的,則將其標記為安全

  • 如果我們仍然發現報告不安全,則刪除我們最初發現差異的索引後面的元素,如果報告變得安全,我們將該報告標記為安全

  • 否則我們會將報告標記為不安全,因為我們無法找到使報告安全的可移動元素。

func SplitLevels(lines []string) [][]int {
    reportLevels := [][]int{}
    for i, reportLine := range lines {
        reportLevels = append(reportLevels, []int{})
        for _, levelStr := range strings.Split(reportLine, " ") {
            level, err := strconv.Atoi(levelStr)
            if err != nil {
                log.Fatal(err)
            }
            reportLevels[i] = append(reportLevels[i], level)
        }
    }
    return reportLevels
}

您可以在 GitHub 上查看我的解決方案。

Advent of Code n Golang: Slicing and Dicing Reports 破壞先生 / 代碼出現

代碼的出現

結論

這就是它,這是 Golang 代碼 2024 出現的第二天的一個非常簡單的問題。我希望您喜歡 Golang 2024 年代碼降臨中第一天謎題的演練。

如果您有任何其他有趣的解決方案,或您對此有什麼要分享的,歡迎任何回饋、問題或建議。

謝謝您的閱讀,明天第三天見

快樂編碼:)

以上是Code n Golang 的出現:切片和切塊報告的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn