adventofcode/2016/day20/main.go
2016-12-20 11:05:43 -06:00

88 lines
1.6 KiB
Go

package main
import (
"fmt"
"math"
"sort"
"strings"
"../../"
)
func main() {
part1 := aoc.ArgIsSet("-1")
justSort := aoc.ArgIsSet("-sort")
input := aoc.StdinToStringSlice()
var blacklists []Blacklist
for i := range input {
pts := strings.Split(input[i], "-")
st := aoc.Atoi(pts[0])
end := aoc.Atoi(pts[1])
blacklists = append(blacklists, *CreateBlacklist(st, end))
}
sort.Sort(ByStart(blacklists))
// Just output the sorted blacklists
if justSort {
for i := range blacklists {
fmt.Print(blacklists[i].start, "-", blacklists[i].end, "\n")
}
return
}
// Find the lowest non-blacklisted IP
if part1 {
fmt.Println(findLowest(blacklists))
return
}
// Count how many IPs are allowed
var numIps, blIdx, ip int
highestIp := int(math.Pow(2, 32))
for ip <= highestIp {
if blIdx >= len(blacklists) {
break
}
if ip >= blacklists[blIdx].start {
if ip <= blacklists[blIdx].end {
ip = blacklists[blIdx].end + 1
continue
}
blIdx++
} else {
numIps++
ip++
}
}
fmt.Println(numIps)
}
func findLowest(blacklists []Blacklist) int {
var lowestIp int
for i := range blacklists {
if blacklists[i].hasIp(lowestIp) {
lowestIp = blacklists[i].end + 1
}
}
return lowestIp
}
type Blacklist struct {
start, end int
}
func CreateBlacklist(st, end int) *Blacklist {
return &Blacklist{st, end}
}
func (b *Blacklist) hasIp(inp int) bool {
return inp >= b.start && inp <= b.end
}
type ByStart []Blacklist
func (b ByStart) Len() int { return len(b) }
func (b ByStart) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
func (b ByStart) Less(i, j int) bool { return b[i].start < b[j].start }