2019 Day 16 Complete
This commit is contained in:
parent
a3cee63862
commit
11019fa77e
1
2019/day16/input
Normal file
1
2019/day16/input
Normal file
@ -0,0 +1 @@
|
||||
59708072843556858145230522180223745694544745622336045476506437914986923372260274801316091345126141549522285839402701823884690004497674132615520871839943084040979940198142892825326110513041581064388583488930891380942485307732666485384523705852790683809812073738758055115293090635233887206040961042759996972844810891420692117353333665907710709020698487019805669782598004799421226356372885464480818196786256472944761036204897548977647880837284232444863230958576095091824226426501119748518640709592225529707891969295441026284304137606735506294604060549102824977720776272463738349154440565501914642111802044575388635071779775767726626682303495430936326809
|
88
2019/day16/main.go
Normal file
88
2019/day16/main.go
Normal file
@ -0,0 +1,88 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"strings"
|
||||
|
||||
helpers "git.bullercodeworks.com/brian/adventofcode/helpers"
|
||||
)
|
||||
|
||||
func main() {
|
||||
inp := helpers.StdinToString()
|
||||
part1(inp)
|
||||
fmt.Println()
|
||||
part2(inp)
|
||||
}
|
||||
|
||||
func part1(inp string) {
|
||||
var intinp []int
|
||||
for _, v := range inp {
|
||||
intinp = append(intinp, int(byte(v)-'0'))
|
||||
}
|
||||
for i := 0; i < 100; i++ {
|
||||
intinp = runFFT(intinp)
|
||||
}
|
||||
fmt.Println("# Part 1:")
|
||||
fmt.Println(intinp[:8])
|
||||
}
|
||||
|
||||
// Well, brute force isn't going to work
|
||||
// Fortunately, the next instance of each digit is actually just the
|
||||
// sum of all digits after it (%10)
|
||||
func part2(inp string) {
|
||||
fullInput := strings.Repeat(inp, 10000)
|
||||
messageOffset := helpers.Atoi(inp[:7])
|
||||
var intinp []int
|
||||
for _, v := range fullInput[messageOffset:] {
|
||||
intinp = append(intinp, int(byte(v)-'0'))
|
||||
}
|
||||
for iter := 0; iter < 100; iter++ {
|
||||
sum := 0
|
||||
for i := len(intinp) - 1; i >= 0; i-- {
|
||||
sum += intinp[i]
|
||||
intinp[i] = sum % 10
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Println("# Part 2:")
|
||||
for _, c := range intinp[:8] {
|
||||
fmt.Print(helpers.Itoa(c))
|
||||
}
|
||||
fmt.Println()
|
||||
}
|
||||
|
||||
func runFFT(inp []int) []int {
|
||||
var result []int
|
||||
for k := range inp {
|
||||
pattern := getPattern(len(inp), k+1)
|
||||
var wrk int
|
||||
for k, iv := range inp {
|
||||
wrk = wrk + (iv * pattern[k])
|
||||
}
|
||||
result = append(result, helpers.AbsInt(wrk%10))
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func getPattern(length, iter int) []int {
|
||||
var ret []int
|
||||
pattern := []int{0, 1, 0, -1}
|
||||
var idx int
|
||||
for len(ret) < length+1 {
|
||||
wrkIter := iter
|
||||
for ; wrkIter > 0; wrkIter-- {
|
||||
ret = append(ret, pattern[idx])
|
||||
}
|
||||
idx = (idx + 1) % len(pattern)
|
||||
}
|
||||
return ret[1 : length+1]
|
||||
}
|
||||
|
||||
func intSliceToInt(inp []int) int {
|
||||
var ret int
|
||||
for k := len(inp) - 1; k >= 0; k-- {
|
||||
ret = ret + (inp[k] * int(math.Pow10(len(inp)-k-1)))
|
||||
}
|
||||
return ret
|
||||
}
|
1
2019/day16/testinput1
Normal file
1
2019/day16/testinput1
Normal file
@ -0,0 +1 @@
|
||||
12345678
|
Loading…
Reference in New Issue
Block a user