ホーム

Advent Of Code を解き始めた。無双する。

うえすん


戻ってきてくれと言われてももう遅い。

Advent Calendar

Advent Calendar とはクリスマスを待ち望む人用のカレンダーで、12 月になるとクリスマスまで毎日一つずつ印をつけていくという風習があります。箱の形でお菓子が入っているものもあります。

Designed by pikisuperstar / Freepik

Advent Calendar の例

IT 業界の Advent Calendar は、クリスマス前に毎日ブログ記事を書く風習のことを指します。ブログ記事の代わりに、配信したり作品を作ったりと色々な亜種があります。

Advent Of Code

Advent Of Code (aoc)はクリスマスまで毎日プログラミングの問題を解いていく企画サイトです。ここでは 1 日 2 問でクリスマスまでに 50 問の問題を解かなければなりません。とてもつらいです。

私は一度 LeetCode を挫折しており、あまり気乗りしませんでした。しかし、今回は私の愛用する Deno を使って問題を解くとかわいいステッカーをもらえるらしく、20 日分解くと elite level  で super limited edition  で special surprise  な Deno ステッカーをもらえる権利(抽選)が得られます(笑)。めちゃくちゃ欲しい!

皆様もぜひ参加してみてください。なんと1日分問題を解くだけでも確定でステッカーがもらえます。詳しくはこちらのリンクへどうぞ。

Solve Advent of Code 2024 with Deno and Win Prizes! | deno.com

私の解答例はこちらに公開していきます。aoc ではあまりにすぐ解答例を公開するのはダメなのですが、私が働いている時間に問題が公開されるのでその心配はないでしょう。

https://github.com/manybugsdev/aoc-2024-in-deno

試しに 1 問紹介

1 日目の問題を紹介します。このような文字列が入力として与えられます。本番はもっと長い文字列です。

3   4
4   3
2   5
1   3
3   9
3   3

左右に 2 つのリストがありますが、この 2 つのリストの差分(絶対値)を計算する問題です。互いのリストの数を小さいものから順に比較していくのです。

分かりやすいように左右のリストをソートします。

1   3
2   3
3   3
3   4
3   5
4   9

1 番目は |1-3|=2 となります。同様に 2 番目は |2-3|=1, 3 番目は|3-3|=0 とう感じで計算できます。

|1 -  3| = 2
|2 -  3| = 1
|3 -  3| = 0
|3 -  4| = 1
|3 -  5| = 2
|4 -  9| = 5

最終的に全ての答えを足し合わせて 2 + 1 + 0 + 1 + 2 + 5 = 11 を求めます。この最終的な解がパスワードのようなものになっており、aoc では計算結果のみ提出します。

結果の提出だけでよく、実行速度が関係ないというのがゆるくていいですね。使用するプログラミング言語もなんでもいいです。LLM に問題を打ち込んで結果をそのまま提出するのはダメですが、コードのヒントを得るために使用するのは構いません。

私はこのように素直に解きました。Deno は top-level await を使えます。typescript 使う場合でも面倒な設定がいらない所も最高です。array の method chaining す・こ 😘🫶

const input = await Deno.readTextFile("input.txt");
const lefts = input
  .trim()
  .split("\n")
  .map((s) => parseInt(s.split(/\s+/)[0]))
  .sort((a, b) => a - b);
const rights = input
  .trim()
  .split("\n")
  .map((s) => parseInt(s.split(/\s+/)[1]))
  .sort((a, b) => a - b);
const dist = lefts.reduce((a, left, i) => a + Math.abs(left - rights[i]), 0);
console.log(`dist: ${dist}`);