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

導入

ということで、これは 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 までご連絡ください。
Goroutinesの理解:Goの同時性に深く潜りますGoroutinesの理解:Goの同時性に深く潜りますMay 01, 2025 am 12:18 AM

GoroutinesAreSareSareSareSormethodSthaturncurlyntingo、Enableing and LightweightConcurrency.1)theyRuntimeSimeSingMultiplexing、SountyStorunonFeweroSthReads.2)ゴルチンズを失ったことを許可します

go:目的と使用法でのinit機能を理解するgo:目的と使用法でのinit機能を理解するMay 01, 2025 am 12:16 AM

initistoistoInitializevariables、setupconutupurations、orforformndexedarysetupbe foreThemainfunctionexecutes.useinitby:1)inginginyourcodeTorunautorunaintalunain、2)KeepingItshortandpocusedonsimpletasks、3)ConsididiriveSusinginsingingingingingingingingingingingingingingingingingingingingingingsingpltassksを使用すると、

GOインターフェイスの理解:包括的なガイドGOインターフェイスの理解:包括的なガイドMay 01, 2025 am 12:13 AM

go interfacesaremethodsignaturesetsetsattypesmustimplement、unableingpolymorphism withintinheritance forcleaner、modularcode.theyareimplictilistifisisfiestified、houseforfflexibleapisanddeaupling、busrecarefulusoavoidoidoimoidimeerrororsypertety。

GOのパニックからの回復:いつ、どのように使用するか()GOのパニックからの回復:いつ、どのように使用するか()May 01, 2025 am 12:04 AM

Goで回復()関数を使用して、パニックから回復します。特定の方法は次のとおりです。1)回復()を使用して、延期関数でパニックをキャプチャして、プログラムのクラッシュを避けます。 2)デバッグの詳細なエラー情報を記録します。 3)特定の状況に基づいてプログラムの実行を再開するかどうかを決定します。 4)パフォーマンスに影響を及ぼさないように注意して使用します。

「文字列」をどのように使用しますかGoで文字列を操作するパッケージ?「文字列」をどのように使用しますかGoで文字列を操作するパッケージ?Apr 30, 2025 pm 02:34 PM

この記事では、弦の操作にGOの「文字列」パッケージを使用し、効率を高め、ユニコードを効果的に処理するための一般的な機能とベストプラクティスの詳細を説明します。

「crypto」をどのように使用しますかGoで暗号化操作を実行するパッケージ?「crypto」をどのように使用しますかGoで暗号化操作を実行するパッケージ?Apr 30, 2025 pm 02:33 PM

記事の詳細は、暗号化操作のためのGoの「暗号」パッケージ、安全な実装のための主要な生成、管理、およびベストプラクティスについて議論するためのパッケージ。

「時間」をどのように使用しますかGOの日付と時間を処理するパッケージ?「時間」をどのように使用しますかGOの日付と時間を処理するパッケージ?Apr 30, 2025 pm 02:32 PM

この記事では、現在の時間の取得、特定の時間の作成、文字列の解析、経過時間の測定など、日付、時間、およびタイムゾーンを処理するためのGoの「時間」パッケージの使用について詳しく説明しています。

「反射」をどのように使用しますかGOの変数のタイプと値を検査するパッケージ?「反射」をどのように使用しますかGOの変数のタイプと値を検査するパッケージ?Apr 30, 2025 pm 02:29 PM

記事では、可変検査と変更のためにGOの「反射」パッケージを使用して、方法とパフォーマンスの考慮事項を強調するために説明します。

See all articles

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません