3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

闘魂Elixir ── Advent of Code 2022 (Day 8: Treetop Tree House) Part TwoをElixirで楽しむ

Last updated at Posted at 2023-01-19

$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$

$\huge{闘魂とは己に打ち克つこと、}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだとおもいます}$

Run in Livebook

はじめに

闘魂Elixirが出会いました。
闘魂 meets Elixir.です。
Elixir meets 闘魂.でもよいです。

2022-12-26より、アドベントカレンダー2023は開幕しました。

私のアドベントカレンダー一覧は、コチラです。

だれよりも2023/12/25を楽しみにしています。

この記事は、Advent of Code 2022Day 8: Treetop Tree House Part Twoを解いてみます。

Advent of Code 2022は、競技プログラミングのような問題が25題出題されています。
毎年問題が出題されておりまして、日を追うごとに難しくなる傾向があるようにおもいます。

iex> "Elixir" |> String.graphemes() |> Enum.frequencies()
%{"E" => 1, "i" => 2, "l" => 1, "r" => 1, "x" => 1}

この記事は、もくもく会イベント 闘魂Elixir #12 の成果です。

Day 8: Treetop Tree House Part Two

問題文はこちらをご参照ください。

問題を説明します。
最初の設問をクリアすると、Part Twoを参照できるようになります。

上下左右に向かって自身の数値と同じになるか大きい数字が現れるまで個数を数えます。
それぞれの個数をかけ合わせます。
掛け算の結果が一番大きな数値を答えないというものです。
外側の数字は数えるものがない方向が存在するので無条件で0です。

スクリーンショット 2023-01-19 21.54.28.png

たとえば2行目中央の5の場合は、以下のようになります。

  • 左に行くと5とぶつかるので、1
  • 右に行くと、1,2とすすめるので、2
  • 上には3とすすめるので、1
  • 下には3, 5とすすめるので、2

これらをかけ合わせて4が答えとなります。

もうひとつ例をみてみましょう。

スクリーンショット 2023-01-19 21.58.12.png

4行目中央の5に注目します。

  • 左に行くと3, 3とすすめるので、2
  • 右に行くと、4, 9まですすめるので、2
  • 上には3、5まですすめるので、2
  • 下には3とすすめるので、

これらをかけ合わせて8が答えとなります。
このインプットの場合はこの点が一番大きな数字となり、8が答えとなります。

解答例

私はElixirで解いてみます。
Run in Livebook
Livebookをお使いの方は、上記のボタンを迷わず押すと、私の解答例をお試しいただけます!
解答例は閉じておきます。

解答例

input = """
30373
25512
65332
33549
35390
"""
input_with_index = input
  |> String.split("\n", trim: true)
  |> Enum.map(&String.to_charlist/1)

row_size = Enum.count(input_with_index)

[head | _] = input_with_index
column_size = Enum.count(head)

map = for i <- 0..(row_size - 1), j <- 0..(column_size - 1), into: %{} do
  height = input_with_index |> Enum.at(i) |> Enum.at(j)
  {{i, j}, height}
end

value = fn
  -1, _height, distance -> {:halt, distance}
  height, height, distance -> {:halt, distance + 1}
  other_height, height, distance when other_height > height -> {:halt, distance + 1}
  other_height, height, distance when other_height < height -> {:cont, distance + 1}
end

f_horizontal_distance = fn row, start, ending, height ->
  start..ending
  |> Enum.reduce_while(0, fn index, acc ->
    Map.get(map, {row, index}, -1)
    |> value.(height, acc)
  end)
end

f_vertical_distance = fn column, start, ending, height ->
  start..ending
  |> Enum.reduce_while(0, fn index, acc ->
    Map.get(map, {index, column}, -1)
    |> value.(height, acc)
  end)
end

for i <- 0..(row_size - 1),
    j <- 0..(column_size - 1),
    height = Map.fetch!(map, {i, j}),
    r = f_horizontal_distance.(i, j + 1, column_size, height),
    l = f_horizontal_distance.(i, j - 1, -1, height),
    t = f_vertical_distance.(j, i - 1, -1, height),
    d = f_vertical_distance.(j, i + 1, row_size, height) do
  r * l * t * d
end
|> IO.inspect()
|> Enum.max()

8 が得られます。

あなたの答えをお待ちしています。
編集リクエストかコメントでくださいませ。

読者投稿コーナー

読者の方からいただいたお便りをご紹介します。

読者投稿コーナー

まだありません。


さいごに

この記事では、Advent of Code 2022の「Advent of Code 2022Day 8: Treetop Tree House Part Two」をElixirで解いてみました。

闘魂とは、 「己に打ち克つこと、そして闘いを通じて己の魂を磨いていくことである」 との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。

$\huge{1、2、3 ぁっダァー!}$



$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{1、2、3 ぁっダァー!}$

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?