Day 19 Complete
This commit is contained in:
parent
25e6374ced
commit
f8e101a721
105
2016/day19/main.go
Normal file
105
2016/day19/main.go
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"../../"
|
||||||
|
)
|
||||||
|
|
||||||
|
// pt1 input: 3014387
|
||||||
|
func main() {
|
||||||
|
partOne := aoc.ArgIsSet("-1")
|
||||||
|
num := 3014387
|
||||||
|
if aoc.ArgIsSet("-test") {
|
||||||
|
num = 5 // Example
|
||||||
|
}
|
||||||
|
firstElf := CreateElf(1)
|
||||||
|
t := CreateElf(2)
|
||||||
|
firstElf.setLeft(t)
|
||||||
|
t.setRight(firstElf)
|
||||||
|
fmt.Println("Generating Elves...")
|
||||||
|
for i := 3; i <= num; i++ {
|
||||||
|
nextElf := CreateElf(i)
|
||||||
|
nextElf.setRight(t)
|
||||||
|
t.setLeft(nextElf)
|
||||||
|
t = nextElf
|
||||||
|
}
|
||||||
|
t.setLeft(firstElf)
|
||||||
|
firstElf.setRight(t)
|
||||||
|
|
||||||
|
fmt.Println(num, "Elves Generated.")
|
||||||
|
fmt.Println("Initiating Greed Injection...")
|
||||||
|
|
||||||
|
t = firstElf
|
||||||
|
if !partOne {
|
||||||
|
t = GetElfAcrossCircle(t, num)
|
||||||
|
}
|
||||||
|
for t.getLeft() != t {
|
||||||
|
if partOne {
|
||||||
|
// Remove the elf to the left
|
||||||
|
t = t.getLeft()
|
||||||
|
t = t.remove()
|
||||||
|
num--
|
||||||
|
} else {
|
||||||
|
// Remove the current elf, the next elf to be removed is the one to the left
|
||||||
|
// (remove() returns a pointer to the elf to it's left)
|
||||||
|
t = t.remove()
|
||||||
|
if num%2 == 1 {
|
||||||
|
// Unless we have an odd number of elves, then we skip this one
|
||||||
|
t = t.getLeft()
|
||||||
|
}
|
||||||
|
num--
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println("The lucky elf is elf #", t.getId())
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetElfAcrossCircle(e *Elf, num int) *Elf {
|
||||||
|
retElf := e
|
||||||
|
for i := 0; i < num/2; i++ {
|
||||||
|
retElf = retElf.getLeft()
|
||||||
|
}
|
||||||
|
return retElf
|
||||||
|
}
|
||||||
|
|
||||||
|
type Elf struct {
|
||||||
|
id int
|
||||||
|
out bool
|
||||||
|
toRight *Elf
|
||||||
|
toLeft *Elf
|
||||||
|
}
|
||||||
|
|
||||||
|
// To keep the game running smoothly, an elf is required to
|
||||||
|
// let the gamemaster know who the elf to their left is when they
|
||||||
|
// are eliminated
|
||||||
|
func (e *Elf) remove() *Elf {
|
||||||
|
e.getLeft().setRight(e.getRight())
|
||||||
|
e.getRight().setLeft(e.getLeft())
|
||||||
|
return e.getLeft()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Elf) getId() int {
|
||||||
|
return e.id
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Elf) getRight() *Elf {
|
||||||
|
return e.toRight
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Elf) setRight(r *Elf) {
|
||||||
|
e.toRight = r
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Elf) getLeft() *Elf {
|
||||||
|
return e.toLeft
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Elf) setLeft(l *Elf) {
|
||||||
|
e.toLeft = l
|
||||||
|
}
|
||||||
|
|
||||||
|
func CreateElf(id int) *Elf {
|
||||||
|
r := new(Elf)
|
||||||
|
r.id = id
|
||||||
|
return r
|
||||||
|
}
|
106
2016/day19/problem
Normal file
106
2016/day19/problem
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
Advent of Code
|
||||||
|
|
||||||
|
--- Day 19: An Elephant Named Joseph ---
|
||||||
|
|
||||||
|
The Elves contact you over a highly secure emergency channel. Back at the
|
||||||
|
North Pole, the Elves are busy misunderstanding White Elephant parties.
|
||||||
|
|
||||||
|
Each Elf brings a present. They all sit in a circle, numbered starting
|
||||||
|
with position 1. Then, starting with the first Elf, they take turns
|
||||||
|
stealing all the presents from the Elf to their left. An Elf with no
|
||||||
|
presents is removed from the circle and does not take turns.
|
||||||
|
|
||||||
|
For example, with five Elves (numbered 1 to 5):
|
||||||
|
|
||||||
|
1
|
||||||
|
5 2
|
||||||
|
4 3
|
||||||
|
|
||||||
|
• Elf 1 takes Elf 2's present.
|
||||||
|
• Elf 2 has no presents and is skipped.
|
||||||
|
• Elf 3 takes Elf 4's present.
|
||||||
|
• Elf 4 has no presents and is also skipped.
|
||||||
|
• Elf 5 takes Elf 1's two presents.
|
||||||
|
• Neither Elf 1 nor Elf 2 have any presents, so both are skipped.
|
||||||
|
• Elf 3 takes Elf 5's three presents.
|
||||||
|
|
||||||
|
So, with five Elves, the Elf that sits starting in position 3 gets all the
|
||||||
|
presents.
|
||||||
|
|
||||||
|
With the number of Elves given in your puzzle input, which Elf gets all
|
||||||
|
the presents?
|
||||||
|
|
||||||
|
Your puzzle input was 3014387.
|
||||||
|
|
||||||
|
Your puzzle answer was __________.
|
||||||
|
|
||||||
|
--- Part Two ---
|
||||||
|
|
||||||
|
Realizing the folly of their present-exchange rules, the Elves agree to
|
||||||
|
instead steal presents from the Elf directly across the circle. If two
|
||||||
|
Elves are across the circle, the one on the left (from the perspective of
|
||||||
|
the stealer) is stolen from. The other rules remain unchanged: Elves with
|
||||||
|
no presents are removed from the circle entirely, and the other elves move
|
||||||
|
in slightly to keep the circle evenly spaced.
|
||||||
|
|
||||||
|
For example, with five Elves (again numbered 1 to 5):
|
||||||
|
|
||||||
|
• The Elves sit in a circle; Elf 1 goes first:
|
||||||
|
|
||||||
|
1
|
||||||
|
5 2
|
||||||
|
4 3
|
||||||
|
|
||||||
|
• Elves 3 and 4 are across the circle; Elf 3's present is stolen, being
|
||||||
|
the one to the left. Elf 3 leaves the circle, and the rest of the
|
||||||
|
Elves move in:
|
||||||
|
|
||||||
|
1 1
|
||||||
|
5 2 --> 5 2
|
||||||
|
4 - 4
|
||||||
|
|
||||||
|
• Elf 2 steals from the Elf directly across the circle, Elf 5:
|
||||||
|
|
||||||
|
1 1
|
||||||
|
- 2 --> 2
|
||||||
|
4 4
|
||||||
|
|
||||||
|
• Next is Elf 4 who, choosing between Elves 1 and 2, steals from Elf 1:
|
||||||
|
|
||||||
|
- 2
|
||||||
|
2 -->
|
||||||
|
4 4
|
||||||
|
|
||||||
|
• Finally, Elf 2 steals from Elf 4:
|
||||||
|
|
||||||
|
2
|
||||||
|
--> 2
|
||||||
|
-
|
||||||
|
|
||||||
|
So, with five Elves, the Elf that sits starting in position 2 gets all the
|
||||||
|
presents.
|
||||||
|
|
||||||
|
With the number of Elves given in your puzzle input, which Elf now gets
|
||||||
|
all the presents?
|
||||||
|
|
||||||
|
Your puzzle input was 3014387.
|
||||||
|
|
||||||
|
Your puzzle answer was __________.
|
||||||
|
|
||||||
|
References
|
||||||
|
|
||||||
|
Visible links
|
||||||
|
. http://adventofcode.com/
|
||||||
|
. http://adventofcode.com/2016/about
|
||||||
|
. http://adventofcode.com/2016/support
|
||||||
|
. http://adventofcode.com/2016/events
|
||||||
|
. http://adventofcode.com/2016/settings
|
||||||
|
. http://adventofcode.com/2016/auth/logout
|
||||||
|
. http://adventofcode.com/2016
|
||||||
|
. http://adventofcode.com/2016
|
||||||
|
. http://adventofcode.com/2016/leaderboard
|
||||||
|
. http://adventofcode.com/2016/stats
|
||||||
|
. http://adventofcode.com/2016/sponsors
|
||||||
|
. http://adventofcode.com/2016/sponsors
|
||||||
|
. https://en.wikipedia.org/wiki/White_elephant_gift_exchange
|
||||||
|
. http://adventofcode.com/2016
|
20
helpers.go
20
helpers.go
@ -7,8 +7,28 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func ArgIsSet(a string) bool {
|
||||||
|
for i := range os.Args {
|
||||||
|
if os.Args[i] == a || strings.HasPrefix(os.Args[i], a+"=") {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetArgValue(a string) string {
|
||||||
|
for i := range os.Args {
|
||||||
|
if strings.HasPrefix(os.Args[i], a+"=") {
|
||||||
|
return strings.TrimPrefix(os.Args[i], a+"=")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func StdinToStringSlice() []string {
|
func StdinToStringSlice() []string {
|
||||||
var input []string
|
var input []string
|
||||||
scanner := bufio.NewScanner(os.Stdin)
|
scanner := bufio.NewScanner(os.Stdin)
|
||||||
|
Loading…
Reference in New Issue
Block a user