はじめに
Advent of code 2024 の準備として、過去回の Advent of code 2015 を Livebook で楽しみます
本記事では Day 4 の Part 1 と Part 2 を解きます
Day 3 までは Part 1 と Part 2 を分けていましたが、 Day 4 はあまりにも Part 1 と Part 2 に違いがないので一つの記事にしました
問題文はこちら
実装したノートブックはこちら
セットアップ
Kino AOC をインストールします
Mix.install([
{:kino_aoc, "~> 0.1"}
])
Kino AOC の使い方はこちらを参照
入力の取得
"Advent of Code Helper" スマートセルを追加し、 Day 4 の入力を取得します
私の答え
私の答えです。
折りたたんでおきます。
▶を押して開いてください。
Part 1
回答
:crypto.hash(:md5, input)
で input
の MD5 ハッシュがバイナリで取得されます
"Hexadecimal" と指定されているように、 Base.encode16
で文字列にエンコードします
"#{puzzle_input}#{index}"
として index
を 0 から 10000000 の範囲で探索します
Enum.find
を使うことで、最初に該当した数字 = 最小値が取得できます
Enum.find(0..10000000, fn index ->
hash_head =
:crypto.hash(:md5, "#{puzzle_input}#{index}")
|> Base.encode16()
|> String.slice(0..4)
hash_head == "00000"
end)
Part 2
回答
Part 1 の桁数を変えただけです
Enum.find(0..10000000, fn index ->
hash_head =
:crypto.hash(:md5, "#{puzzle_input}#{index}")
|> Base.encode16()
|> String.slice(0..5)
hash_head == "000000"
end)
まとめ
問題文から ChatGPT に画像を生成してもらいました
0 から順に探索するだけなので工夫も何もないですね
Part 2 も単なる桁数違いだったので、かなり拍子抜けしました