$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{闘魂とは己に打ち克つこと、}$
$\huge{そして闘いを通じて己の魂を磨いていく}$
$\huge{ことだとおもいます}$
はじめに
闘魂とElixirが出会いました。
闘魂 meets Elixir.です。
Elixir meets 闘魂.でもよいです。
2022-12-26より、アドベントカレンダー2023は開幕しました。
私のアドベントカレンダー一覧は、コチラです。
だれよりも2023/12/25を楽しみにしています。
この記事は、Advent of Code 2022のDay 2: Rock Paper Scissorsを解いてみます。
Advent of Code 2022は、競技プログラミングのような問題が25題出題されています。
毎年問題が出題されておりまして、日を追うごとに難しくなる傾向があるようにおもいます。
iex> "Elixir" |> String.graphemes() |> Enum.frequencies()
%{"E" => 1, "i" => 2, "l" => 1, "r" => 1, "x" => 1}
Day 2: Rock Paper Scissors
問題文はこちらをご参照ください。
問題を説明します。
A Y
B X
C Z
じゃんけんです。
上記がインプット例です。
左の列が相手の手、右の列が自分の手です。
A = グー、B = パー、C = チョキ
X = グー、Y= パー、Z = チョキ
です。
グー パー
パー グー
チョキ チョキ
自分(右列)の出した手による点数と勝敗による点数の2種類があります。
- グー: 1点、パー: 2点、チョキ: 3点
- 負け: 0点、引き分け: 3点、勝ち: 6点
ですから、
- 1行目(相手がグー、自分はパー)では、
2 + 6 = 8
点 - 2行目(相手がパー、自分はグー)では、
1 + 0 = 1
点 - 3行目(相手がチョキ、自分はチョキ)では、
3 + 3 = 6
点
合計15点が答えというものです。
解答例
私はElixirで解いてみます。
Livebookをお使いの方は、上記のボタンを迷わず押すと、私の解答例をお試しいただけます!
解答例は閉じておきます。
のちほど紹介する @mnishiguchi さんの解答が秀逸です!
解答例
私
input = """
A Y
B X
C Z
"""
f = fn
{:Rock, :Rock} -> 1 + 3
{:Rock, :Paper} -> 2 + 6
{:Rock, :Scissors} -> 3 + 0
{:Paper, :Rock} -> 1 + 0
{:Paper, :Paper} -> 2 + 3
{:Paper, :Scissors} -> 3 + 6
{:Scissors, :Rock} -> 1 + 6
{:Scissors, :Paper} -> 2 + 0
{:Scissors, :Scissors} -> 3 + 3
end
map_opponent = %{"A" => :Rock, "B" => :Paper, "C" => :Scissors}
map_me = %{"X" => :Rock, "Y" => :Paper, "Z" => :Scissors}
input
|> String.split("\n", trim: true)
|> Enum.map(&String.split(&1, " "))
|> Enum.map(fn [opponent, me] ->
f.({map_opponent[opponent], map_me[me]})
end)
|> Enum.sum()
15が得られます。
あなたの答えをお待ちしています。
編集リクエストかコメントでくださいませ。
読者投稿コーナー
読者投稿コーナー
読者の方からいただいたお便りをご紹介します。
@mnishiguchi さんより
forとMapの組み立て方が匠の技です。
巧みです。
hands = %{
?A => :rock,
?B => :paper,
?C => :scissors,
?X => :rock,
?Y => :paper,
?Z => :scissors
}
scores = %{
win: 6,
draw: 3,
lose: 0,
rock: 1,
paper: 2,
scissors: 3
}
judge = %{
{:rock, :scissors} => scores.lose + scores.scissors,
{:rock, :rock} => scores.draw + scores.rock,
{:rock, :paper} => scores.win + scores.paper,
{:paper, :rock} => scores.lose + scores.rock,
{:paper, :paper} => scores.draw + scores.paper,
{:paper, :scissors} => scores.win + scores.scissors,
{:scissors, :paper} => scores.lose + scores.paper,
{:scissors, :scissors} => scores.draw + scores.scissors,
{:scissors, :rock} => scores.win + scores.rock
}
for <<player1, " ", player2, "\n" <- input >>, reduce: 0 do
acc -> acc + judge[{hands[player1], hands[player2]}]
end
さいごに
この記事では、Advent of Code 2022の「Day 2: Rock Paper Scissors」をElixirで解いてみました。
闘魂とは、 「己に打ち克つこと、そして闘いを通じて己の魂を磨いていくことである」 との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。
$\huge{1、2、3 ぁっダー!}$
$\huge{元氣ですかーーーーッ!!!}$
$\huge{元氣があればなんでもできる!}$
$\huge{1、2、3 ぁっダー!}$