$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{闘魂とは己に打ち克つこと、}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだとおもいます}$
はじめに
闘魂とElixirが出会いました。
闘魂 meets Elixir.です。
Elixir meets 闘魂.でもよいです。
2022-12-26より、アドベントカレンダー2023は開幕しました。
私のアドベントカレンダー一覧は、コチラです。
だれよりも2023/12/25を楽しみにしています。
この記事は、Advent of Code 2022のDay 4: Camp Cleanupを解いてみます。
Advent of Code 2022は、競技プログラミングのような問題が25題出題されています。
毎年問題が出題されておりまして、日を追うごとに難しくなる傾向があるようにおもいます。
iex> "Elixir" |> String.graphemes() |> Enum.frequencies()
%{"E" => 1, "i" => 2, "l" => 1, "r" => 1, "x" => 1}
Day 4: Camp Cleanup
問題文はこちらをご参照ください。
問題を説明します。
2-4,6-8
2-3,4-5
5-7,7-9
2-8,3-7
6-6,4-6
2-6,4-8
各行は,で区切られています。
-は前後で数字が並んでいます。
たとえば一行目は2-4,6-8ですので、2,3,4と6,7,8とみるわけです。
今回は、2つの数字列がどちらかに完全に含まれている行が何行あるかを数えなさいという問題です。
一行ずつ調べてみます。
- 一行目は
2-4,6-8:2,3,4と6,7,8-> No - 二行目は
2-3,4-5:2,3と4,5-> No - 三行目は
5-7,7-9:5,6,7と7,8,9-> No - 四行目は
2-8,3-7:2,3,4,5,6,7,8と3,4,5,6,7-> Yes - 五行目は
6-6,4-6:6と4,5,6-> Yes - 六行目は
2-6,4-8:2,3,4,5,6と4,5,6,7,8-> No
上記インプット例では答えは、2となります。
インプットの数字は2桁の数字が使われることがあります。
例: 10-50,0-99 -> Yesです。
解答例
私はElixirで解いてみます。
Livebookをお使いの方は、上記のボタンを迷わず押すと、私の解答例をお試しいただけます!
解答例は閉じておきます。
解答例
私
input = """
2-4,6-8
2-3,4-5
5-7,7-9
2-8,3-7
6-6,4-6
2-6,4-8
"""
f = fn lines, delimiter, func ->
lines
|> Enum.map(fn s ->
s
|> String.split(delimiter)
|> func.()
end)
end
input
|> String.split("\n", trim: true)
|> f.(",", fn lines ->
f.(lines, "-", fn [a, b] ->
Range.new(String.to_integer(a), String.to_integer(b))
end)
end)
|> Enum.filter(fn [r1, r2] ->
if Range.size(r1) < Range.size(r2) do
Enum.all?(r1, & &1 in r2)
else
Enum.all?(r2, & &1 in r1)
end
end)
|> Enum.count()
2が得られます。
あなたの答えをお待ちしています。
編集リクエストかコメントでくださいませ。
読者投稿コーナー
読者の方からいただいたお便りをご紹介します。
読者投稿コーナー
@mnishiguchi san
ガード節が巧みです。
匠の技です。
また私の解答ではRangeを使っていますが、大小比較さえできればよいので、@mnishiguchi さんの解答のほうが余計なものを作らない点で優れているようにおもいます。
投稿(とうこん 闘魂)ありがとうーーーーッ! ございます。
parse_row = fn row ->
row |> String.split(["-", ","]) |> Enum.map(& String.to_integer/1)
end
judge = fn
[a1, a2, b1, b2] when a1 in b1..b2 and a2 in b1..b2 -> true
[a1, a2, b1, b2] when b1 in a1..a2 and b2 in a1..a2 -> true
[_, _, _, _] -> false
end
input
|> String.split("\n", trim: true)
|> Enum.reduce(0, fn row, acc ->
if row |> parse_row.() |> judge.() do
acc + 1
else
acc
end
end)
さいごに
この記事では、Advent of Code 2022の「Advent of Code 2022のDay 4: Camp Cleanup」をElixirで解いてみました。
闘魂とは、 「己に打ち克つこと、そして闘いを通じて己の魂を磨いていくことである」 との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。
$\huge{1、2、3 ぁっダー!}$
$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{1、2、3 ぁっダー!}$