Skip to content

Instantly share code, notes, and snippets.

@jstewart
Last active December 2, 2022 14:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jstewart/c9ebaff085a977c4dce71c71fca78963 to your computer and use it in GitHub Desktop.
Save jstewart/c9ebaff085a977c4dce71c71fca78963 to your computer and use it in GitHub Desktop.
Advent Of Code 2022 Day 2
defmodule AdventOfCode.Day02 do
@scores %{"A" => 1, "B" => 2, "C" => 3, "X" => 1, "Y" => 2, "Z" => 3}
@score_table [
[3, 6, 0],
[0, 3, 6],
[6, 0, 3]
]
def part1(args) do
args
|> to_scores(:simple)
|> tally()
end
def part2(args) do
args
|> to_scores(:intelligent)
|> tally()
end
defp to_scores(input, strategy) do
input
|> Enum.map(&String.split/1)
|> Enum.map(fn moves -> scoring(moves, strategy) end)
end
defp turn_score(you, opponent) do
@score_table
|> Enum.at(opponent)
|> Enum.at(you)
end
defp scoring([opponent, you], :simple) do
%{
opponent: opponent,
you: you,
pick_score: @scores[you],
turn_score: turn_score(@scores[you] - 1, @scores[opponent] - 1)
}
end
defp scoring([opponent, you], :intelligent) do
new_move = choose_move(opponent, you)
scoring([opponent, new_move], :simple)
end
# Win
defp choose_move("A", "Z"), do: "Y"
defp choose_move("B", "Z"), do: "Z"
defp choose_move("C", "Z"), do: "X"
# Lose
defp choose_move("A", "X"), do: "Z"
defp choose_move("B", "X"), do: "X"
defp choose_move("C", "X"), do: "Y"
# Draw
defp choose_move("A", "Y"), do: "X"
defp choose_move("B", "Y"), do: "Y"
defp choose_move("C", "Y"), do: "Z"
defp tally(scores) do
scores
|> Enum.reduce(0, fn score, acc ->
acc + score.pick_score + score.turn_score
end)
end
end
# input:
input = AdventOfCode.Input.get!(2)
|> String.split("\n", trim: true)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment