$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{闘魂とは己に打ち克つこと、}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだとおもいます}$
はじめに
闘魂とElixirが出会いました。
闘魂 meets Elixir.です。
Elixir meets 闘魂.でもよいです。
2022-12-26より、アドベントカレンダー2023は開幕しました。
私のアドベントカレンダー一覧は、コチラです。
だれよりも2023/12/25を楽しみにしています。
この記事は、Advent of Code 2022のDay 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
だと、vJrwpWtwJgWr
とhcsFMMfFFhFp
です。
そして前半部分と後半部分で共通する文字をみつけます。
一行目は、p
です。
二行目以降も同じように処理していきます。
二行目はL
、三行目はP
、四行目はv
、五行目はt
、六行目はs
です。
a
は1点、b
は2点あとはアルファベットが一個進むごとに同じように点数があがりまして、z
が26点です。
大文字はA
が27点、B
が28点とつづきましてZ
が52点という寸法です。
上記インプット例では答えは、157
となります。
解答例
私はElixirで解いてみます。
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 ぁっダー!}$