ホームページ >バックエンド開発 >Golang >Code n Golang の登場: スライスとダイシングのレポート

Code n Golang の登場: スライスとダイシングのレポート

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-20 08:31:13152ブラウズ

導入

ということで、これは Golang の Advent of Code 2024 の 2 日目であり、これに対する私のアプローチと解決策を探っていきます。問題はそれほど簡単ではありませんでしたが、実装して正しいことが判明した後は非常に簡単でした。

ここ GitHub で私のソリューションをチェックできます。

Advent of Code n Golang: Slicing and Dicing Reports ミスター・ディストラクティブ / コードの出現

コードの到来

パート 1

レポートと呼ばれるいくつかの行が与えられており、各レポートには多数のレベルがあります。そしてレポートの要件は、少なくとも 1 倍、最大 3 倍の増加または減少である必要があることです。

これは、最初の 2 つの要素が 1 だけでも増加している場合、そのレポート内の他の後続の要素も (1、2、または 3 ずつ) レベル増加する必要があり、いかなる変化もあり得ない (つまり、隣接する 2 つの要素の変化が 0 である) ことを意味します。数字、または隣接する 2 つの数字を同じにすることはできません)

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
}

レポートとレベルを構築したら、個々のレポートのレベル内のパターンを実際に分析していきます。

そのために:

  • まず個​​々のレポートを取得し、最初の 2 つの要素の差を計算します。ここでは絶対差を慎重に使用することを忘れないでください。

  • レポート内のレベルが増加しているか減少しているかを示すフラグを維持する必要があります。これは最初の 2 つの要素で決定できます。

    つまり、最初の 2 つの要素が増加している場合は、後続のレベルも増加している必要があり、それらが減少している場合は、すべてのレベルも同様に減少しているはずです

  • 最初にガード チェックがあり、それらの差が 0、または 3 より大きい、または -3 より小さい場合、これが安全なレベルの条件です。その場合は、レポートが安全ではないことを示す false を返します。

  • 最初の 2 つの要素の後でレポートを反復処理し、増加フラグが true で、現在の差が 0 以下であるか、それを超えている場合に、次の 2 つのレベルの差を計算します。 3 また、false としてマークします

  • もう 1 つの条件は、フラグが減少している場合です。これは、最初の 2 つの要素に負の差があることを意味するため、現在の差が 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

パート 2 では、いくつかのことを行う必要があります。レポートが安全かどうかを計算する必要があります。安全でない場合は、レポートから 1 つの要素をほぼ削除して安全にすることができます。

そのためのアプローチは次のとおりです。

  • レベルの不一致が最初に確認されたインデックスを取得します

  • レポートからその要素を削除して確認し、レポートが安全になった場合は 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 の出現 2 日目の非常に単純な問題でした。 Golang の Advent of Code 2024 の初日パズルのこのウォークスルーを楽しんでいただければ幸いです。

他に興味深い解決策がある場合、またはこれに関して共有したいことがあればお知らせください。フィードバック、質問、提案は大歓迎です。

読んでいただきありがとうございます。また明日 3 日目にお会いしましょう

コーディングを楽しんでください:)

以上がCode n Golang の登場: スライスとダイシングのレポートの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。