2017 Day 16 & Day 17 Complete
This commit is contained in:
parent
948d809c4f
commit
2a79811b20
3
.gitignore
vendored
3
.gitignore
vendored
@ -50,3 +50,6 @@ _testmain.go
|
|||||||
*/day23/day23
|
*/day23/day23
|
||||||
*/day24/day24
|
*/day24/day24
|
||||||
*/day25/day25
|
*/day25/day25
|
||||||
|
|
||||||
|
# And my "You got it wrong" timer
|
||||||
|
timer
|
||||||
|
@ -15,24 +15,33 @@ func main() {
|
|||||||
iters := 1000000000
|
iters := 1000000000
|
||||||
if len(os.Args) > 1 {
|
if len(os.Args) > 1 {
|
||||||
length = Atoi(os.Args[1])
|
length = Atoi(os.Args[1])
|
||||||
|
if len(os.Args) > 2 {
|
||||||
|
iters = Atoi(os.Args[2])
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a starting string
|
||||||
for i := 0; i < length; i++ {
|
for i := 0; i < length; i++ {
|
||||||
progs += string('a' + i)
|
progs += string('a' + i)
|
||||||
}
|
}
|
||||||
|
|
||||||
inp := StdinToString()
|
inp := StdinToString()
|
||||||
moves := strings.Split(inp, ",")
|
moves := strings.Split(inp, ",")
|
||||||
for i := 0; i < iters; i++ {
|
|
||||||
if i%(iters/100) == 0 {
|
var loopEnd int
|
||||||
// Clear the screen
|
var state []string
|
||||||
fmt.Print("\033[H\033[2J")
|
doneProgs := progs
|
||||||
// Percent Complete
|
state = append(state, progs)
|
||||||
fResult := ((float64(i) / float64(iters)) * 100)
|
for loopEnd = 1; loopEnd < (iters / 2); loopEnd++ {
|
||||||
sResult2 := strconv.FormatFloat(fResult, 'f', 2, 64)
|
doneProgs = doDance(doneProgs, moves)
|
||||||
fmt.Println(sResult2)
|
state = append(state, doneProgs)
|
||||||
|
if doneProgs == progs {
|
||||||
|
fmt.Println("Loops at", loopEnd)
|
||||||
|
pos := (iters / loopEnd) * loopEnd
|
||||||
|
fmt.Println("Final State", state[iters-pos])
|
||||||
|
break
|
||||||
}
|
}
|
||||||
progs = doDance(progs, moves)
|
|
||||||
}
|
}
|
||||||
fmt.Println(progs)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func doDance(progs string, moves []string) string {
|
func doDance(progs string, moves []string) string {
|
||||||
|
78
2017/day16/problem
Normal file
78
2017/day16/problem
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
Advent of Code
|
||||||
|
|
||||||
|
--- Day 16: Permutation Promenade ---
|
||||||
|
|
||||||
|
You come upon a very unusual sight; a group of programs here appear to be
|
||||||
|
dancing.
|
||||||
|
|
||||||
|
There are sixteen programs in total, named a through p. They start by
|
||||||
|
standing in a line: a stands in position 0, b stands in position 1, and so on
|
||||||
|
until p, which stands in position 15.
|
||||||
|
|
||||||
|
The programs' dance consists of a sequence of dance moves:
|
||||||
|
|
||||||
|
* Spin, written sX, makes X programs move from the end to the front, but
|
||||||
|
maintain their order otherwise. (For example, s3 on abcde produces
|
||||||
|
cdeab).
|
||||||
|
* Exchange, written xA/B, makes the programs at positions A and B swap
|
||||||
|
places.
|
||||||
|
* Partner, written pA/B, makes the programs named A and B swap places.
|
||||||
|
|
||||||
|
For example, with only five programs standing in a line (abcde), they could
|
||||||
|
do the following dance:
|
||||||
|
|
||||||
|
* s1, a spin of size 1: eabcd.
|
||||||
|
* x3/4, swapping the last two programs: eabdc.
|
||||||
|
* pe/b, swapping programs e and b: baedc.
|
||||||
|
|
||||||
|
After finishing their dance, the programs end up in order baedc.
|
||||||
|
|
||||||
|
You watch the dance for a while and record their dance moves (your puzzle
|
||||||
|
input). In what order are the programs standing after their dance?
|
||||||
|
|
||||||
|
Your puzzle answer was ________________.
|
||||||
|
|
||||||
|
--- Part Two ---
|
||||||
|
|
||||||
|
Now that you're starting to get a feel for the dance moves, you turn your
|
||||||
|
attention to the dance as a whole.
|
||||||
|
|
||||||
|
Keeping the positions they ended up in from their previous dance, the
|
||||||
|
programs perform it again and again: including the first dance, a total of
|
||||||
|
one billion (1000000000) times.
|
||||||
|
|
||||||
|
In the example above, their second dance would begin with the order baedc,
|
||||||
|
and use the same dance moves:
|
||||||
|
|
||||||
|
* s1, a spin of size 1: cbaed.
|
||||||
|
* x3/4, swapping the last two programs: cbade.
|
||||||
|
* pe/b, swapping programs e and b: ceadb.
|
||||||
|
|
||||||
|
In what order are the programs standing after their billion dances?
|
||||||
|
|
||||||
|
Your puzzle answer was ________________.
|
||||||
|
|
||||||
|
Both parts of this puzzle are complete! They provide two gold stars: **
|
||||||
|
|
||||||
|
At this point, you should return to your advent calendar and try another
|
||||||
|
puzzle.
|
||||||
|
|
||||||
|
If you still want to see it, you can get your puzzle input.
|
||||||
|
|
||||||
|
References
|
||||||
|
|
||||||
|
Visible links
|
||||||
|
. http://adventofcode.com/
|
||||||
|
. http://adventofcode.com/2017/about
|
||||||
|
. http://adventofcode.com/2017/support
|
||||||
|
. http://adventofcode.com/2017/events
|
||||||
|
. http://adventofcode.com/2017/settings
|
||||||
|
. http://adventofcode.com/2017/auth/logout
|
||||||
|
. http://adventofcode.com/2017
|
||||||
|
. http://adventofcode.com/2017
|
||||||
|
. http://adventofcode.com/2017/leaderboard
|
||||||
|
. http://adventofcode.com/2017/stats
|
||||||
|
. http://adventofcode.com/2017/sponsors
|
||||||
|
. http://adventofcode.com/2017/sponsors
|
||||||
|
. http://adventofcode.com/2017
|
||||||
|
. http://adventofcode.com/2017/day/16/input
|
57
2017/day17/day17.go
Normal file
57
2017/day17/day17.go
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
inp := 301
|
||||||
|
tgt := 50000000
|
||||||
|
if len(os.Args) > 2 {
|
||||||
|
inp = Atoi(os.Args[1])
|
||||||
|
tgt = Atoi(os.Args[2])
|
||||||
|
} else if len(os.Args) > 1 {
|
||||||
|
fmt.Println("Usage: day17 [skip] [target]")
|
||||||
|
fmt.Println("If you provide one argument, you must provide both")
|
||||||
|
}
|
||||||
|
spinLock := []int{0}
|
||||||
|
var addPos int
|
||||||
|
for i := 1; i <= tgt; i++ {
|
||||||
|
addPos = (addPos + inp) % len(spinLock)
|
||||||
|
// Unless we're adding it after the 0, we don't care, just append it.
|
||||||
|
if addPos == 0 {
|
||||||
|
addPos++
|
||||||
|
spinLock = Insert(spinLock, i, addPos)
|
||||||
|
} else {
|
||||||
|
addPos++
|
||||||
|
spinLock = append(spinLock, i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println(spinLock[0:0+5], "...")
|
||||||
|
}
|
||||||
|
|
||||||
|
func Insert(slice []int, val, at int) []int {
|
||||||
|
var ret []int
|
||||||
|
pt1 := slice[:at]
|
||||||
|
pt2 := slice[at:]
|
||||||
|
for i := 0; i < len(pt1); i++ {
|
||||||
|
ret = append(ret, pt1[i])
|
||||||
|
}
|
||||||
|
ret = append(ret, val)
|
||||||
|
for i := 0; i < len(pt2); i++ {
|
||||||
|
ret = append(ret, pt2[i])
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
103
2017/day17/problem
Normal file
103
2017/day17/problem
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
Advent of Code
|
||||||
|
|
||||||
|
--- Day 17: Spinlock ---
|
||||||
|
|
||||||
|
Suddenly, whirling in the distance, you notice what looks like a massive,
|
||||||
|
pixelated hurricane: a deadly spinlock. This spinlock isn't just consuming
|
||||||
|
computing power, but memory, too; vast, digital mountains are being ripped
|
||||||
|
from the ground and consumed by the vortex.
|
||||||
|
|
||||||
|
If you don't move quickly, fixing that printer will be the least of your
|
||||||
|
problems.
|
||||||
|
|
||||||
|
This spinlock's algorithm is simple but efficient, quickly consuming
|
||||||
|
everything in its path. It starts with a circular buffer containing only the
|
||||||
|
value 0, which it marks as the current position. It then steps forward
|
||||||
|
through the circular buffer some number of steps (your puzzle input) before
|
||||||
|
inserting the first new value, 1, after the value it stopped on. The inserted
|
||||||
|
value becomes the current position. Then, it steps forward from there the
|
||||||
|
same number of steps, and wherever it stops, inserts after it the second new
|
||||||
|
value, 2, and uses that as the new current position again.
|
||||||
|
|
||||||
|
It repeats this process of stepping forward, inserting a new value, and using
|
||||||
|
the location of the inserted value as the new current position a total of
|
||||||
|
2017 times, inserting 2017 as its final operation, and ending with a total of
|
||||||
|
2018 values (including 0) in the circular buffer.
|
||||||
|
|
||||||
|
For example, if the spinlock were to step 3 times per insert, the circular
|
||||||
|
buffer would begin to evolve like this (using parentheses to mark the current
|
||||||
|
position after each iteration of the algorithm):
|
||||||
|
|
||||||
|
* (0), the initial state before any insertions.
|
||||||
|
* 0 (1): the spinlock steps forward three times (0, 0, 0), and then inserts
|
||||||
|
the first value, 1, after it. 1 becomes the current position.
|
||||||
|
* 0 (2) 1: the spinlock steps forward three times (0, 1, 0), and then
|
||||||
|
inserts the second value, 2, after it. 2 becomes the current position.
|
||||||
|
* 0 2 (3) 1: the spinlock steps forward three times (1, 0, 2), and then
|
||||||
|
inserts the third value, 3, after it. 3 becomes the current position.
|
||||||
|
|
||||||
|
And so on:
|
||||||
|
|
||||||
|
* 0 2 (4) 3 1
|
||||||
|
* 0 (5) 2 4 3 1
|
||||||
|
* 0 5 2 4 3 (6) 1
|
||||||
|
* 0 5 (7) 2 4 3 6 1
|
||||||
|
* 0 5 7 2 4 3 (8) 6 1
|
||||||
|
* 0 (9) 5 7 2 4 3 8 6 1
|
||||||
|
|
||||||
|
Eventually, after 2017 insertions, the section of the circular buffer near
|
||||||
|
the last insertion looks like this:
|
||||||
|
|
||||||
|
1512 1134 151 (2017) 638 1513 851
|
||||||
|
|
||||||
|
Perhaps, if you can identify the value that will ultimately be after the last
|
||||||
|
value written (2017), you can short-circuit the spinlock. In this example,
|
||||||
|
that would be 638.
|
||||||
|
|
||||||
|
What is the value after 2017 in your completed circular buffer?
|
||||||
|
|
||||||
|
Your puzzle answer was ________.
|
||||||
|
|
||||||
|
--- Part Two ---
|
||||||
|
|
||||||
|
The spinlock does not short-circuit. Instead, it gets more angry. At least,
|
||||||
|
you assume that's what happened; it's spinning significantly faster than it
|
||||||
|
was a moment ago.
|
||||||
|
|
||||||
|
You have good news and bad news.
|
||||||
|
|
||||||
|
The good news is that you have improved calculations for how to stop the
|
||||||
|
spinlock. They indicate that you actually need to identify the value after 0
|
||||||
|
in the current state of the circular buffer.
|
||||||
|
|
||||||
|
The bad news is that while you were determining this, the spinlock has just
|
||||||
|
finished inserting its fifty millionth value (50000000).
|
||||||
|
|
||||||
|
What is the value after 0 the moment 50000000 is inserted?
|
||||||
|
|
||||||
|
Your puzzle answer was _____________.
|
||||||
|
|
||||||
|
Both parts of this puzzle are complete! They provide two gold stars: **
|
||||||
|
|
||||||
|
At this point, you should return to your advent calendar and try another
|
||||||
|
puzzle.
|
||||||
|
|
||||||
|
Your puzzle input was 301.
|
||||||
|
|
||||||
|
References
|
||||||
|
|
||||||
|
Visible links
|
||||||
|
. http://adventofcode.com/
|
||||||
|
. http://adventofcode.com/2017/about
|
||||||
|
. http://adventofcode.com/2017/support
|
||||||
|
. http://adventofcode.com/2017/events
|
||||||
|
. http://adventofcode.com/2017/settings
|
||||||
|
. http://adventofcode.com/2017/auth/logout
|
||||||
|
. http://adventofcode.com/2017
|
||||||
|
. http://adventofcode.com/2017
|
||||||
|
. http://adventofcode.com/2017/leaderboard
|
||||||
|
. http://adventofcode.com/2017/stats
|
||||||
|
. http://adventofcode.com/2017/sponsors
|
||||||
|
. http://adventofcode.com/2017/sponsors
|
||||||
|
. https://en.wikipedia.org/wiki/Spinlock
|
||||||
|
. http://adventofcode.com/2017
|
27
timer.go
Normal file
27
timer.go
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
wait := 1
|
||||||
|
if len(os.Args) > 1 {
|
||||||
|
wait = Atoi(os.Args[1])
|
||||||
|
}
|
||||||
|
time.Sleep(time.Minute * time.Duration(wait))
|
||||||
|
fmt.Println("Done waiting")
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user