この記事は、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)
は、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))
は
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
が答えになります。
解いたコード
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
が答えになります。
んーやってみましょう٩( ᐛ )و
解いたコード
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/
(お、やっぱり正規表現でリラックしてできた、て感じっぽいですね)
では、また明日٩( ᐛ )و