diff --git a/2017/README.md b/2017/README.md index c222003..a6ec398 100644 --- a/2017/README.md +++ b/2017/README.md @@ -13,6 +13,7 @@ The current plan, in no particular order: - [x] C# - [Day 07](./day-07/solution.cs) - [x] Clojure - [Day 03](./day-03/solution.clj) - [ ] Coffeescript +- [x] Go - [Day 13](./day-13/solution.go) - [ ] Haskell - [ ] Java - [x] Kotlin - [Day 10](./day-10/solution.kt) diff --git a/2017/day-13/input.txt b/2017/day-13/input.txt new file mode 100644 index 0000000..89e6422 --- /dev/null +++ b/2017/day-13/input.txt @@ -0,0 +1,43 @@ +0: 3 +1: 2 +2: 4 +4: 6 +6: 4 +8: 6 +10: 5 +12: 6 +14: 8 +16: 8 +18: 8 +20: 6 +22: 12 +24: 8 +26: 8 +28: 10 +30: 9 +32: 12 +34: 8 +36: 12 +38: 12 +40: 12 +42: 14 +44: 14 +46: 12 +48: 12 +50: 12 +52: 12 +54: 14 +56: 12 +58: 14 +60: 14 +62: 14 +64: 14 +70: 10 +72: 14 +74: 14 +76: 14 +78: 14 +82: 14 +86: 17 +88: 18 +96: 26 diff --git a/2017/day-13/solution.go b/2017/day-13/solution.go new file mode 100644 index 0000000..0042619 --- /dev/null +++ b/2017/day-13/solution.go @@ -0,0 +1,54 @@ +package main + +import "fmt" + +func read_input() map[int]int { + var level, depth int + + var result = make(map[int]int) + + for { + if n, err := fmt.Scanf("%d: %d", &level, &depth); n != 2 || err != nil { + break + } + + result[level] = depth + } + + return result +} + +func penalty(firewalls map[int]int) int { + var score = 0 + + for level, depth := range firewalls { + if level % (2 * depth - 2) == 0 { + score += level * depth + } + } + + return score +} + +func caught(firewalls map[int]int, offset int) bool { + for level, depth := range firewalls { + if (level + offset) % (2 * depth - 2) == 0 { + return true + } + } + + return false +} + +func main() { + firewalls := read_input() + + fmt.Printf("Penalty: %d\n", penalty(firewalls)) + + var offset = 1 + + for ; caught(firewalls, offset); offset++ { + } + + fmt.Printf("Wait time: %d\n", offset) +}