main.go (1644B)
1 package main
2
3 import (
4 "bufio"
5 "fmt"
6 "os"
7 "regexp"
8 "strconv"
9 "strings"
10 )
11
12 func readInput(filename string) (in_out, out_in map[string]map[string]int) {
13 file, _ := os.Open(filename)
14 defer file.Close()
15
16 in_out = make(map[string]map[string]int)
17 out_in = make(map[string]map[string]int)
18 inner_matcher := regexp.MustCompile(`([0-9]+) (\w+ \w+) bags?[\.,]`)
19 scanner := bufio.NewScanner(file)
20 for scanner.Scan() {
21 rule := strings.Split(scanner.Text(), " bags contain ")
22 inner_match := inner_matcher.FindAllStringSubmatch(rule[1], -1)
23 for _, inner := range inner_match {
24 count, _ := strconv.Atoi(inner[1])
25 if out_in[rule[0]] == nil {
26 out_in[rule[0]] = make(map[string]int)
27 }
28 out_in[rule[0]][inner[2]] = count
29 if in_out[inner[2]] == nil {
30 in_out[inner[2]] = make(map[string]int)
31 }
32 in_out[inner[2]][rule[0]] = count
33 }
34 }
35 return
36 }
37
38 func main() {
39 in_out, out_in := readInput("./input.txt")
40 // 348
41 fmt.Println(part1(in_out))
42 // 18885
43 fmt.Println(part2(out_in))
44 }
45
46 func part1(input map[string]map[string]int) int {
47 contain_colors := make(map[string]bool)
48 queue := []string{"shiny gold"}
49 for len(queue) > 0 {
50 curr := queue[0]
51 queue = queue[1:]
52 for k, _ := range input[curr] {
53 queue = append(queue, k)
54 contain_colors[k] = true
55 }
56 }
57 return len(contain_colors)
58 }
59
60 func part2(input map[string]map[string]int) (count_tot int) {
61 queue := []string{"shiny gold"}
62 count := []int{1}
63 for len(queue) > 0 {
64 for k, v := range input[queue[0]] {
65 queue = append(queue, k)
66 count = append(count, count[0]*v)
67 count_tot += count[0] * v
68 }
69 queue = queue[1:]
70 count = count[1:]
71 }
72 return
73 }