[Advent of Code 2024] Day 3: Mull It Over

この記事は、[mae616 Advent of Code Advent Calendar 2024](https://qiita.com/advent-calendar/2024/mae616) の3日目の記事です。

https://qiita.com/advent-calendar/2024/mae616

このアドベントカレンダーは皆勤賞のQiitaくんのぬいぐるみに惹かれて挑戦している大変ゆるい挑戦のものです。そんな感じで読んでいただければ幸いです。

---

前の日: [[Advent of Code 2024] Day 2: Red-Nosed Reports](https://qiita.com/mae616/items/d9171df55b29864e958d)
次の日: [[Advent of Code 2024] Day 4: Ceres Search](https://qiita.com/mae616/items/fc83c5e720b35e6d6239)

# 今日のお題

https://adventofcode.com/

https://adventofcode.com/2024/day/3

# さて、今日の物語は...
> ■ 3日目: じっくり考える
> 「コンピューターに問題があり、主任歴史学者の在庫があるかどうかわかりません。倉庫を確認していただければと思います」と、北極トボガン レンタル ショップの店主が少し慌てた様子で言いました。言われて歴史学者たちは倉庫へ見に行きました。

どうもまた昨日とは別の次の場所へ探しにいったようですね。
「北極トボガン レンタル ショップ」は Advent of Code 2020 と繋がっているようです。今回も触れないでおきましょう٩( ᐛ )و

> 店主は、(残った)あなたのほうを向いて言いました。「なぜ私たちのコンピューターにまた問題が発生しているのか、お分かりになりますか？」

助けてあげましょう。
どうもプログラム(字句)を解析して、計算結果を求めてって問題のようです٩( ᐛ )و
難しそう ꉂꉂ( ᐛ )

# 1問目
`mul(X,Y)` は、`X` と `Y` は 1〜3桁の数値
例えば `mul(44,46)` は 44と46を掛け合わせるので、`44 * 46`になり *(44 * 46 = )* `2024` という結果になります。
プログラムのメモリが破損しているため、命令の一部のように思えても不完全な `mul` は無視する必要があります。

例:
`xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))`
は
x<INS>mul(2,4)</INS>%&mul[3,7]!@^do_not_ <INS>mul(5,5)</INS>+mul(32,64]then(<INS>mul(11,8)</INS><INS>mul(8,5)</INS>)
だけが完全な命令になり、
`(2 * 4 + 5 * 5 + 11 * 8 + 8 * 5) =` の `161`が答えになります。

## 解いたコード
```javascript: ./day3_1/main.js
function main(input) {
  const programs = input.split("\n");

  let sum = 0;
  for (const program of programs) {
    if (program === "") continue;

    const regex = /mul\(\d{1,3}\,\d{1,3}\)/g;
    const matches = program.match(regex);

    if (matches !== null) {
      for (const match of matches) {
        const strNum = match.match(/\d{1,3}/g);
        sum += Number(strNum[0]) * Number(strNum[1]);
      }
    }
  }
  console.log(sum);
}

main(require("fs").readFileSync("./input/puzzle.txt", "utf8"));
```
面倒くさいので正規表現で٩( ᐛ )و

https://github.com/mae616/adventOfCode2024/tree/main/day3_1

```zsh
cd day3_1
node main.jsノードmain.js
```
で実行できます。

# 2問目
新たに命令が加わるようです。
`do()` 命令は、今後の `mul` 命令を有効にします。
`don't()` 命令は、今後の `mul` 命令を無効にします。
最も直前にある `do()` または `don't()` 命令が適用されます。
プログラムの最初では、 `mul` 命令が有効です。

例
`xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))`
この場合では
x<INS>mul(2,4)</INS>&mul[3,7]!^**don't()**_mul(5,5)+mul(32,64](mul(11,8)un**do()**?<INS>mul(8,5)</INS>)
で `(2 * 4 + 8 * 5) = ` の `48` が答えになります。

んーやってみましょう٩( ᐛ )و

## 解いたコード
```js: ./day3_2/main.js
function main(input) {
  const programs = input.split("\n");

  let sum = 0;
  let flg = true;
  for (const program of programs) {
    if (program === "") continue;

    const regex = /(do\(\)|don't\(\)|mul\(\d{1,3}\,\d{1,3}\))/g;
    const matches = program.match(regex);

    if (matches !== null) {
      for (const match of matches) {
        if ("do()" === match) {
          flg = true;
        } else if ("don't()" === match) {
          flg = false;
        } else {
          if (flg) {
            const strNum = match.match(/\d{1,3}/g);
            sum += Number(strNum[0]) * Number(strNum[1]);
          }
        }
      }
    }
  }
  console.log(sum);
}

main(require("fs").readFileSync("./input/puzzle.txt", "utf8"));
```

https://github.com/mae616/adventOfCode2024/tree/main/day3_2

今日は終わり。お疲れさまです٩( ᐛ )و

---

今日の海外の人は...
https://www.reddit.com/r/adventofcode/
(お、やっぱり正規表現でリラックしてできた、て感じっぽいですね)

では、また明日٩( ᐛ )و