[Advent of Code 2024] Day 2: Red-Nosed Reports

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

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

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

---
 前の日: [[Advent of Code 2024] Day 1: Historian Hysteria](https://qiita.com/mae616/items/8be22631f6e4ee41b08c)
 次の日: [[Advent of Code 2024] Day 3: Mull It Over](https://qiita.com/mae616/items/e8ec70a8a9868862238c)


 # 今日のお題

https://adventofcode.com/

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

# さて、物語はどうなったでしょう？
> ■ 2日目: 赤鼻のレポート
> 幸いなことに、歴史家たちが最初に調べたい場所は、主任歴史家のオフィスからそんなに遠くないところでした。

どうも探す場所のリストが完成して、進んでいってるようですね。素晴らしい٩( ᐛ )و

> 赤鼻のトナカイの核融合/核分裂プラントに主任歴史学者の姿は見当たりませんが、(赤鼻のトナカイの核融合/核分裂プラントの)エンジニアたちは、あなたを見つけるとすぐ駆け寄ってきました。

どうもこの辺は、過去のAdvent of Code 2015と繋がっているようです。
自分は、初めて参加するのでこの辺の話は飛ばします٩( ᐛ )و

> エンジニアたちはあなたに「せっかく来てくれたので、赤鼻の炉からの異常なデータの分析を手伝ってもらえますか？」と言いました。

ということでお手伝いしましょう。

# 1問目のお題
例:
```
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
```
行が各レポートで、スペースで区切られた各計測されたレベルがあるのかな。
例のものは、全部で6行なので6レポートあって、それぞれ1レポート毎に5回レベルの計測をしてる感じになってます。
エンジニアたちは、どのレポートが安全か見極めようとしています。

安全なレポートである条件:
* レベルがすべて増加しているか、すべて減少していること
* 隣接する2つのレベルの差が少なくとも1、最大で3であること

安全なレポートの数を答えましょう。

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

  let count = 0;
  for (const current of args) {
    if (current === "") continue;

    const levels = current.split(" ").map(Number);

    let asc = true;
    if (levels[0] > levels[levels.length - 1]) {
      asc = false;
    }

    let safe = true;
    let prev = levels[0];
    for (let i = 1; i < levels.length; i++) {
      if (
        (asc && (prev >= levels[i] || levels[i] - prev > 3)) ||
        (!asc && (prev <= levels[i] || prev - levels[i] > 3))
      ) {
        safe = false;
        break;
      }
      prev = levels[i];
    }
    if (safe) {
      count++;
    }
  }
  console.log(count);
}

main(require("fs").readFileSync("./input/puzzle.txt", "utf8"));
```
うまくいかないと思ったら数値変換を忘れてた ꉂꉂ( ᐛ )

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

下記で実行できます
```zsh
cd day2_1
node main.js
```

# 2問目のお題
> ちょっと安全でないレポート多くない？てなってたら、実はエンジニアたちは問題緩和装置が付いてたのを忘れてた！
> 問題緩和装置は、原子炉に取り付けられたモジュールで1つの不良レベルを許容できるようにしている。
> 安全でないレポートから1つのレベルを削除すると安全になる場合は、レポートは安全であるとカウントするようにしてください。

ということでレッツゴー٩( ᐛ )و

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

  let count = 0;
  for (const current of args) {
    if (current === "") continue;

    const levels = current.split(" ").map(Number);

    const isSafe = (ary) => {
      let asc = true;
      if (ary[0] > ary[ary.length - 1]) {
        asc = false;
      }

      let safe = true;
      let prev = ary[0];
      for (let i = 1; i < ary.length; i++) {
        if (
          (asc && (prev >= ary[i] || ary[i] - prev > 3)) ||
          (!asc && (prev <= ary[i] || prev - ary[i] > 3))
        ) {
          safe = false;
          break;
        }
        prev = ary[i];
      }
      return safe;
    };

    if (isSafe(levels)) {
      count++;
    } else {
      for (let i = 0; i < levels.length; i++) {
        if (isSafe(levels.filter((_, index) => index !== i))) {
          count++;
          break;
        }
      }
    }
  }
  console.log(count);
}

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

はまっちゃいました ꉂꉂ( ᐛ )
へっぽこです ٩( ᐛ )و

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

2日目も終わり٩( ᐛ )و
どうなっていくでしょうね。お疲れさまです٩( ᐛ )و

---

今日も海外の人と
https://www.reddit.com/r/adventofcode/
(HashMap使えばよかったのかな？なんかそんなようなこといってる人が多いですね)

では、また明日