Solved 2015/13 P1+P2
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
## \-\-- Day 13: Knights of the Dinner Table \-\--
|
||||
|
||||
In years past, the holiday feast with your family hasn\'t gone so well.
|
||||
Not everyone gets along! This year, you resolve, will be different.
|
||||
You\'re going to find the *optimal seating arrangement* and avoid all
|
||||
those awkward conversations.
|
||||
|
||||
You start by writing up a list of everyone invited and the amount their
|
||||
happiness would increase or decrease if they were to find themselves
|
||||
sitting next to each other person. You have a circular table that will
|
||||
be just big enough to fit everyone comfortably, and so each person will
|
||||
have exactly two neighbors.
|
||||
|
||||
For example, suppose you have only four attendees planned, and you
|
||||
calculate
|
||||
their potential happiness as follows:
|
||||
|
||||
Alice would gain 54 happiness units by sitting next to Bob.
|
||||
Alice would lose 79 happiness units by sitting next to Carol.
|
||||
Alice would lose 2 happiness units by sitting next to David.
|
||||
Bob would gain 83 happiness units by sitting next to Alice.
|
||||
Bob would lose 7 happiness units by sitting next to Carol.
|
||||
Bob would lose 63 happiness units by sitting next to David.
|
||||
Carol would lose 62 happiness units by sitting next to Alice.
|
||||
Carol would gain 60 happiness units by sitting next to Bob.
|
||||
Carol would gain 55 happiness units by sitting next to David.
|
||||
David would gain 46 happiness units by sitting next to Alice.
|
||||
David would lose 7 happiness units by sitting next to Bob.
|
||||
David would gain 41 happiness units by sitting next to Carol.
|
||||
|
||||
Then, if you seat Alice next to David, Alice would lose `2` happiness
|
||||
units (because David talks so much), but David would gain `46` happiness
|
||||
units (because Alice is such a good listener), for a total change of
|
||||
`44`.
|
||||
|
||||
If you continue around the table, you could then seat Bob next to Alice
|
||||
(Bob gains `83`, Alice gains `54`). Finally, seat Carol, who sits next
|
||||
to Bob (Carol gains `60`, Bob loses `7`) and David (Carol gains `55`,
|
||||
David gains `41`). The arrangement looks like this:
|
||||
|
||||
+41 +46
|
||||
+55 David -2
|
||||
Carol Alice
|
||||
+60 Bob +54
|
||||
-7 +83
|
||||
|
||||
After trying every other seating arrangement in this hypothetical
|
||||
scenario, you find that this one is the most optimal, with a total
|
||||
change in happiness of `330`.
|
||||
|
||||
What is the *total change in happiness* for the optimal seating
|
||||
arrangement of the actual guest list?
|
||||
|
||||
Your puzzle answer was `733`.
|
||||
|
||||
## \-\-- Part Two \-\-- {#part2}
|
||||
|
||||
In all the commotion, you realize that you forgot to seat yourself. At
|
||||
this point, you\'re pretty apathetic toward the whole thing, and your
|
||||
happiness wouldn\'t really go up or down regardless of who you sit next
|
||||
to. You assume everyone else would be just as ambivalent about sitting
|
||||
next to you, too.
|
||||
|
||||
So, add yourself to the list, and give all happiness relationships that
|
||||
involve you a score of `0`.
|
||||
|
||||
What is the *total change in happiness* for the optimal seating
|
||||
arrangement that actually includes yourself?
|
||||
|
||||
Your puzzle answer was `725`.
|
||||
|
||||
Both parts of this puzzle are complete! They provide two gold stars:
|
||||
\*\*
|
||||
|
||||
At this point, you should [return to your Advent calendar](/2015) and
|
||||
try another puzzle.
|
||||
|
||||
If you still want to see it, you can [get your puzzle
|
||||
input](13/input).
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
#!/bin/python3
|
||||
import sys,time,re
|
||||
from pprint import pprint
|
||||
sys.path.insert(0, '../../')
|
||||
from fred import list2int,get_re,nprint,lprint,loadFile,TSP
|
||||
start_time = time.time()
|
||||
|
||||
input_f = 'input'
|
||||
|
||||
#########################################
|
||||
# #
|
||||
# Part 1 #
|
||||
# #
|
||||
#########################################
|
||||
|
||||
def parseInput():
|
||||
|
||||
inst = []
|
||||
graph = {}
|
||||
with open(input_f) as file:
|
||||
for line in file:
|
||||
inst = line.rstrip().split(' happiness units by sitting next to ')
|
||||
t = inst[0].split(' would ')
|
||||
inst = [t[0]] + [inst[1].replace('.','')] + [int(t[1].replace('lose ','-').replace('gain ',''))]
|
||||
|
||||
if inst[0] not in graph:
|
||||
graph[inst[0]] = []
|
||||
#if inst[1] not in graph:
|
||||
# graph[inst[1]] = []
|
||||
graph[inst[0]].append((inst[1],inst[2]))
|
||||
#graph[inst[1]].append((inst[0],inst[2]))
|
||||
|
||||
return graph
|
||||
|
||||
def addBothWays(graph):
|
||||
n_graph = {}
|
||||
for _,a in enumerate(graph):
|
||||
for b in graph[a]:
|
||||
for c in graph[b[0]]:
|
||||
if c[0] == a:
|
||||
if a not in n_graph:
|
||||
n_graph[a] = []
|
||||
n_graph[a].append((b[0],b[1]+c[1]))
|
||||
|
||||
|
||||
return n_graph
|
||||
|
||||
def part1():
|
||||
graph = addBothWays(parseInput())
|
||||
pprint(graph)
|
||||
longest = 0
|
||||
people = set(graph.keys())
|
||||
for neighbors in graph.values():
|
||||
for neighbor, _ in neighbors:
|
||||
people.add(neighbor)
|
||||
for c in people:
|
||||
route,distance = TSP(graph, c,'longest',True)
|
||||
if longest < distance:
|
||||
longest = distance
|
||||
return longest
|
||||
|
||||
start_time = time.time()
|
||||
print('Part 1:',part1(), '\t\t', round((time.time() - start_time)*1000), 'ms')
|
||||
|
||||
|
||||
#########################################
|
||||
# #
|
||||
# Part 2 #
|
||||
# #
|
||||
#########################################
|
||||
def part2():
|
||||
# Just add 'Myself' to the input file with gain of 0 towards everyone
|
||||
return
|
||||
|
||||
start_time = time.time()
|
||||
print('Part 2:',part2(), '\t\t', round((time.time() - start_time)*1000), 'ms')
|
||||
Reference in New Issue
Block a user