ありま山ゐなの笹原風吹けばいでそよ人を忘れやはする
Advent Calendar 2022 110日目1の記事です。
I'm looking forward to 12/25,2022
私のAdvent Calendar 2022 一覧。
はじめに
この記事は、Advent Of Code 2021 Day 9: Smoke BasinをElixirで楽しんでみます。
私はGitHubでログインしました。
私の回答
私の回答です。
私の回答
input = """
2199943210
3987894921
9856789892
8767896789
9899965678
"""
Part 1
for i <- 0..(rows - 1),
j <- 0..(columns - 1),
value = Map.get(parsed, i, %{}) |> Map.get(j, ?9),
up = Map.get(parsed, i - 1, %{}) |> Map.get(j, ?9),
down = Map.get(parsed, i + 1, %{}) |> Map.get(j, ?9),
left = Map.get(parsed, i, %{}) |> Map.get(j - 1, ?9),
right = Map.get(parsed, i, %{}) |> Map.get(j + 1, ?9),
value < up,
value < down,
value < left,
value < right do
value
end
|> Enum.reduce(0, fn value, acc -> value - ?0 + 1 + acc end)
|> IO.inspect()
Part 2
parsed =
input
|> String.split("\n", trim: true)
|> Enum.with_index(fn element, index ->
{index,
element
|> String.to_charlist()
|> Enum.with_index(fn element, index -> {index, element} end)
|> Map.new()}
end)
|> Map.new()
|> IO.inspect()
defmodule Recursion do
def recur({i, j}, map) do
recur([{i, j}], map, MapSet.new())
end
defp recur([], _map, map_set), do: map_set
defp recur([{i, j} = head | tail], map, map_set) do
value = Map.get(map, i) |> Map.get(j)
up = Map.get(map, i - 1, %{}) |> Map.get(j, 100)
down = Map.get(map, i + 1, %{}) |> Map.get(j, 100)
left = Map.get(map, i, %{}) |> Map.get(j - 1, 100)
right = Map.get(map, i, %{}) |> Map.get(j + 1, 100)
map_set = if value != ?9, do: MapSet.put(map_set, head), else: map_set
tail
|> do_search(value, up, {i - 1, j}, map_set)
|> do_search(value, down, {i + 1, j}, map_set)
|> do_search(value, left, {i, j - 1}, map_set)
|> do_search(value, right, {i, j + 1}, map_set)
|> recur(map, map_set)
end
defp do_search(list, ?9, ?9, _tuple, _map_set), do: list
defp do_search(list, ?9, _v2, _tuple, _map_set), do: list
defp do_search(list, _v1, ?9, _tuple, _map_set), do: list
defp do_search(list, _v1, 100, _tuple, _map_set), do: list
defp do_search(list, v1, v2, tuple, map_set) do
if tuple in map_set do
list
else
[tuple | list]
end
end
end
rows = Enum.count(parsed)
%{0 => map} = parsed
columns = Enum.count(map)
for i <- 0..(rows - 1), j <- 0..(columns - 1), uniq: true do
Recursion.recur({i, j}, parsed)
end
|> Enum.sort_by(&Enum.count/1, :desc)
|> IO.inspect()
|> Enum.take(3)
|> Enum.map(&Enum.count/1)
|> Enum.product()
|> IO.inspect()
It works!
Amazing!
解けてはいますがお手本と比べると長いし、なんだかいろいろイマイチです
お手本
Day 9のお手本(José Valimさんの動画)があります
お手本
input = """
2199943210
3987894921
9856789892
8767896789
9899965678
"""
Part 1
grid =
for {line, row} <- Enum.with_index(input |> String.split("\n", trim: true)),
{number, col} <- Enum.with_index(line |> String.to_charlist()),
into: %{} do
{{row, col}, number - ?0}
end
low_points =
grid
|> Enum.filter(fn {{row, col}, number} ->
up = grid[{row - 1, col}]
down = grid[{row + 1, col}]
left = grid[{row, col - 1}]
right = grid[{row, col + 1}]
number < up and number < down and number < left and number < right
end)
low_points
|> Enum.map(fn {_point, number} -> number + 1 end)
|> Enum.sum()
|> IO.inspect()
Part 2
defmodule Recursion do
def basin(point, grid) do
basin(MapSet.new(), point, grid)
end
defp basin(seen, {row, col} = point, grid) do
if point in seen or grid[point] in [9, nil] do
seen
else
seen
|> MapSet.put(point)
|> basin({row - 1, col}, grid)
|> basin({row + 1, col}, grid)
|> basin({row, col - 1}, grid)
|> basin({row, col + 1}, grid)
end
end
end
low_points
|> Enum.map(fn {point, _} -> Recursion.basin(point, grid) |> MapSet.size() end)
|> Enum.sort(:desc)
|> Enum.take(3)
|> Enum.product()
|> IO.inspect()
美しい! 短い!
- for/1の使い方がうまい!
- アトムは数値よりも大小比較で必ずアトムのほうが大きくなることを巧みに利用して、範囲外の値と比較をしている
number < atom < reference < function < port < pid < tuple < map < list < bitstring
Wrapping up
Advent Of Code 2021 Day 9: Smoke BasinをElixirで楽しんでみました。
Day 25まであるので引き続き楽しんでいきたいとおもいます。
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!