/
main.go
61 lines (51 loc) · 1.13 KB
/
main.go
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
package main
import (
"fmt"
"log"
"github.com/williamgcampbell/aoc2021/internal/registry"
"github.com/williamgcampbell/aoc2021/internal/days"
)
var chorus = "On the %s day of Christmas the part %s solution was: %s\n"
func main() {
r := registry.NewDayRegistry()
days.RegisterAll(r)
for i := 1; i <= 25; i++ {
if day, ok := r[i]; ok {
printDay(day)
} else {
log.Fatalf("Could not find day %d", i)
}
}
}
func printDay(day registry.Day) {
printDayPart(1, day)
printDayPart(2, day)
}
func printDayPart(part int, day registry.Day) {
switch part {
case 1:
fmt.Printf(chorus, ordinalString(day.GetName()), "1", normalizeSolution(day.SolvePart1()))
case 2:
fmt.Printf(chorus, ordinalString(day.GetName()), "2", normalizeSolution(day.SolvePart2()))
}
}
func normalizeSolution(r string) string {
if r == "0" {
return "I don't know"
}
return r
}
func ordinalString(i int) string {
j := i % 10
k := i % 100
if j == 1 && k != 11 {
return fmt.Sprintf("%dst", i)
}
if j == 2 && k != 12 {
return fmt.Sprintf("%dnd", i)
}
if j == 3 && k != 13 {
return fmt.Sprintf("%drd", i)
}
return fmt.Sprintf("%dth", i)
}