Skip to content

Commit 38b1c93

Browse files
committed
feat(puzzles): Add specs and tests for 2022/day02 puzzle
1 parent cec8ab8 commit 38b1c93

File tree

3 files changed

+194
-0
lines changed

3 files changed

+194
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// Package day02 contains solution for https://adventofcode.com/2022/day/2 puzzle.
2+
package day02
3+
4+
import (
5+
"io"
6+
7+
"github.com/obalunenko/advent-of-code/internal/puzzles"
8+
)
9+
10+
func init() {
11+
puzzles.Register(solution{})
12+
}
13+
14+
type solution struct{}
15+
16+
func (s solution) Year() string {
17+
return puzzles.Year2022.String()
18+
}
19+
20+
func (s solution) Day() string {
21+
return puzzles.Day02.String()
22+
}
23+
24+
func (s solution) Part1(input io.Reader) (string, error) {
25+
return "", puzzles.ErrNotImplemented
26+
}
27+
28+
func (s solution) Part2(input io.Reader) (string, error) {
29+
return "", puzzles.ErrNotImplemented
30+
}
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package day02
2+
3+
import (
4+
"errors"
5+
"io"
6+
"strings"
7+
"testing"
8+
"testing/iotest"
9+
10+
"github.com/obalunenko/advent-of-code/internal/puzzles"
11+
12+
"github.com/stretchr/testify/assert"
13+
)
14+
15+
func Test_solution_Year(t *testing.T) {
16+
var s solution
17+
18+
want := "2022"
19+
got := s.Year()
20+
21+
assert.Equal(t, want, got)
22+
}
23+
24+
func Test_solution_Day(t *testing.T) {
25+
var s solution
26+
27+
want := "1"
28+
got := s.Day()
29+
30+
assert.Equal(t, want, got)
31+
}
32+
33+
func Test_solution_Part1(t *testing.T) {
34+
var s solution
35+
36+
type args struct {
37+
input io.Reader
38+
}
39+
40+
tests := []struct {
41+
name string
42+
args args
43+
want string
44+
wantErr assert.ErrorAssertionFunc
45+
}{
46+
{
47+
name: "test example from description",
48+
args: args{
49+
input: strings.NewReader("A Y\nB X\nC Z"),
50+
},
51+
want: "15",
52+
wantErr: assert.NoError,
53+
},
54+
{
55+
name: "",
56+
args: args{
57+
input: iotest.ErrReader(errors.New("custom error")),
58+
},
59+
want: "",
60+
wantErr: assert.Error,
61+
},
62+
}
63+
64+
for _, tt := range tests {
65+
t.Run(tt.name, func(t *testing.T) {
66+
got, err := s.Part1(tt.args.input)
67+
if !tt.wantErr(t, err) {
68+
return
69+
}
70+
71+
assert.Equal(t, tt.want, got)
72+
})
73+
}
74+
}
75+
76+
func Test_solution_Part2(t *testing.T) {
77+
t.Skip(puzzles.ErrNotImplemented)
78+
79+
var s solution
80+
81+
type args struct {
82+
input io.Reader
83+
}
84+
85+
tests := []struct {
86+
name string
87+
args args
88+
want string
89+
wantErr assert.ErrorAssertionFunc
90+
}{
91+
{
92+
name: "",
93+
args: args{
94+
input: strings.NewReader("A Y\nB X\nC Z"),
95+
},
96+
want: "",
97+
wantErr: assert.NoError,
98+
},
99+
{
100+
name: "",
101+
args: args{
102+
input: iotest.ErrReader(errors.New("custom error")),
103+
},
104+
want: "",
105+
wantErr: assert.Error,
106+
},
107+
}
108+
109+
for _, tt := range tests {
110+
t.Run(tt.name, func(t *testing.T) {
111+
got, err := s.Part2(tt.args.input)
112+
if !tt.wantErr(t, err) {
113+
return
114+
}
115+
116+
assert.Equal(t, tt.want, got)
117+
})
118+
}
119+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# --- Day 2: Rock Paper Scissors ---
2+
3+
## --- Part One ---
4+
5+
The Elves begin to set up camp on the beach. To decide whose tent gets to be closest to the snack storage,
6+
a giant [Rock Paper Scissors tournament](https://en.wikipedia.org/wiki/Rock_paper_scissors) is already in progress.
7+
8+
Rock Paper Scissors is a game between two players. Each game contains many rounds; in each round, the players
9+
each simultaneously choose one of Rock, Paper, or Scissors using a hand shape. Then, a winner for that round
10+
is selected: Rock defeats Scissors, Scissors defeats Paper, and Paper defeats Rock. If both players choose the same
11+
shape, the round instead ends in a draw.
12+
13+
Appreciative of your help yesterday, one Elf gives you an encrypted strategy guide (your puzzle input) that they say
14+
will be sure to help you win. "The first column is what your opponent is going to play: `A` for Rock, `B` for Paper,
15+
and `C` for Scissors. The second column--" Suddenly, the Elf is called away to help with someone's tent.
16+
17+
The second column, you reason, must be what you should play in response: X for Rock, Y for Paper, and Z for Scissors.
18+
Winning every time would be suspicious, so the responses must have been carefully chosen.
19+
20+
The winner of the whole tournament is the player with the highest score. Your total score is the sum of your scores
21+
for each round. The score for a single round is the score for the shape you selected
22+
(1 for Rock, 2 for Paper, and 3 for Scissors) plus the score for the outcome of the round
23+
(0 if you lost, 3 if the round was a draw, and 6 if you won).
24+
25+
Since you can't be sure if the Elf is trying to help you or trick you, you should calculate the score you would get
26+
if you were to follow the strategy guide.
27+
28+
For example, suppose you were given the following strategy guide:
29+
30+
```text
31+
A Y
32+
B X
33+
C Z
34+
```
35+
36+
This strategy guide predicts and recommends the following:
37+
38+
- In the first round, your opponent will choose Rock (A), and you should choose Paper (Y). This ends in a win for you
39+
with a score of 8 (2 because you chose Paper + 6 because you won).
40+
- In the second round, your opponent will choose Paper (B), and you should choose Rock (X). This ends in a loss for
41+
you with a score of 1 (1 + 0).
42+
- The third round is a draw with both players choosing Scissors, giving you a score of 3 + 3 = 6.
43+
- In this example, if you were to follow the strategy guide, you would get a total score of 15 (8 + 1 + 6).
44+
45+
What would your total score be if everything goes exactly according to your strategy guide?

0 commit comments

Comments
 (0)