滝の音は絶えて久しくなりぬれど名こそ流れてなほ聞こえけれ
Advent Calendar 2022 107日目1の記事です。
I'm looking forward to 12/25,2022
私のAdvent Calendar 2022 一覧。
はじめに
この記事は、Advent Of Code 2021 Day 6: LanternfishをElixirで楽しんでみます。
私はGitHubでログインしました。
私の回答
私の回答です。
今回は割とすんなり解けた気がします。
問題の意味がわかるまで英文と格闘していました。
私の回答
input = "3,4,3,1,2"
Part 1
internal_timers =
input
|> String.split(",", trim: true)
|> Enum.map(&String.to_integer/1)
|> Enum.reduce(%{}, fn internal_timer, acc ->
Map.update(acc, internal_timer, 1, & &1 + 1)
end)
defmodule Recursion do
def recur(internal_timers, 0), do: internal_timers
def recur(internal_timers, day) do
internal_timers
|> Enum.reduce(%{}, fn
{0, value}, acc -> {0, value}, acc -> Map.merge(acc, %{6 => value, 8 => value}, fn _k, v1, v2 -> v1 + v2 end)
{internal_timer, value}, acc -> Map.update(acc, internal_timer - 1, value, & &1 + value)
end)
|> recur(day - 1)
end
end
Recursion.recur(internal_timers, 80)
|> Map.values()
|> Enum.sum()
Part 2
internal_timers =
input
|> String.split(",", trim: true)
|> Enum.map(&String.to_integer/1)
|> Enum.reduce(%{}, fn internal_timer, acc ->
Map.update(acc, internal_timer, 1, & &1 + 1)
end)
defmodule Recursion do
def recur(internal_timers, 0), do: internal_timers
def recur(internal_timers, day) do
internal_timers
|> Enum.reduce(%{}, fn
{0, value}, acc -> {0, value}, acc -> Map.merge(acc, %{6 => value, 8 => value}, fn _k, v1, v2 -> v1 + v2 end)
{internal_timer, value}, acc -> Map.update(acc, internal_timer - 1, value, & &1 + value)
end)
|> recur(day - 1)
end
end
Recursion.recur(internal_timers, 256)
|> Map.values()
|> Enum.sum()
Mapを使ったのが吉でした。
当初Listを使っていたところ、ものすごく処理時間がかかっていました。
メモリもたくさんつかっていたようです。
It works!
Amazing!
後述するJosé Valimさんのお手本はとても勉強になります。
お見逃し無く!
お手本
José ValimさんがLivebook楽しまれている動画があります。
José Valimさんは、Elixirの作者です!
いきなり正解を書くわけではなく、少しずつ試しながら作っていって、リファクタしていくさまがJosé Valimさんの息遣いでみれるのでとても参考になります。
私は英語をよく聞き取れてはいませんが、コードが進化していくさまをみるのはとても勉強になります。
お手本
Part 1
input = "3,4,3,1,2"
fishes = input |> String.split(",") |> Enum.map(&String.to_integer/1)
defmodule Recursion do
def recur(fishes) do
recur(fishes, [])
end
defp recur([0 | fishes], children), do: [6 | recur(fishes, [8 | children])]
defp recur([fish | fishes], children), do: [fish - 1 | recur(fishes, children)]
defp recur([], children), do: Enum.reverse(children)
end
1..80
|> Enum.reduce(fishes, fn _, fishes -> Recursion.recur(fishes) end)
|> length()
Part 2
input = "3,4,3,1,2"
fishes = input |> String.split(",") |> Enum.map(&String.to_integer/1)
defmodule Recursion2 do
def recur({day0, day1, day2, day3, day4, day5, day6, day7, day8}) do
{day1, day2, day3, day4, day5, day6, day7 + day0, day8, day0}
end
end
frequencies = Enum.frequencies(fishes) |> IO.inspect()
amounts = Enum.map(0..8, fn i -> frequencies[i] || 0 end) |> List.to_tuple()
1..256
|> Enum.reduce(amounts, fn _, amounts -> Recursion2.recur(amounts) end)
|> Tuple.sum()
お手本は感動です!!!
しびれます!
@kts_h さんがRubyでの実装をしてくださいました!
Wrapping up
Advent Of Code 2021 Day 6: LanternfishをElixirで楽しんでみました。
Day 25まであるので引き続き楽しんでいきたいとおもいます。
私にとっては、Day 3、Day 4の方が難しかった印象です。
It works!
Amazing!
自分で解いてみて、なんだかイマイチだなあとおもいながら、動画をみることでJosé Valimさんに特別家庭教師をしてもらっている気に勝手になっています 。
海綿が水を吸うように、Elixirのイケている書き方を吸収しています。
伸びしろしかありません。
Enjoy Elixir
$\huge{Enjoy\ Elixir🚀}$
以上です。
I organize autoracex.
And I take part in NervesJP, fukuoka.ex, EDI, tokyo.ex, Pelemay.
I hope someday you'll join us.
We Are The Alchemists, my friends!
We appreciate this shoutout, Torifuku! pic.twitter.com/dThmJg4CYN
— ClickUp (@clickup) April 11, 2022