-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
93 lines (73 loc) · 1.6 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
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
package main
import (
input "aoc2020/inpututils"
"fmt"
"regexp"
"strconv"
"strings"
)
var (
bits = 36
)
func main() {
fmt.Println("--- Part One ---")
fmt.Println(Part1("input.txt"))
fmt.Println("--- Part Two ---")
fmt.Println(Part2("input.txt"))
}
func Part1(filename string) int {
lines := input.ReadLines(filename)
memory := make(map[int]int)
mask := ""
for _, line := range lines {
splitted := strings.Split(line, "=")
key, val := strings.TrimSpace(splitted[0]), strings.TrimSpace(splitted[1])
if key == "mask" {
mask = val
continue
}
r := regexp.MustCompile(`mem\[(\d+)]`)
address := toInt(r.FindStringSubmatch(key)[1])
binaryVal := parseBinaryStringFromDecimalString(val)
paddedBinaryVal := leftPadString(binaryVal, bits)
binarySlice := strings.Split(paddedBinaryVal, "")
for idx, c := range mask {
if string(c) != "X" {
binarySlice[idx] = string(c)
}
}
memory[address] = parseDecimalFromBinarySlice(binarySlice)
}
return sumVals(memory)
}
func Part2(filename string) int {
return 12
}
func leftPadString(s string, n int) string {
return fmt.Sprintf("%0*s", n, s)
}
func parseBinaryStringFromDecimalString(i string) string {
decimal, _ := strconv.ParseInt(i, 10, 64)
return strconv.FormatInt(decimal, 2)
}
func parseDecimalFromBinarySlice(b []string) int {
i, _ := strconv.ParseInt(strings.Join(b, ""), 2, 64)
return int(i)
}
func sumVals(m map[int]int) int {
s := 0
for _, val := range m {
s += val
}
return s
}
func check(err error) {
if err != nil {
panic(err)
}
}
func toInt(s string) int {
i, err := strconv.Atoi(s)
check(err)
return i
}