$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{闘魂とは己に打ち克つこと。}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだと思います}$
はじめに
@torifukukaiou さんの パク リスペクト記事です
Elixir Livebook で Advent of Code 2023 の問題を解いてみます
実装したノートブックはこちら
問題はこちら
セットアップ
Kino AOC をインストールします
Mix.install([
{:kino_aoc, "~> 0.1.5"}
])
Kino AOC の使い方はこちらを参照
入力の取得
Day 6 の入力を取得します
私の答え
私の答えです。
折りたたんでおきます。
▶を押して開いてください。
details
回答用のモジュールです
入力を扱いやすい形にするための parse
と、回答を作るための resolve
関数を持っています
defmodule Resolver do
def parse(input) do
input
|> String.split("\n")
|> Enum.map(fn line ->
line
|> String.split(" ", trim: true)
|> tl()
|> Enum.map(&String.to_integer(&1))
end)
|> Enum.zip()
|> Enum.map(fn {time, distance} ->
%{
time: time,
distance: distance
}
end)
end
def resolve(races) do
races
|> Enum.map(fn %{time: time, distance: distance} ->
1..(time - 1)
|> Enum.count(fn boost ->
(time - boost) * boost > distance
end)
end)
|> Enum.product()
end
end
入力を以下のようにパースします
入力
Time: 7 15 30
Distance: 9 40 200
パース結果
[%{time: 7, distance: 9}, %{time: 15, distance: 40}, %{time: 30, distance: 200}]
0 秒のとき = 全くボタンを押さないときと時間いっぱいまでボタンを押しているときは考慮する必要がないので、 1
から time - 1
の範囲で移動距離を計算し、 distance を超える数を取得しています
まとめ
Part 1 は非常にシンプルでした
おそらく Part 2 からが本番ですね
Part 2 はこちら