70 lines
1.3 KiB
Ruby
70 lines
1.3 KiB
Ruby
|
#!/usr/bin/env ruby
|
||
|
|
||
|
require_relative '../common'
|
||
|
|
||
|
class Day02 < Day
|
||
|
WIN = 6
|
||
|
DRAW = 3
|
||
|
LOSE = 0
|
||
|
|
||
|
class MovePart1
|
||
|
def self.game
|
||
|
{
|
||
|
"X" => new("A", "C", 1),
|
||
|
"Y" => new("B", "A", 2),
|
||
|
"Z" => new("C", "B", 3)
|
||
|
}
|
||
|
end
|
||
|
|
||
|
def self.score(input)
|
||
|
game[input[2]].score(input[0])
|
||
|
end
|
||
|
|
||
|
def initialize(opponent_letter, beat_letter, score)
|
||
|
@opponent_letter = opponent_letter
|
||
|
@beat_letter = beat_letter
|
||
|
@score = score
|
||
|
end
|
||
|
|
||
|
def score(played_letter)
|
||
|
match_result = if @opponent_letter == played_letter
|
||
|
Day02::DRAW
|
||
|
elsif played_letter == @beat_letter
|
||
|
Day02::WIN
|
||
|
else
|
||
|
Day02::LOSE
|
||
|
end
|
||
|
|
||
|
match_result + @score
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class MovePart2
|
||
|
SCORES = {
|
||
|
"A" => 1,
|
||
|
"B" => 2,
|
||
|
"C" => 3
|
||
|
}
|
||
|
|
||
|
def self.score(input)
|
||
|
if input[2] == "X"
|
||
|
Day02::LOSE + SCORES[SCORES.keys[SCORES.keys.index(input[0]) - 1]]
|
||
|
elsif input[2] == "Y"
|
||
|
Day02::DRAW + SCORES[input[0]]
|
||
|
else
|
||
|
Day02::WIN + SCORES[SCORES.keys[(SCORES.keys.index(input[0]) + 1) % SCORES.keys.size]]
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def part1
|
||
|
stdin.map { |i| MovePart1.score i }.sum
|
||
|
end
|
||
|
|
||
|
def part2
|
||
|
stdin.map { |i| MovePart2.score i }.sum
|
||
|
end
|
||
|
end
|
||
|
|
||
|
Day02.run
|