|
@ -1,68 +1,75 @@ |
|
|
package main |
|
|
package main |
|
|
|
|
|
|
|
|
import ( |
|
|
import ( |
|
|
|
|
|
"fmt" |
|
|
"strings" |
|
|
"strings" |
|
|
"testing" |
|
|
"testing" |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
func TestDay01(t *testing.T) { |
|
|
type puzzleTest struct { |
|
|
ans1 := "142" |
|
|
inp1 string |
|
|
input1 := `1abc2 |
|
|
ans1 string |
|
|
pqr3stu8vwx |
|
|
|
|
|
a1b2c3d4e5f |
|
|
|
|
|
treb7uchet` |
|
|
|
|
|
|
|
|
|
|
|
ans2 := "281" |
|
|
|
|
|
input2 := `two1nine |
|
|
|
|
|
eightwothree |
|
|
|
|
|
abcone2threexyz |
|
|
|
|
|
xtwone3four |
|
|
|
|
|
4nineeightseven2 |
|
|
|
|
|
zoneight234 |
|
|
|
|
|
7pqrstsixteen` |
|
|
|
|
|
|
|
|
|
|
|
puzzle := day01{} |
|
|
|
|
|
|
|
|
|
|
|
res1 := puzzle.solve1(strings.NewReader(input1)) |
|
|
|
|
|
t.Logf("day 1 solution 1: %s", res1) |
|
|
|
|
|
if res1 != ans1 { |
|
|
|
|
|
t.Errorf("day 1 solution 1 = %s; wanted %s", res1, ans1) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
res2 := puzzle.solve2(strings.NewReader(input2)) |
|
|
inp2 string |
|
|
t.Logf("day 1 solution 2: %s", res2) |
|
|
ans2 string |
|
|
if res2 != ans2 { |
|
|
|
|
|
t.Errorf("day 1 solution 2 = %s; wanted %s", res2, ans2) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func TestDay02(t *testing.T) { |
|
|
func TestPuzzles(t *testing.T) { |
|
|
input := `Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green |
|
|
for i, puzzle := range puzzles { |
|
|
Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue |
|
|
name := fmt.Sprintf("day %d", i+1) |
|
|
Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red |
|
|
test := tests[i] |
|
|
Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red |
|
|
t.Run(name, func(t *testing.T) { |
|
|
Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green` |
|
|
|
|
|
|
|
|
|
|
|
puzzle := day02{} |
|
|
if test.inp2 == "" { |
|
|
|
|
|
test.inp2 = test.inp1 |
|
|
|
|
|
} |
|
|
|
|
|
res1 := puzzle.solve1(strings.NewReader(test.inp1)) |
|
|
|
|
|
res2 := puzzle.solve2(strings.NewReader(test.inp2)) |
|
|
|
|
|
|
|
|
ans1 := "8" |
|
|
if res1 != "incomplete" && res1 != test.ans1 { |
|
|
res1 := puzzle.solve1(strings.NewReader(input)) |
|
|
t.Errorf("solve1() = %s; wanted %s", res1, test.ans1) |
|
|
t.Logf("day 2 solution 1: %s", res1) |
|
|
|
|
|
if res1 != ans1 { |
|
|
|
|
|
t.Errorf("day 2 solution 1 = %s; wanted %s", res1, ans1) |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
ans2 := "2286" |
|
|
if res2 != "incomplete" && res2 != test.ans2 { |
|
|
res2 := puzzle.solve2(strings.NewReader(input)) |
|
|
t.Errorf("solve2() = %s; wanted %s", res2, test.ans2) |
|
|
t.Logf("day 2 solution 2: %s", res2) |
|
|
} |
|
|
if res2 != ans2 { |
|
|
}) |
|
|
t.Errorf("day 2 solution 2 = %s; wanted %s", res2, ans2) |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
func TestDay03(t *testing.T) { |
|
|
var ( |
|
|
input1 := `467..114.. |
|
|
tests = []puzzleTest{ |
|
|
|
|
|
// day 1
|
|
|
|
|
|
{ |
|
|
|
|
|
inp1: `1abc2 |
|
|
|
|
|
pqr3stu8vwx |
|
|
|
|
|
a1b2c3d4e5f |
|
|
|
|
|
treb7uchet`, |
|
|
|
|
|
ans1: "142", |
|
|
|
|
|
|
|
|
|
|
|
inp2: `two1nine |
|
|
|
|
|
eightwothree |
|
|
|
|
|
abcone2threexyz |
|
|
|
|
|
xtwone3four |
|
|
|
|
|
4nineeightseven2 |
|
|
|
|
|
zoneight234 |
|
|
|
|
|
7pqrstsixteen`, |
|
|
|
|
|
ans2: "281", |
|
|
|
|
|
}, |
|
|
|
|
|
// day 2
|
|
|
|
|
|
{ |
|
|
|
|
|
inp1: `Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green |
|
|
|
|
|
Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue |
|
|
|
|
|
Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red |
|
|
|
|
|
Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red |
|
|
|
|
|
Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green`, |
|
|
|
|
|
ans1: "8", |
|
|
|
|
|
ans2: "2286", |
|
|
|
|
|
}, |
|
|
|
|
|
// day 3
|
|
|
|
|
|
{ |
|
|
|
|
|
inp1: `467..114.. |
|
|
...*...... |
|
|
...*...... |
|
|
..35..633. |
|
|
..35..633. |
|
|
......#... |
|
|
......#... |
|
@ -71,42 +78,23 @@ func TestDay03(t *testing.T) { |
|
|
..592..... |
|
|
..592..... |
|
|
......755. |
|
|
......755. |
|
|
...$.*.... |
|
|
...$.*.... |
|
|
.664.598..` |
|
|
.664.598..`, |
|
|
|
|
|
ans1: "4361", |
|
|
puzzle := day03{} |
|
|
}, |
|
|
|
|
|
// day 4
|
|
|
ans1 := "4361" |
|
|
{ |
|
|
res1 := puzzle.solve1(strings.NewReader(input1)) |
|
|
inp1: `Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53 |
|
|
if res1 != ans1 { |
|
|
|
|
|
t.Errorf("day 3 solution 1 = %s; wanted %s", res1, ans1) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func TestDay04(t *testing.T) { |
|
|
|
|
|
input1 := `Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53 |
|
|
|
|
|
Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19 |
|
|
Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19 |
|
|
Card 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1 |
|
|
Card 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1 |
|
|
Card 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83 |
|
|
Card 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83 |
|
|
Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36 |
|
|
Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36 |
|
|
Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11` |
|
|
Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11`, |
|
|
|
|
|
ans1: "13", |
|
|
puzzle := day04{} |
|
|
ans2: "30", |
|
|
ans1 := "13" |
|
|
}, |
|
|
res1 := puzzle.solve1(strings.NewReader(input1)) |
|
|
// day 5
|
|
|
if res1 != ans1 { |
|
|
{ |
|
|
t.Errorf("solve1() = %s; wanted %s", res1, ans1) |
|
|
inp1: `seeds: 79 14 55 13 |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ans2 := "30" |
|
|
|
|
|
res2 := puzzle.solve2(strings.NewReader(input1)) |
|
|
|
|
|
if res2 != ans2 { |
|
|
|
|
|
t.Errorf("solve2() = %s; wanted %s", res2, ans2) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func TestDay05(t *testing.T) { |
|
|
|
|
|
input := `seeds: 79 14 55 13 |
|
|
|
|
|
|
|
|
|
|
|
seed-to-soil map: |
|
|
seed-to-soil map: |
|
|
50 98 2 |
|
|
50 98 2 |
|
@ -138,61 +126,26 @@ temperature-to-humidity map: |
|
|
|
|
|
|
|
|
humidity-to-location map: |
|
|
humidity-to-location map: |
|
|
60 56 37 |
|
|
60 56 37 |
|
|
56 93 4` |
|
|
56 93 4`, |
|
|
|
|
|
ans1: "35", |
|
|
puzzle := day05{} |
|
|
ans2: "46", |
|
|
|
|
|
}, |
|
|
ans := "35" |
|
|
// day 6
|
|
|
res := puzzle.solve1(strings.NewReader(input)) |
|
|
{ |
|
|
if ans != res { |
|
|
inp1: `Time: 7 15 30 |
|
|
t.Errorf("solve1() = %s; wanted %s", res, ans) |
|
|
Distance: 9 40 200`, |
|
|
} |
|
|
ans1: "288", |
|
|
|
|
|
ans2: "71503", |
|
|
// ans = "46"
|
|
|
}, |
|
|
// res = puzzle.solve2(strings.NewReader(input))
|
|
|
// day 7
|
|
|
// if ans != res {
|
|
|
{ |
|
|
// t.Errorf("solve2() = %s; wanted %s", res, ans)
|
|
|
inp1: `32T3K 765 |
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func TestDay06(t *testing.T) { |
|
|
|
|
|
input := `Time: 7 15 30 |
|
|
|
|
|
Distance: 9 40 200` |
|
|
|
|
|
|
|
|
|
|
|
puzzle := day06{} |
|
|
|
|
|
|
|
|
|
|
|
ans := "288" |
|
|
|
|
|
res := puzzle.solve1(strings.NewReader(input)) |
|
|
|
|
|
if ans != res { |
|
|
|
|
|
t.Errorf("solve1() = %s; wanted %s", res, ans) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ans = "71503" |
|
|
|
|
|
res = puzzle.solve2(strings.NewReader(input)) |
|
|
|
|
|
if ans != res { |
|
|
|
|
|
t.Errorf("solve2() = %s; wanted %s", res, ans) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func TestDay07(t *testing.T) { |
|
|
|
|
|
input := `32T3K 765 |
|
|
|
|
|
T55J5 684 |
|
|
T55J5 684 |
|
|
KK677 28 |
|
|
KK677 28 |
|
|
KTJJT 220 |
|
|
KTJJT 220 |
|
|
QQQJA 483` |
|
|
QQQJA 483`, |
|
|
|
|
|
ans1: "6440", |
|
|
puzzle := day07{} |
|
|
ans2: "5905", |
|
|
|
|
|
}, |
|
|
ans := "6440" |
|
|
|
|
|
res := puzzle.solve1(strings.NewReader(input)) |
|
|
|
|
|
if ans != res { |
|
|
|
|
|
t.Errorf("solve1() = %s; wanted %s", res, ans) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ans = "5905" |
|
|
|
|
|
res = puzzle.solve2(strings.NewReader(input)) |
|
|
|
|
|
if ans != res { |
|
|
|
|
|
t.Errorf("solve2() = %s; wanted %s", res, ans) |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
) |
|
|