Combine AoC Repos
This commit is contained in:
28
2015/day24/input
Normal file
28
2015/day24/input
Normal file
@@ -0,0 +1,28 @@
|
||||
1
|
||||
3
|
||||
5
|
||||
11
|
||||
13
|
||||
17
|
||||
19
|
||||
23
|
||||
29
|
||||
31
|
||||
37
|
||||
41
|
||||
43
|
||||
47
|
||||
53
|
||||
59
|
||||
67
|
||||
71
|
||||
73
|
||||
79
|
||||
83
|
||||
89
|
||||
97
|
||||
101
|
||||
103
|
||||
107
|
||||
109
|
||||
113
|
142
2015/day24/main.go
Normal file
142
2015/day24/main.go
Normal file
@@ -0,0 +1,142 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var pkgWeights []int64
|
||||
|
||||
func main() {
|
||||
scanner := bufio.NewScanner(os.Stdin)
|
||||
for scanner.Scan() {
|
||||
pkgWeights = append(pkgWeights, int64(mustAtoi(strings.ToLower(scanner.Text()))))
|
||||
}
|
||||
// Sort the weights, in the case of our input, no need.
|
||||
totalWeight := weighPackages(pkgWeights)
|
||||
// For Part 1:
|
||||
//splitWeight := totalWeight / 3
|
||||
// For Part 2:
|
||||
splitWeight := totalWeight / 4
|
||||
fmt.Printf("Balanced at %d\n", splitWeight)
|
||||
// Now find the fewest number of packages that are that weight
|
||||
result := tryPackages([]int64{}, pkgWeights, splitWeight)
|
||||
fmt.Println("*** RESULT ***")
|
||||
//result = makeUnique(result)
|
||||
lowestQE := int64(-1)
|
||||
shortest := -1
|
||||
for i := range result {
|
||||
if len(result[i]) <= shortest || shortest == -1 {
|
||||
fmt.Print(result[i])
|
||||
fmt.Printf(" L:%d", len(result[i]))
|
||||
fmt.Printf(" QE:%d\n", getQE(result[i]))
|
||||
shortest = len(result[i])
|
||||
if getQE(result[i]) < lowestQE || lowestQE == -1 {
|
||||
lowestQE = getQE(result[i])
|
||||
}
|
||||
}
|
||||
}
|
||||
fmt.Println()
|
||||
fmt.Printf("%d\n", lowestQE)
|
||||
}
|
||||
|
||||
func tryPackages(pkgs []int64, rem []int64, targ int64) [][]int64 {
|
||||
// Go through all packages in 'rem' and find the combination
|
||||
// That results in the least total number of packages
|
||||
var findRet [][]int64
|
||||
fewest := -1
|
||||
if len(pkgs) > fewest && fewest != -1 {
|
||||
return findRet
|
||||
}
|
||||
for i := len(rem) - 1; i >= 0; i-- {
|
||||
t := targ - weighPackages(pkgs)
|
||||
if rem[i] <= t {
|
||||
tryPkgs := append(pkgs, rem[i])
|
||||
if weighPackages(tryPkgs) == targ {
|
||||
//if len(tryPkgs) <= fewest || fewest == -1 {
|
||||
findRet = append(findRet, tryPkgs)
|
||||
// fewest = len(tryPkgs)
|
||||
//}
|
||||
}
|
||||
// Not there yet... Recurse
|
||||
rem = rem[:i]
|
||||
res := tryPackages(tryPkgs, rem, targ)
|
||||
for i := range res {
|
||||
if weighPackages(res[i]) == targ {
|
||||
//if len(res[i]) <= fewest || fewest == -1 {
|
||||
findRet = append(findRet, res[i])
|
||||
// fewest = len(res[i])
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return findRet
|
||||
}
|
||||
|
||||
func getQE(pkgs []int64) int64 {
|
||||
var totalQE int64
|
||||
for i := range pkgs {
|
||||
if totalQE == 0 {
|
||||
totalQE = int64(pkgs[i])
|
||||
} else {
|
||||
totalQE = totalQE * int64(pkgs[i])
|
||||
}
|
||||
}
|
||||
return totalQE
|
||||
}
|
||||
|
||||
func weighPackages(pkgs []int64) int64 {
|
||||
var totalWeight int64
|
||||
for i := range pkgs {
|
||||
totalWeight += pkgs[i]
|
||||
}
|
||||
return totalWeight
|
||||
}
|
||||
|
||||
func makeUnique(s [][]int64) [][]int64 {
|
||||
var ret [][]int64
|
||||
for i := range s {
|
||||
var found bool
|
||||
// Check if s[i] is already in ret
|
||||
for j := range ret {
|
||||
if isSame(ret[j], s[i]) {
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
ret = append(ret, s[i])
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
func isSame(s1 []int64, s2 []int64) bool {
|
||||
if len(s1) != len(s2) {
|
||||
return false
|
||||
}
|
||||
for i := range s1 {
|
||||
if s1[i] != s2[i] {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func itoa(i int) string {
|
||||
return strconv.Itoa(i)
|
||||
}
|
||||
|
||||
func mustAtoi(s string) int {
|
||||
var i int
|
||||
var err error
|
||||
if i, err = strconv.Atoi(s); err != nil {
|
||||
fmt.Println("Tried to atoi " + s)
|
||||
os.Exit(1)
|
||||
}
|
||||
return i
|
||||
}
|
116
2015/day24/problem
Normal file
116
2015/day24/problem
Normal file
@@ -0,0 +1,116 @@
|
||||
Advent of Code
|
||||
|
||||
br0xen 50*
|
||||
|
||||
• [About]
|
||||
• [Stats]
|
||||
• [Leaderboard]
|
||||
• [Settings]
|
||||
• [Log out]
|
||||
|
||||
--- Day 24: It Hangs in the Balance ---
|
||||
|
||||
It's Christmas Eve, and Santa is loading up the sleigh for this year's deliveries. However,
|
||||
there's one small problem: he can't get the sleigh to balance. If it isn't balanced, he can't
|
||||
defy physics, and nobody gets presents this year.
|
||||
|
||||
No pressure.
|
||||
|
||||
Santa has provided you a list of the weights of every package he needs to fit on the sleigh.
|
||||
The packages need to be split into three groups of exactly the same weight, and every package
|
||||
has to fit. The first group goes in the passenger compartment of the sleigh, and the second
|
||||
and third go in containers on either side. Only when all three groups weigh exactly the same
|
||||
amount will the sleigh be able to fly. Defying physics has rules, you know!
|
||||
|
||||
Of course, that's not the only problem. The first group - the one going in the passenger
|
||||
compartment - needs as few packages as possible so that Santa has some legroom left over. It
|
||||
doesn't matter how many packages are in either of the other two groups, so long as all of the
|
||||
groups weigh the same.
|
||||
|
||||
Furthermore, Santa tells you, if there are multiple ways to arrange the packages such that the
|
||||
fewest possible are in the first group, you need to choose the way where the first group has
|
||||
the smallest quantum entanglement to reduce the chance of any "complications". The quantum
|
||||
entanglement of a group of packages is the product of their weights, that is, the value you
|
||||
get when you multiply their weights together. Only consider quantum entanglement if the first
|
||||
group has the fewest possible number of packages in it and all groups weigh the same amount.
|
||||
|
||||
For example, suppose you have ten packages with weights 1 through 5 and 7 through 11. For this
|
||||
situation, some of the unique first groups, their quantum entanglements, and a way to divide
|
||||
the remaining packages are as follows:
|
||||
|
||||
Group 1; Group 2; Group 3
|
||||
11 9 (QE= 99); 10 8 2; 7 5 4 3 1
|
||||
10 9 1 (QE= 90); 11 7 2; 8 5 4 3
|
||||
10 8 2 (QE=160); 11 9; 7 5 4 3 1
|
||||
10 7 3 (QE=210); 11 9; 8 5 4 2 1
|
||||
10 5 4 1 (QE=200); 11 9; 8 7 3 2
|
||||
10 5 3 2 (QE=300); 11 9; 8 7 4 1
|
||||
10 4 3 2 1 (QE=240); 11 9; 8 7 5
|
||||
9 8 3 (QE=216); 11 7 2; 10 5 4 1
|
||||
9 7 4 (QE=252); 11 8 1; 10 5 3 2
|
||||
9 5 4 2 (QE=360); 11 8 1; 10 7 3
|
||||
8 7 5 (QE=280); 11 9; 10 4 3 2 1
|
||||
8 5 4 3 (QE=480); 11 9; 10 7 2 1
|
||||
7 5 4 3 1 (QE=420); 11 9; 10 8 2
|
||||
|
||||
Of these, although 10 9 1 has the smallest quantum entanglement (90), the configuration with
|
||||
only two packages, 11 9, in the passenger compartment gives Santa the most legroom and wins.
|
||||
In this situation, the quantum entanglement for the ideal configuration is therefore 99. Had
|
||||
there been two configurations with only two packages in the first group, the one with the
|
||||
smaller quantum entanglement would be chosen.
|
||||
|
||||
What is the quantum entanglement of the first group of packages in the ideal configuration?
|
||||
|
||||
Your puzzle answer was 10439961859.
|
||||
|
||||
--- Part Two ---
|
||||
|
||||
That's weird... the sleigh still isn't balancing.
|
||||
|
||||
"Ho ho ho", Santa muses to himself. "I forgot the trunk".
|
||||
|
||||
Balance the sleigh again, but this time, separate the packages into four groups instead of
|
||||
three. The other constraints still apply.
|
||||
|
||||
Given the example packages above, this would be some of the new unique first groups, their
|
||||
quantum entanglements, and one way to divide the remaining packages:
|
||||
|
||||
11 4 (QE=44); 10 5; 9 3 2 1; 8 7
|
||||
10 5 (QE=50); 11 4; 9 3 2 1; 8 7
|
||||
9 5 1 (QE=45); 11 4; 10 3 2; 8 7
|
||||
9 4 2 (QE=72); 11 3 1; 10 5; 8 7
|
||||
9 3 2 1 (QE=54); 11 4; 10 5; 8 7
|
||||
8 7 (QE=56); 11 4; 10 5; 9 3 2 1
|
||||
|
||||
Of these, there are three arrangements that put the minimum (two) number of packages in the
|
||||
first group: 11 4, 10 5, and 8 7. Of these, 11 4 has the lowest quantum entanglement, and so
|
||||
it is selected.
|
||||
|
||||
Now, what is the quantum entanglement of the first group of packages in the ideal
|
||||
configuration?
|
||||
|
||||
Your puzzle answer was 72050269.
|
||||
|
||||
Both parts of this puzzle are complete! They provide two gold stars: **
|
||||
|
||||
At this point, all that is left is for you to admire your advent calendar.
|
||||
|
||||
If you still want to see it, you can get your puzzle input.
|
||||
|
||||
You can also [Shareon Twitter Google+ Reddit] this puzzle.
|
||||
|
||||
References
|
||||
|
||||
Visible links
|
||||
. http://adventofcode.com/
|
||||
. http://adventofcode.com/about
|
||||
. http://adventofcode.com/stats
|
||||
. http://adventofcode.com/leaderboard
|
||||
. http://adventofcode.com/settings
|
||||
. http://adventofcode.com/auth/logout
|
||||
. https://en.wikipedia.org/wiki/Product_%28mathematics%29
|
||||
. http://adventofcode.com/
|
||||
. http://adventofcode.com/day/24/input
|
||||
. https://twitter.com/intent/tweet?text=I%27ve+completed+%22It+Hangs+in+the+Balance%22+%2D+Day+24+%2D+Advent+of+Code&url=http%3A%2F%2Fadventofcode%2Ecom%2Fday%2F24&related=ericwastl&hashtags=AdventOfCode
|
||||
. https://plus.google.com/share?url=http%3A%2F%2Fadventofcode%2Ecom%2Fday%2F24
|
||||
. http://www.reddit.com/submit?url=http%3A%2F%2Fadventofcode%2Ecom%2Fday%2F24&title=I%27ve+completed+%22It+Hangs+in+the+Balance%22+%2D+Day+24+%2D+Advent+of+Code
|
10
2015/day24/sample_input
Normal file
10
2015/day24/sample_input
Normal file
@@ -0,0 +1,10 @@
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
5
|
||||
7
|
||||
8
|
||||
9
|
||||
10
|
||||
11
|
Reference in New Issue
Block a user