LoginSignup
0

posted at

updated at

Organization

Advent Of Code 2021 (Day 5: Hydrothermal Venture)をElixirで楽しむ

忘れじの行く末まではかたければ今日を限りの命ともがな

Advent Calendar 2022 106日目1の記事です。
I'm looking forward to 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
私のAdvent Calendar 2022 一覧


はじめに

この記事は、Advent Of Code 2021 Day 5: Hydrothermal VentureElixirで楽しんでみます。

スクリーンショット 2022-04-22 23.09.14.png

私はGitHubでログインしました。

私の回答

私の回答です。

私の回答
input = """
0,9 -> 5,9
8,0 -> 0,8
9,4 -> 3,4
2,2 -> 2,1
7,0 -> 7,4
6,4 -> 2,0
0,9 -> 2,9
3,4 -> 1,4
0,0 -> 8,8
5,5 -> 8,2
"""

Part 1

String.split(input, "\n", trim: true)
|> Enum.map(& String.split(&1, " -> "))
|> Enum.map(fn [s, e] -> {String.split(s, ","), String.split(e, ",")} end)
|> Enum.map(fn {[x1, y1], [x2, y2]} -> {{String.to_integer(x1), String.to_integer(y1)}, {String.to_integer(x2), String.to_integer(y2)}} end)
|> Enum.filter(fn {{x1, y1}, {x2, y2}} -> x1 == x2 or y1 == y2 end)
|> Enum.flat_map(fn
  {{x1, y1}, {x1, y2}} -> Enum.map(y1..y2, & {x1, &1}) 
  {{x1, y1}, {x2, y1}} -> Enum.map(x1..x2, & {&1, y1})
end)
|> Enum.reduce(%{}, fn coordinate, acc ->
  Map.update(acc, coordinate, 1, & &1 + 1)
end)
|> Enum.filter(fn {_, cnt} -> cnt > 1 end)
|> Enum.count()

Part 2

String.split(input, "\n", trim: true)
|> Enum.map(& String.split(&1, " -> "))
|> Enum.map(fn [s, e] -> {String.split(s, ","), String.split(e, ",")} end)
|> Enum.map(fn {[x1, y1], [x2, y2]} -> {{String.to_integer(x1), String.to_integer(y1)}, {String.to_integer(x2), String.to_integer(y2)}} end)
|> Enum.filter(fn {{x1, y1}, {x2, y2}} -> x1 == x2 or y1 == y2 or (abs(x1 - x2) == abs(y1 - y2)) end)
|> Enum.flat_map(fn
  {{x1, y1}, {x1, y2}} -> Enum.map(y1..y2, & {x1, &1}) 
  {{x1, y1}, {x2, y1}} -> Enum.map(x1..x2, & {&1, y1})
  {{x1, y1}, {x2, y2}} -> Enum.zip(x1..x2, y1..y2)
end)
|> Enum.reduce(%{}, fn coordinate, acc ->
  Map.update(acc, coordinate, 1, & &1 + 1)
end)
|> Enum.filter(fn {_, cnt} -> cnt > 1 end)
|> Enum.count()

It works!
Amazing!

私の回答は、正解を得ることができていますがなんとなくイケていない感が満載です。
メモリ使いすぎかも。
後述するJosé Valimさんのお手本はとても勉強になります。
お見逃し無く!

お手本

José ValimさんがLivebook楽しまれている動画があります。
José Valimさんは、Elixirの作者です!

いきなり正解を書くわけではなく、少しずつ試しながら作っていって、リファクタしていくさまがJosé Valimさんの息遣いでみれるのでとても参考になります。
私は英語をよく聞き取れてはいませんが、コードが進化していくさまをみるのはとても勉強になります。

お手本

まだ見ていないのです :sweat_smile:


Wrapping up :lgtm::lgtm::lgtm::lgtm::lgtm:

Advent Of Code 2021 Day 5: Hydrothermal Ventureを[Elixirで楽しんでみました。
Day 25まであるので引き続き楽しんでいきたいとおもいます。
メモリ使いすぎ感はありますが、 Day 5: Hydrothermal Ventureはスッキリ解けました。:sweat_smile:

It works!
Amazing!

自分で解いてみて、なんだかイマイチだなあとおもいながら、動画をみることでJosé Valimさんに特別家庭教師をしてもらっている気に勝手になっています :sweat_smile:
海綿が水を吸うように、Elixirのイケている書き方を吸収しています。
伸びしろしかありません。

Enjoy Elixir:bangbang::bangbang::bangbang:
$\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!


  1. @kaizen_nagoya さんの「「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 1日目 Most Breakthrough Generator」から着想を得て、模倣いたしました。

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
What you can do with signing up
0