1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

mae616 Advent of CodeAdvent Calendar 2024

Day 3

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

Last updated at Posted at 2024-12-03

この記事は、mae616 Advent of Code Advent Calendar 2024 の3日目の記事です。

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


前の日: [Advent of Code 2024] Day 2: Red-Nosed Reports
次の日: [Advent of Code 2024] Day 4: Ceres Search

今日のお題

さて、今日の物語は...

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

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

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

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

1問目

mul(X,Y) は、XY は 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))

xmul(2,4)%&mul[3,7]!@^do_not_ mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))
だけが完全な命令になり、
(2 * 4 + 5 * 5 + 11 * 8 + 8 * 5) =161が答えになります。

解いたコード

./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"));

面倒くさいので正規表現で٩( ᐛ )و

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))
この場合では
xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))
(2 * 4 + 8 * 5) = 48 が答えになります。

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

解いたコード

./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://www.reddit.com/r/adventofcode/
(お、やっぱり正規表現でリラックしてできた、て感じっぽいですね)

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?