6
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 3 years have passed since last update.

闘魂Elixir ── Advent of Code 2022 (Day 1: Calorie Counting)をElixirで楽しむ

6
Last updated at Posted at 2022-12-26

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

はじめに

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

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

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

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

この記事は、Advent of Code 2022のDay 1: Calorie Countingを解いてみます。

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

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

Day 1: Calorie Counting

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

問題を説明します。

1000
2000
3000

4000

5000
6000

7000
8000
9000

10000

上記がインプット例です。
何もない空行のところが区切りで、連続する数字の和の最大のものを答えなさいという問題です。

連続する数字を足してみると、以下のようになります。

6000

4000

11000

24000

10000

上記インプット例の場合では最大は24000で、これが答えとなります。

英語をよく読むと、エルフだとかカロリーだとかいろいろ書いてありますが要はこの記事で書いた通りのことが問題文であります。

解答例

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

解答例

私

input = """
1000
2000
3000

4000

5000
6000

7000
8000
9000

10000
"""

f = fn 
  "" -> ""
  s -> String.to_integer(s)
end

sum = fn 
  [""] -> 0
  list -> Enum.sum(list)
end

input
|> String.split("\n")
|> Enum.map(f)
|> Enum.chunk_by(& &1 == "")
|> Enum.map(sum)
|> Enum.max()

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

読者投稿コーナー

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

お便り

@mnishiguchi さん

@mnishiguchi さんからお便りをいただきました。ありがとうございます!
ポイントは、\n\nでスプリットしているところです。

input
|> String.split("\n\n", trim: true)
|> Enum.map(fn numbers_str ->
  numbers_str
  |> String.split(~r/\d+\b/, include_captures: true, trim: true)
  |> Enum.filter(&(&1 =~ ~r/\d+/))
  |> Enum.map(&String.to_integer/1)
  |> Enum.sum()
end)
|> Enum.max()

@zacky1972 先生

コメント欄に解答を投稿してくださっています。
先生お得意の並列処理での解法です。


さいごに

本日2022-12-26より、アドベントカレンダー2023は開幕しました。
この記事では、Advent of Code 2022の「Day 1: Calorie Counting」をElixirで解いてみました。

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

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



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

6
0
20

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
6
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?