Day 13
This commit is contained in:
150
day13/common/distress.go
Normal file
150
day13/common/distress.go
Normal file
@@ -0,0 +1,150 @@
|
||||
package common
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
|
||||
type Packet interface {
|
||||
Compare(Packet) int
|
||||
ToList() ListPacket
|
||||
IsSeparator() bool
|
||||
}
|
||||
|
||||
|
||||
type IntPacket int
|
||||
|
||||
func (packet IntPacket) Compare(other Packet) int {
|
||||
if otherInt, ok := other.(IntPacket); ok {
|
||||
if packet < otherInt {
|
||||
return -1
|
||||
} else if packet > otherInt {
|
||||
return 1
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
} else {
|
||||
otherList, _ := other.(ListPacket)
|
||||
return packet.ToList().Compare(otherList)
|
||||
}
|
||||
}
|
||||
|
||||
func (packet IntPacket) ToList() ListPacket {
|
||||
return ListPacket{[]Packet{packet}, false}
|
||||
}
|
||||
|
||||
func (packet IntPacket) IsSeparator() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
type ListPacket struct {
|
||||
content []Packet
|
||||
separator bool
|
||||
}
|
||||
|
||||
func (packet ListPacket) Compare(other Packet) int {
|
||||
otherList := other.ToList()
|
||||
comparisonRes := 0
|
||||
for i := 0; comparisonRes == 0; i++ {
|
||||
if i == len(packet.content) && i == len(otherList.content) {
|
||||
break
|
||||
} else if i == len(packet.content) {
|
||||
comparisonRes = -1
|
||||
} else if i == len(otherList.content) {
|
||||
comparisonRes = 1
|
||||
} else {
|
||||
comparisonRes = packet.content[i].Compare(otherList.content[i])
|
||||
}
|
||||
}
|
||||
return comparisonRes
|
||||
}
|
||||
|
||||
func (packet ListPacket) ToList() ListPacket {
|
||||
return packet
|
||||
}
|
||||
|
||||
func (packet ListPacket) IsSeparator() bool {
|
||||
return packet.separator
|
||||
}
|
||||
|
||||
|
||||
type Pair struct {
|
||||
first Packet
|
||||
second Packet
|
||||
}
|
||||
|
||||
func (pair Pair) CheckOrder() bool {
|
||||
return pair.first.Compare(pair.second) < 0
|
||||
}
|
||||
|
||||
|
||||
func ParseListPacket(listString string) ListPacket {
|
||||
packet := ListPacket{[]Packet{}, false}
|
||||
|
||||
currI := 1
|
||||
for i := 1; i < len(listString); i++ {
|
||||
if listString[i] == ',' || listString[i] == ']' {
|
||||
if listString[currI] >= '0' && listString[currI] <= '9' {
|
||||
convertedInt, _ := strconv.Atoi(listString[currI:i])
|
||||
packet.content = append(packet.content, IntPacket(convertedInt))
|
||||
} else if listString[currI] == '[' {
|
||||
depth := 1
|
||||
var j int
|
||||
for j = currI + 1; depth != 0; j++ {
|
||||
if listString[j] == '[' {
|
||||
depth++
|
||||
} else if listString[j] == ']' {
|
||||
depth--
|
||||
}
|
||||
}
|
||||
packet.content = append(packet.content, ParseListPacket(listString[currI:j]))
|
||||
i = j
|
||||
}
|
||||
currI = i + 1
|
||||
}
|
||||
}
|
||||
|
||||
return packet
|
||||
}
|
||||
|
||||
|
||||
func ParsePairs(scanner bufio.Scanner) []Pair {
|
||||
pairs := []Pair{}
|
||||
current := make([]Packet, 0, 2)
|
||||
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
|
||||
if line == "" {
|
||||
pairs = append(pairs, Pair{current[0], current[1]})
|
||||
current = make([]Packet, 0, 2)
|
||||
} else {
|
||||
current = append(current, ParseListPacket(line))
|
||||
}
|
||||
}
|
||||
|
||||
return append(pairs, Pair{current[0], current[1]})
|
||||
}
|
||||
|
||||
|
||||
func ParsePackets(scanner bufio.Scanner, separators []string) []Packet {
|
||||
packets := []Packet{}
|
||||
|
||||
for scanner.Scan() {
|
||||
line := scanner.Text()
|
||||
|
||||
if line != "" {
|
||||
packets = append(packets, ParseListPacket(line))
|
||||
}
|
||||
}
|
||||
|
||||
for _, separator := range separators {
|
||||
separatorPacket := ParseListPacket(separator)
|
||||
separatorPacket.separator = true
|
||||
packets = append(packets, separatorPacket)
|
||||
}
|
||||
|
||||
return packets
|
||||
}
|
||||
21
day13/ex1/main.go
Normal file
21
day13/ex1/main.go
Normal file
@@ -0,0 +1,21 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"aoc2022/day13/common"
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
)
|
||||
|
||||
func main() {
|
||||
pairs := common.ParsePairs(*bufio.NewScanner(os.Stdin))
|
||||
sum := 0
|
||||
|
||||
for i, pair := range pairs {
|
||||
if pair.CheckOrder() {
|
||||
sum += (i + 1)
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Println(sum)
|
||||
}
|
||||
26
day13/ex2/main.go
Normal file
26
day13/ex2/main.go
Normal file
@@ -0,0 +1,26 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"aoc2022/day13/common"
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"sort"
|
||||
)
|
||||
|
||||
func main() {
|
||||
packets := common.ParsePackets(*bufio.NewScanner(os.Stdin), []string{"[[2]]", "[[6]]"})
|
||||
|
||||
sort.Slice(packets, func(i int, j int) bool {
|
||||
return packets[i].Compare(packets[j]) < 0
|
||||
})
|
||||
|
||||
result := 1
|
||||
for i := 0; i < len(packets); i++ {
|
||||
if packets[i].IsSeparator() {
|
||||
result *= (i+1)
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Println(result)
|
||||
}
|
||||
Reference in New Issue
Block a user