-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathday14b.go
More file actions
145 lines (124 loc) · 3.24 KB
/
day14b.go
File metadata and controls
145 lines (124 loc) · 3.24 KB
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package main
import (
"fmt"
)
func processFloatingStrings(binaryNumber string) (string, string) {
var zeroString, oneString []byte
var changeMade bool = false
zeroString = make([]byte, len(binaryNumber))
oneString = make([]byte, len(binaryNumber))
for i := len(binaryNumber) - 1; i >= 0; i-- {
switch binaryNumber[i] {
case '0':
fallthrough
case '1':
zeroString[i] = binaryNumber[i]
oneString[i] = binaryNumber[i]
break
case 'X':
if !changeMade {
zeroString[i] = '0'
oneString[i] = '1'
changeMade = true
} else {
zeroString[i] = 'X'
oneString[i] = 'X'
}
break
default:
panic("Bad number passed into function")
}
}
return string(zeroString), string(oneString)
}
func checkForFloating(stringToCheck string) bool {
for _, value := range stringToCheck {
if value == 'X' {
return true
}
}
return false
}
func applyMaskToMemAddr(mask string, number int, debug bool) []int {
//func applyMaskToMemAddr(mask string, number int) {
binaryString := convertNumberToBinaryString(number)
for i := len(mask) - 1; i >= 0; i-- {
switch mask[i] {
case 'X':
binaryString[i] = 'X'
break
case '1':
binaryString[i] = '1'
break
case '0':
break
default:
panic("Corrupt mask in input")
}
}
if debug {
fmt.Printf("-----------------------------------------------\n")
fmt.Printf("Mask : %s\n", mask)
fmt.Printf("Memory Address: %s\n", binaryString)
}
// Loop until no Xs left
// give memory address with floating Xs in it to function
// get back a pair of strings with the first X changed to 0 and 1
// EndLoop
var stringOfMemAdds [10000]string
var keepLooping = true
stringOfMemAdds[0], stringOfMemAdds[1] = processFloatingStrings(string(binaryString))
var readingFrom int = 0
var writingTo int = 2
for keepLooping {
stringOfMemAdds[writingTo], stringOfMemAdds[writingTo+1] = processFloatingStrings(stringOfMemAdds[readingFrom])
writingTo += 2
readingFrom++
keepLooping = checkForFloating(stringOfMemAdds[readingFrom])
}
if debug {
fmt.Println("String of Mem Adds:", stringOfMemAdds[readingFrom:])
}
// We have our list. Now build a list of ints to return
var returnList []int
for _, answer := range stringOfMemAdds[readingFrom:] {
if answer != "" {
returnList = append(returnList, convertBinaryStringToNumber(answer))
} else {
break
}
}
if debug {
fmt.Println(returnList)
}
return returnList
}
func calcMemoryAddressesB(filename string, part byte, debug bool) int {
var memory map[int]int
var rawmask string
var matchedMask int
var matchedMemAddress, memoryAddress, memoryValue int
puzzleInput, _ := readFile(filename)
memory = make(map[int]int, len(puzzleInput))
for _, line := range puzzleInput {
matchedMask, _ = fmt.Sscanf(line, "mask = %s", &rawmask)
if matchedMask > 0 {
// Found a mask
} else {
// Must be a memory address
matchedMemAddress, _ = fmt.Sscanf(line, "mem[%d] = %d", &memoryAddress, &memoryValue)
if matchedMemAddress < 1 {
panic("Duff content in input file")
} else {
for _, i := range applyMaskToMemAddr(rawmask, memoryAddress, debug) {
memory[i] = memoryValue
}
}
}
}
var totalMemory int = 0
for _, value := range memory {
totalMemory += value
}
return totalMemory
}