3
0

More than 1 year has passed since last update.

闘魂Elixir ── Advent of Code 2022 (Day 2: Rock Paper Scissors)をElixirで楽しむ

Last updated at Posted at 2022-12-28

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

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

はじめに

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

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

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

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

この記事は、Advent of Code 2022Day 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で解いてみます。
Run in Livebook
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 ぁっダー!}$

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