Combine AoC Repos
This commit is contained in:
89
2016/day16/main.go
Normal file
89
2016/day16/main.go
Normal file
@@ -0,0 +1,89 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
// Part 1 Disk Size: 272
|
||||
// Part 2 Disk Size: 35651584
|
||||
func main() {
|
||||
diskSize := 272
|
||||
if len(os.Args) > 1 {
|
||||
switch os.Args[1] {
|
||||
case "-2":
|
||||
// Do part two
|
||||
diskSize = 35651584
|
||||
default:
|
||||
// manually set disk size
|
||||
diskSize = atoi(os.Args[1])
|
||||
}
|
||||
}
|
||||
input := stdinToString()
|
||||
for len(input) < diskSize {
|
||||
input = dragonCurve(input)
|
||||
}
|
||||
input = input[:diskSize]
|
||||
fmt.Println(checksum(input))
|
||||
}
|
||||
|
||||
func dragonCurve(inp string) string {
|
||||
return inp + "0" + invert(reverse(inp))
|
||||
}
|
||||
|
||||
func invert(inp string) string {
|
||||
var ret []rune
|
||||
for i := range inp {
|
||||
if inp[i] == '1' {
|
||||
ret = append(ret, '0')
|
||||
} else {
|
||||
ret = append(ret, '1')
|
||||
}
|
||||
}
|
||||
return string(ret)
|
||||
}
|
||||
|
||||
func reverse(inp string) string {
|
||||
var ret []byte
|
||||
for i := len(inp) - 1; i >= 0; i-- {
|
||||
ret = append(ret, inp[i])
|
||||
}
|
||||
return string(ret)
|
||||
}
|
||||
|
||||
func checksum(inp string) string {
|
||||
var chkSum []rune
|
||||
for i := 0; i < len(inp); i += 2 {
|
||||
if inp[i] == inp[i+1] {
|
||||
chkSum = append(chkSum, '1')
|
||||
} else {
|
||||
chkSum = append(chkSum, '0')
|
||||
}
|
||||
}
|
||||
if len(chkSum)%2 == 0 {
|
||||
// Length is even, repeat
|
||||
return checksum(string(chkSum))
|
||||
}
|
||||
return string(chkSum)
|
||||
}
|
||||
|
||||
func stdinToString() string {
|
||||
var input string
|
||||
scanner := bufio.NewScanner(os.Stdin)
|
||||
for scanner.Scan() {
|
||||
input += scanner.Text()
|
||||
}
|
||||
return input
|
||||
}
|
||||
|
||||
func atoi(i string) int {
|
||||
var ret int
|
||||
var err error
|
||||
if ret, err = strconv.Atoi(i); err != nil {
|
||||
log.Fatal("Invalid Atoi")
|
||||
}
|
||||
return ret
|
||||
}
|
||||
Reference in New Issue
Block a user