This commit is contained in:
Stefan Harmuth 2021-01-13 22:44:02 +01:00
parent f0a0aa306a
commit d2419e32a6

View File

@ -1,13 +1,13 @@
package day04
import (
"fmt"
"regexp"
"sort"
"strconv"
"tools"
)
var roomRegexp = regexp.MustCompile(`^(.*)-([[:digit:]]+)\[(.*)\]$`)
var roomRegexp = regexp.MustCompile(`^(.*)-([[:digit:]]+)\[(.*)]$`)
func validateChecksum(roomname, checksum string) bool {
charcount := make(map[int32]int)
@ -16,31 +16,71 @@ func validateChecksum(roomname, checksum string) bool {
charcount[c]++
}
}
for i, c := range checksum {
if i == 0 {
continue
charcountReverse := make(map[int]tools.ByteSlice)
counts := tools.NewSetInt()
for c, v := range charcount {
counts.Add(v)
charcountReverse[v] = append(charcountReverse[v], byte(c))
}
if c < int32(checksum[i-1]) || charcount[c] > charcount[int32(checksum[i-1])] {
return false
countList := counts.Keys()
sort.Sort(sort.Reverse(countList))
calcChecksum := ""
for _, v := range countList {
charList := charcountReverse[v]
sort.Sort(charList)
for _, c := range charList {
calcChecksum += string(c)
}
}
return true
return checksum == calcChecksum[:5]
}
func Part1(puzzle tools.AoCPuzzle) interface{} {
sectorSum := 0
for _, line := range puzzle.GetInputArray() {
roomMatches := roomRegexp.FindStringSubmatch(line)
roomName := roomMatches[1]
roomSectorId, _ := strconv.Atoi(roomMatches[2])
roomChecksum := roomMatches[3]
fmt.Println("Name:", roomName, "SectorID:", roomSectorId, "CheckSum:", roomChecksum)
if !validateChecksum(roomName, roomChecksum) {
fmt.Println("MEEP!")
if validateChecksum(roomName, roomChecksum) {
sectorSum += roomSectorId
}
}
return 0
return sectorSum
}
func Part2(puzzle tools.AoCPuzzle) interface{} {
return 0
for _, line := range puzzle.GetInputArray() {
roomMatches := roomRegexp.FindStringSubmatch(line)
roomName := roomMatches[1]
roomSectorId, _ := strconv.Atoi(roomMatches[2])
roomChecksum := roomMatches[3]
if validateChecksum(roomName, roomChecksum) {
addNum := int32(roomSectorId) % 26
realName := ""
for _, c := range roomName {
switch c {
case '-':
realName += " "
default:
for c+addNum > 122 {
c -= 26
}
realName += string(c + addNum)
}
}
if realName == "northpole object storage" {
return roomSectorId
}
}
}
return -1
}