3
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 4: Camp Cleanup)をElixirで楽しむ

3
Last updated at Posted at 2022-12-30

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

$\huge{闘魂とは己に打ち克つこと、}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだとおもいます}$

Run in Livebook

はじめに

闘魂と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で解いてみます。
Run in Livebook
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 ぁっダー!}$

3
0
5

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