Actual solution for day 16!
This commit is contained in:
110
sixteen/bits.go
110
sixteen/bits.go
@@ -50,6 +50,87 @@ func (p *packet) versionSum() int {
|
||||
return sum
|
||||
}
|
||||
|
||||
func (p *packet) sum() int {
|
||||
sum := 0
|
||||
for _, p := range p.subpackets {
|
||||
sum += p.value()
|
||||
}
|
||||
return sum
|
||||
}
|
||||
|
||||
func (p *packet) product() int {
|
||||
product := 1
|
||||
for _, p := range p.subpackets {
|
||||
product *= p.value()
|
||||
}
|
||||
return product
|
||||
}
|
||||
|
||||
func (p *packet) min() int {
|
||||
min := 0
|
||||
for i, p := range p.subpackets {
|
||||
if i == 0 || p.content < min {
|
||||
min = p.value()
|
||||
}
|
||||
}
|
||||
return min
|
||||
}
|
||||
|
||||
func (p *packet) max() int {
|
||||
max := 0
|
||||
for i, p := range p.subpackets {
|
||||
if i == 0 || p.content > max {
|
||||
max = p.value()
|
||||
}
|
||||
}
|
||||
return max
|
||||
}
|
||||
|
||||
func (p *packet) greaterThan() int {
|
||||
result := 0
|
||||
if p.subpackets[0].value() > p.subpackets[1].value() {
|
||||
result = 1
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func (p *packet) lessThan() int {
|
||||
result := 0
|
||||
if p.subpackets[0].value() < p.subpackets[1].value() {
|
||||
result = 1
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func (p *packet) equalTo() int {
|
||||
result := 0
|
||||
if p.subpackets[0].value() == p.subpackets[1].value() {
|
||||
result = 1
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func (p *packet) value() int {
|
||||
switch p.typeID {
|
||||
case 0:
|
||||
return p.sum()
|
||||
case 1:
|
||||
return p.product()
|
||||
case 2:
|
||||
return p.min()
|
||||
case 3:
|
||||
return p.max()
|
||||
case 5:
|
||||
return p.greaterThan()
|
||||
case 6:
|
||||
return p.lessThan()
|
||||
case 7:
|
||||
return p.equalTo()
|
||||
}
|
||||
|
||||
return p.content
|
||||
}
|
||||
|
||||
func hexToBinary(input string) string {
|
||||
output := ""
|
||||
for _, r := range input {
|
||||
@@ -124,7 +205,11 @@ func parsePackets(input string) []packet {
|
||||
default:
|
||||
l := 0
|
||||
p.subpackets, l = parseOperator(remaining[6:])
|
||||
remaining = remaining[l+7:]
|
||||
if len(remaining) == l+6 {
|
||||
remaining = ""
|
||||
} else {
|
||||
remaining = remaining[l+6:]
|
||||
}
|
||||
}
|
||||
|
||||
packets = append(packets, p)
|
||||
@@ -146,16 +231,21 @@ func parseNPackets(input string, count int) ([]packet, int) {
|
||||
typeID: typeID,
|
||||
}
|
||||
|
||||
parsedLength := 0
|
||||
switch p.typeID {
|
||||
case literalType:
|
||||
value, length := parseLiteral(remaining[6:])
|
||||
value := 0
|
||||
value, parsedLength = parseLiteral(remaining[6:])
|
||||
p.content = value
|
||||
p.packet = remaining[:length+6]
|
||||
remaining = remaining[length+6:]
|
||||
p.packet = remaining[:parsedLength+6]
|
||||
default:
|
||||
l := 0
|
||||
p.subpackets, l = parseOperator(remaining[6:])
|
||||
remaining = remaining[l+7:]
|
||||
p.subpackets, parsedLength = parseOperator(remaining[6:])
|
||||
}
|
||||
|
||||
if len(remaining) == parsedLength+6 {
|
||||
remaining = ""
|
||||
} else {
|
||||
remaining = remaining[parsedLength+6:]
|
||||
}
|
||||
|
||||
packets = append(packets, p)
|
||||
@@ -165,7 +255,7 @@ func parseNPackets(input string, count int) ([]packet, int) {
|
||||
}
|
||||
|
||||
func parseOperator(input string) ([]packet, int) {
|
||||
length := 0
|
||||
length := 1
|
||||
subPackets := []packet{}
|
||||
var lType int
|
||||
var remainder string
|
||||
@@ -179,12 +269,12 @@ func parseOperator(input string) ([]packet, int) {
|
||||
lengthBits, _ := strconv.ParseInt(string(remainder[:15]), 2, 64)
|
||||
subs := parsePackets(remainder[15 : 15+lengthBits])
|
||||
subPackets = append(subPackets, subs...)
|
||||
length = 15 + int(lengthBits)
|
||||
length += 15 + int(lengthBits)
|
||||
case lengthType11:
|
||||
lengthBits, _ := strconv.ParseInt(string(remainder[:11]), 2, 64)
|
||||
subs, l := parseNPackets(remainder[11:], int(lengthBits))
|
||||
subPackets = append(subPackets, subs...)
|
||||
length = l
|
||||
length += 11 + l
|
||||
}
|
||||
|
||||
return subPackets, length
|
||||
|
Reference in New Issue
Block a user