3
0

More than 1 year has passed since last update.

闘魂Elixir ── Advent of Code 2022 (Day 3: Rucksack Reorganization)をElixirで楽しむ

Last updated at Posted at 2022-12-29

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

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

Run in Livebook

はじめに

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

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

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

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

この記事は、Advent of Code 2022Day 3: Rucksack Reorganizationを解いてみます。

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

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

Day 3: Rucksack Reorganization

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

問題を説明します。

vJrwpWtwJgWrhcsFMMfFFhFp
jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
PmmdzqPrVvPwwTWBwg
wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
ttgJtRGJQctTZtZT
CrZsJsPPZsGzwwsLwLmpwMDw

各行の文字列を半分にちょん切ります。
一行目のvJrwpWtwJgWrhcsFMMfFFhFpだと、vJrwpWtwJgWrhcsFMMfFFhFpです。
そして前半部分と後半部分で共通する文字をみつけます。
一行目は、pです。
二行目以降も同じように処理していきます。
二行目はL、三行目はP、四行目はv、五行目はt、六行目はsです。

aは1点、bは2点あとはアルファベットが一個進むごとに同じように点数があがりまして、zが26点です。
大文字はAが27点、Bが28点とつづきましてZが52点という寸法です。

上記インプット例では答えは、157となります。

解答例

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

解答例

input = """
vJrwpWtwJgWrhcsFMMfFFhFp
jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
PmmdzqPrVvPwwTWBwg
wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
ttgJtRGJQctTZtZT
CrZsJsPPZsGzwwsLwLmpwMDw
"""

f = fn line, range ->
  String.slice(line, range)
  |> String.to_charlist()
  |> MapSet.new()
end

scores = ?a..?z |> Enum.zip(1..26) |> Kernel.++(Enum.zip(?A..?Z, 27..52)) |> Map.new()

input
|> String.split("\n", trim: true)
|> Enum.map(fn line ->
  len = String.length(line)

  f.(line, 0..(div(len, 2) - 1))
  |> MapSet.intersection(f.(line, div(len, 2)..-1))
  |> Enum.at(0)
  |> then(&Map.fetch!(scores, &1))
end)
|> Enum.sum()

157が得られます。

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

読者投稿コーナー

読者投稿コーナー

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

@mnishiguchi さん

forの使い方が巧みです。匠です。
パターンマッチも秀逸です。匠の技です。

score = fn
  x when x in ?a..?z -> x - 96
  x when x in ?A..?Z -> x - 38
end

for row <- String.split(input, "\n", trim: true), reduce: 0 do
  sum ->
    {a, b} = String.split_at(row, div(String.length(row), 2))

    [intersection] =
      MapSet.intersection(MapSet.new(to_charlist(a)), MapSet.new(to_charlist(b)))
      |> MapSet.to_list()

    sum + score.(intersection)
end

さいごに

この記事では、Advent of Code 2022の「Day 3: Rucksack Reorganization」をElixirで解いてみました。

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

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



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

3
0
1

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