Day 20 Complete
This commit is contained in:
87
2016/day20/main.go
Normal file
87
2016/day20/main.go
Normal file
@@ -0,0 +1,87 @@
|
||||
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 }
|
||||
Reference in New Issue
Block a user