C# を使用した Code 2021 の出現: 2 日目 - ダイブ!


新しい日が始まり、新たな挑戦者がやってくる. Advent of Code 2日目です!

今日の問題はかなり簡単です.パズルには一連の指示が付属しており、これらの指示に従って潜水艦の位置を計算する必要があります.

いつものように、入力は文字列ファイルで提供され、各行は次のようにフォーマットされます: command units .

入力の解釈は、パート 1 とパート 2 で異なります.

パート1



パート 1 では、一連の指示が与えられます.これらの指示に従う場合、潜水艦の最終的な位置を計算する必要があります. forwardupdown の 3 つの命令「トークン」があります.
  • forward: 水平位置を増やします
  • up: 垂直位置を下げます
  • down: 垂直位置を上げます

  • 各トークンの後には、特定の方向への移動単位である数字が続きます.

    ソリューションの構築を始めましょう.まず、パズルを解くアルゴリズムを設計し、それを C# コードに変換します.

    すべての移動命令を含む文字列配列 Instructions があります.私たちの目標は、最終的な X 位置に最終的な Y 位置を掛けた積を計算することです.

    命令シーケンスを反復処理し、各命令を取得します.命令形式は command units であるため、これを command および units にトークン化する必要があります.

    コマンド トークンが forward の場合、XPosition を units だけ増やします.コマンド トークンが up の場合、YPosition を units だけ減らします.最後に、コマンド トークンが down の場合、YPosition を units だけ増やします.

    最後のステップは、XPosition と YPosition の積を計算することです.

    SUBMARINE_MOVEMENT(Instructions)
    INPUT: A list of string instructions
    OUTPUT: The product of the final horizontal position times the final vertical position
    
    XPosition = 0
    YPosition = 0
    
    FOREACH(Instruction in Instructions)
        (instruction, units) = TOKENIZE(instruction)
    
        SWITCH instruction
            CASE "forward"
                XPosition = XPosition + units
            CASE "up"
                YPosition = YPosition - units
            CASE "down"
                YPosition = YPosition + units
        END SWITCH
    END FOREACH
    
    RETURN XPosition * YPosition
    


    アルゴリズムを理解したら、C# の実装を始めましょう.

    int xPosition = 0;
    int yPosition = 0;
    foreach(string instruction in data)
    {
        string[] commands = instruction.Split(" ");
        switch(commands[0])
        {
            case "forward":
            xPosition += int.Parse(commands[1]);
            break;
        case "up":
            yPosition -= int.Parse(commands[1]);
            break;
        case "down":
            yPosition += int.Parse(commands[1]);
            break;
        }
    }
    
    return xPosition * yPosition;
    


    使い方



    解決策はかなり明確です.まず、命令が空白で分割され、[command, unit] 配列が作成されます.次に、switch ステートメントが command 引数を解析し、適切な位置計算を実行します.

    パート2



    パート 2 では、計算にひねりを加えています.垂直位置を変更する代わりに、up および down コマンドは潜水艦の pitch angle を変更します.ピッチ角のみが影響を受けるため、forward コマンドは垂直方向と水平方向の位置を変更します.現在、forward は水平位置に X 単位を追加し、垂直位置に pitch_angle * X 単位を追加します.

    これに対処するには、計算関数を少し調整する必要があります.

    int xPosition = 0;
    int yPosition = 0;
    
    int aim = 0;
    
    foreach (string instruction in data)
    {
        string[] commands = instruction.Split(" ");
        switch (commands[0])
        {
            case "forward":
            xPosition += int.Parse(commands[1]);
            yPosition += int.Parse(commands[1]) * aim;
            break;
        case "up":
            aim -= int.Parse(commands[1]);
            break;
        case "down":
            aim += int.Parse(commands[1]);
            break;
        }
    }
    
    return xPosition * yPosition
    


    使い方



    パート 2 の答えを計算するには、わずかな調整のみが必要です.

    まず、潜水艦のピッチ角を格納するために、新しい整数変数 aim を導入しました.
    up および down コマンドは、船の垂直位置に影響を与えなくなり、代わりにピッチ角を調整します.

    最後に、forward コマンドは、水平位置に X 単位を追加し、垂直位置を計算することによって、船の水平方向の動きを計算します.垂直位置は、移動角度 X 単位の積です.

    それはすべての人々です!



    Day02 パズルは、詳細に注意を払う必要のある難しい部分がなく、AoC の優れた明確な入門パズルです.

    私のソリューションがどのように機能するかについて、より詳細な説明を皆さんに提供できれば幸いです.

    私の Github Repo でこの解決策と他の解決策を見つけることができます.

    Advent of Code 2021 の次のエピソードでお会いしましょう!