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

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

Dec 20, 2024 am 08:31 AM

導入

ということで、これは 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 までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Golangの目的:効率的でスケーラブルなシステムの構築 Golangの目的:効率的でスケーラブルなシステムの構築 Apr 09, 2025 pm 05:17 PM

GO言語は、効率的でスケーラブルなシステムの構築においてうまく機能します。その利点には次のものがあります。1。高性能:マシンコードにコンパイルされ、速度速度が速い。 2。同時プログラミング:ゴルチンとチャネルを介してマルチタスクを簡素化します。 3。シンプルさ:簡潔な構文、学習コストとメンテナンスコストの削減。 4。クロスプラットフォーム:クロスプラットフォームのコンパイル、簡単な展開をサポートします。

Golang and C:Concurrency vs. Raw Speed Golang and C:Concurrency vs. Raw Speed Apr 21, 2025 am 12:16 AM

Golangは並行性がCよりも優れていますが、Cは生の速度ではGolangよりも優れています。 1)Golangは、GoroutineとChannelを通じて効率的な並行性を達成します。これは、多数の同時タスクの処理に適しています。 2)Cコンパイラの最適化と標準ライブラリを介して、極端な最適化を必要とするアプリケーションに適したハードウェアに近い高性能を提供します。

Golang vs. Python:重要な違​​いと類似点 Golang vs. Python:重要な違​​いと類似点 Apr 17, 2025 am 12:15 AM

GolangとPythonにはそれぞれ独自の利点があります。Golangは高性能と同時プログラミングに適していますが、PythonはデータサイエンスとWeb開発に適しています。 Golangは同時性モデルと効率的なパフォーマンスで知られていますが、Pythonは簡潔な構文とリッチライブラリエコシステムで知られています。

Golang vs. Python:パフォーマンスとスケーラビリティ Golang vs. Python:パフォーマンスとスケーラビリティ Apr 19, 2025 am 12:18 AM

Golangは、パフォーマンスとスケーラビリティの点でPythonよりも優れています。 1)Golangのコンピレーションタイプの特性と効率的な並行性モデルにより、高い並行性シナリオでうまく機能します。 2)Pythonは解釈された言語として、ゆっくりと実行されますが、Cythonなどのツールを介してパフォーマンスを最適化できます。

Golangの影響:速度、効率、シンプルさ Golangの影響:速度、効率、シンプルさ Apr 14, 2025 am 12:11 AM

speed、効率、およびシンプル性をspeedsped.1)speed:gocompilesquilesquicklyandrunseffictient、理想的なlargeprojects.2)効率:等系dribribraryreducesexexternaldedenciess、開発効果を高める3)シンプルさ:

パフォーマンスレース:ゴラン対c パフォーマンスレース:ゴラン対c Apr 16, 2025 am 12:07 AM

GolangとCにはそれぞれパフォーマンス競争において独自の利点があります。1)Golangは、高い並行性と迅速な発展に適しており、2)Cはより高いパフォーマンスと微細な制御を提供します。選択は、プロジェクトの要件とチームテクノロジースタックに基づいている必要があります。

CとGolang:パフォーマンスが重要な場合 CとGolang:パフォーマンスが重要な場合 Apr 13, 2025 am 12:11 AM

Cは、ハードウェアリソースと高性能の最適化が必要なシナリオにより適していますが、Golangは迅速な開発と高い並行性処理が必要なシナリオにより適しています。 1.Cの利点は、ハードウェア特性と高い最適化機能に近いものにあります。これは、ゲーム開発などの高性能ニーズに適しています。 2.Golangの利点は、その簡潔な構文と自然な並行性サポートにあり、これは高い並行性サービス開発に適しています。

GolangとC:パフォーマンスのトレードオフ GolangとC:パフォーマンスのトレードオフ Apr 17, 2025 am 12:18 AM

GolangとCのパフォーマンスの違いは、主にメモリ管理、コンピレーションの最適化、ランタイム効率に反映されています。 1)Golangのゴミ収集メカニズムは便利ですが、パフォーマンスに影響を与える可能性があります。

See all articles