$\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で解いてみます。
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 ぁっダー!}$