LoginSignup
0

posted at

updated at

Organization

Advent Of Code 2021 (Day 2: Dive!)をElixirで楽しむ

かくとだにえやはいぶきのさしも草さしも知らじなもゆる思ひを

Advent Calendar 2022 103日目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 2: Dive!Elixirで楽しんでみます。

スクリーンショット 2022-04-17 23.43.58.png

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

私の回答

私の回答です。

私の回答

inputはサンプルです。
ログインをすると、たくさんあるインプットデータがみえます。

Part 1

input = """
forward 5
down 5
forward 8
up 3
down 8
forward 2
"""

v = input
|> String.split
|> Enum.chunk_every(2)
|> Enum.reduce(%{}, fn [key, value], acc -> 
  Map.update(acc, key, String.to_integer(value), & &1 + String.to_integer(value))
end)

(v["down"] - v["up"]) * v["forward"]

Part 2

v = input
|> String.split
|> Enum.chunk_every(2)
|> Enum.map(fn [key, value] -> {key, String.to_integer(value)} end)
|> Enum.reduce(%{"forward" => 0, "aim" => 0, "depth" => 0}, fn
  {"forward", v}, acc -> Map.update(acc, "forward", v, & &1 + v) |> Map.update("depth", v * acc["aim"], & &1 + v * acc["aim"])
  {"down", v}, acc -> Map.update(acc, "aim", v, & &1 + v)
  {"up", v}, acc -> Map.update(acc, "aim", -v, & &1 - v)
end
)

v["forward"] * v["depth"]

It works!
Amazing!

お手本

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

お手本

Part 1

input
|> String.split("\n", trim: true)
|> Enum.reduce({_depth = 0, _position = 0}, fn
  "forward " <> number, {depth, position} ->
    {depth, String.to_integer(number) + position}
  "down " <> number, {depth, position} ->
    {String.to_integer(number) + depth, position}
  "up " <> number, {depth, position} ->
    {-String.to_integer(number) + depth, position}
end)
|> then(fn {depth, position} -> depth * position end)

Part 2

input
|> String.split("\n", trim: true)
|> Enum.reduce({_depth = 0, _position = 0, _aim = 0}, fn
  "forward " <> number, {depth, position, aim} ->
    number = String.to_integer(number)
    {depth + aim * number, number + position, aim}
  "down " <> number, {depth, position, aim} ->
    {depth, position, aim + String.to_integer(number)}
  "up " <> number, {depth, position, aim} ->
    {depth, position, aim - String.to_integer(number)}
end)
|> then(fn {depth, position, _aim} -> depth * position end)

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

Advent Of Code 2021 Day 2: Dive!Elixirで楽しんでみました。
Day 25まであるので引き続き楽しんでいきたいとおもいます。

It works!
Amazing!

自分で解いてみて、動画をみてJosé Valimさんに特別家庭教師をしてもらっている気に勝手になっています :sweat_smile:

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