day04
This commit is contained in:
parent
f0a0aa306a
commit
d2419e32a6
66
day04/day.go
66
day04/day.go
@ -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
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user