-
Notifications
You must be signed in to change notification settings - Fork 0
/
aoc02.py
141 lines (123 loc) · 3.54 KB
/
aoc02.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
########################################################################
# Advent of Code 2022 - solver
#
# Copyright (C) 2022 Antonio Ceballos Roa
########################################################################
def parse_input(input_str):
parsed_input = input_str.strip().split('\n')
return parsed_input
########################################################################
# Algorithms
########################################################################
OPP_ROCK = 'A'
OPP_PAPER = 'B'
OPP_SCISSORS = 'C'
MY_ROCK = 'X'
MY_PAPER = 'Y'
MY_SCISSORS = 'Z'
MY_LOSS = 'X'
MY_DRAW = 'Y'
MY_WIN = 'Z'
SHAPE = {
OPP_ROCK: 1,
OPP_PAPER: 2,
OPP_SCISSORS: 3,
MY_ROCK: 1,
MY_PAPER: 2,
MY_SCISSORS: 3,
}
WIN = 6
DRAW = 3
LOSS = 0
def compute_1_round(opponent_play, my_play):
if (my_play == MY_ROCK and opponent_play == OPP_SCISSORS or
my_play == MY_SCISSORS and opponent_play == OPP_PAPER or
my_play == MY_PAPER and opponent_play == OPP_ROCK):
points = WIN
elif (my_play == MY_ROCK and opponent_play == OPP_PAPER or
my_play == MY_SCISSORS and opponent_play == OPP_ROCK or
my_play == MY_PAPER and opponent_play == OPP_SCISSORS):
points = LOSS
else:
points = DRAW
points += SHAPE[my_play]
return points
def compute_2_round(opponent_play, my_play):
if my_play == MY_WIN:
points = WIN
if opponent_play == OPP_ROCK:
my_shape = MY_PAPER
elif opponent_play == OPP_SCISSORS:
my_shape = MY_ROCK
elif opponent_play == OPP_PAPER:
my_shape = MY_SCISSORS
else:
assert(False)
elif my_play == MY_DRAW:
points = DRAW
if opponent_play == OPP_ROCK:
my_shape = MY_ROCK
elif opponent_play == OPP_SCISSORS:
my_shape = MY_SCISSORS
elif opponent_play == OPP_PAPER:
my_shape = MY_PAPER
else:
assert(False)
elif my_play == MY_LOSS:
points = LOSS
if opponent_play == OPP_ROCK:
my_shape = MY_SCISSORS
elif opponent_play == OPP_SCISSORS:
my_shape = MY_PAPER
elif opponent_play == OPP_PAPER:
my_shape = MY_ROCK
else:
assert(False)
points += SHAPE[my_shape]
return points
def solve_1(input_str):
parsed_input = parse_input(input_str)
my_score = 0
for game_round in parsed_input:
opponent_play, my_play = game_round.split(' ')
round_my_score = compute_1_round(opponent_play, my_play)
my_score += round_my_score
return my_score
def solve_2(input_str):
parsed_input = parse_input(input_str)
my_score = 0
for game_round in parsed_input:
opponent_play, my_play = game_round.split(' ')
round_my_score = compute_2_round(opponent_play, my_play)
my_score += round_my_score
return my_score
########################################################################
# Test class
########################################################################
import unittest
class TestAoc(unittest.TestCase):
def setUp(self):
self.tc_1 = [
(
"""
A Y
B X
C Z
""", 15),
]
self.tc_2 = [
(
"""
A Y
B X
C Z
""", 12),
]
def tearDown(self):
pass
def test_solve_1(self):
for t in self.tc_1:
self.assertEqual(solve_1(t[0]), t[1])
def test_solve_2(self):
for t in self.tc_2:
self.assertEqual(solve_2(t[0]), t[1])