Solved 2024/01 P1+P2

This commit is contained in:
FrederikBaerentsen 2024-12-01 12:58:38 +01:00
parent 4cb6a22981
commit 8dc31fd9f7
6 changed files with 231 additions and 1 deletions

View File

@ -91,6 +91,37 @@ states = {
} }
} }
# print(states)
# max_steps = 6
# begin_state = 'A'
# states = {
# 'A': {
# 0: {
# 'W': 1,
# 'M': 'R',
# 'C': 'B'
# },
# 1: {
# 'W': 0,
# 'M': 'L',
# 'C': 'B'
# }
# },
# 'B': {
# 0: {
# 'W': 1,
# 'M': 'L',
# 'C': 'A'
# },
# 1: {
# 'W': 1,
# 'M': 'R',
# 'C': 'A'
# }
# }
# }
if part == 1: if part == 1:
end = False end = False

145
2024/01/1.md Normal file
View File

@ -0,0 +1,145 @@
## \-\-- Day 1: Historian Hysteria \-\--
The *Chief Historian* is always present for the big Christmas sleigh
launch, but nobody has seen him in months! Last anyone heard, he was
visiting locations that are historically significant to the North Pole;
a group of Senior Historians has asked you to accompany them as they
check the places they think he was most likely to visit.
As each location is checked, they will mark it on their list with a
*star*. They figure the Chief Historian *must* be in one of the first
fifty places they\'ll look, so in order to save Christmas, you need to
help them get *fifty stars* on their list before Santa takes off on
December 25th.
Collect stars by solving puzzles. Two puzzles will be made available on
each day in the Advent calendar; the second puzzle is unlocked when you
complete the first. Each puzzle grants *one star*. Good luck!
You haven\'t even left yet and the group of Elvish Senior Historians has
already hit a problem: their list of locations to check is currently
*empty*. Eventually, someone decides that the best place to check first
would be the Chief Historian\'s office.
Upon pouring into the office, everyone confirms that the Chief Historian
is indeed nowhere to be found. Instead, the Elves discover an assortment
of notes and lists of historically significant locations! This seems to
be the planning the Chief Historian was doing before he left. Perhaps
these notes can be used to determine which locations to search?
Throughout the Chief\'s office, the historically significant locations
are listed not by name but by a unique number called the *location ID*.
To make sure they don\'t miss anything, The Historians split into two
groups, each searching the office and trying to create their own
complete list of location IDs.
There\'s just one problem: by holding the two lists up *side by side*
(your puzzle input), it quickly becomes clear that the lists aren\'t
very similar. Maybe you can help The Historians reconcile their lists?
For example:
3 4
4 3
2 5
1 3
3 9
3 3
Maybe the lists are only off by a small amount! To find out, pair up the
numbers and measure how far apart they are. Pair up the *smallest number
in the left list* with the *smallest number in the right list*, then the
*second-smallest left number* with the *second-smallest right number*,
and so on.
Within each pair, figure out *how far apart* the two numbers are;
you\'ll need to *add up all of those distances*. For example, if you
pair up a `3` from the left list with a `7` from the right list, the
distance apart is `4`; if you pair up a `9` with a `3`, the distance
apart is `6`.
In the example list above, the pairs and distances would be as follows:
- The smallest number in the left list is `1`, and the smallest number
in the right list is `3`. The distance between them is `2`.
- The second-smallest number in the left list is `2`, and the
second-smallest number in the right list is another `3`. The
distance between them is `1`.
- The third-smallest number in both lists is `3`, so the distance
between them is `0`.
- The next numbers to pair up are `3` and `4`, a distance of `1`.
- The fifth-smallest numbers in each list are `3` and `5`, a distance
of `2`.
- Finally, the largest number in the left list is `4`, while the
largest number in the right list is `9`; these are a distance `5`
apart.
To find the *total distance* between the left list and the right list,
add up the distances between all of the pairs you found. In the example
above, this is `2 + 1 + 0 + 1 + 2 + 5`, a total distance of `11`!
Your actual left and right lists contain many location IDs. *What is the
total distance between your lists?*
Your puzzle answer was `2769675`.
## \-\-- Part Two \-\-- {#part2}
Your analysis only confirmed what everyone feared: the two lists of
location IDs are indeed very different.
Or are they?
The Historians can\'t agree on which group made the mistakes *or* how to
read most of the Chief\'s handwriting, but in the commotion you notice
an interesting detail: [a
lot]{title="We were THIS close to summoning the Alot of Location IDs!"}
of location IDs appear in both lists! Maybe the other numbers aren\'t
location IDs at all but rather misinterpreted handwriting.
This time, you\'ll need to figure out exactly how often each number from
the left list appears in the right list. Calculate a total *similarity
score* by adding up each number in the left list after multiplying it by
the number of times that number appears in the right list.
Here are the same example lists again:
3 4
4 3
2 5
1 3
3 9
3 3
For these example lists, here is the process of finding the similarity
score:
- The first number in the left list is `3`. It appears in the right
list three times, so the similarity score increases by `3 * 3 = 9`.
- The second number in the left list is `4`. It appears in the right
list once, so the similarity score increases by `4 * 1 = 4`.
- The third number in the left list is `2`. It does not appear in the
right list, so the similarity score does not increase (`2 * 0 = 0`).
- The fourth number, `1`, also does not appear in the right list.
- The fifth number, `3`, appears in the right list three times; the
similarity score increases by `9`.
- The last number, `3`, appears in the right list three times; the
similarity score again increases by `9`.
So, for these example lists, the similarity score at the end of this
process is `31` (`9 + 4 + 0 + 0 + 9 + 9`).
Once again consider your left and right lists. *What is their similarity
score?*
Your puzzle answer was `24643097`.
Both parts of this puzzle are complete! They provide two gold stars:
\*\*
At this point, you should [return to your Advent calendar](/2024) and
try another puzzle.
If you still want to see it, you can [get your puzzle
input](1/input).

49
2024/01/solution.py Normal file
View File

@ -0,0 +1,49 @@
#!/bin/python3
import sys,re
from collections import Counter
from pprint import pprint
sys.path.insert(0, '../../')
from fred import list2int,get_re,nprint,lprint
input_f = 'input'
part = 2
def loadList(input_f):
left = []
right = []
with open(input_f) as file:
for line in file:
l = line.rstrip().split()
left.append(int(l[0]))
right.append(int(l[1]))
return left,right
#########################################
# #
# Part 1 #
# #
#########################################
if part == 1:
sum = 0
left,right = loadList(input_f)
for i in range(len(left)):
sum += abs((left.pop(left.index(min(left)))-right.pop(right.index(min(right)))))
print(sum)
#########################################
# #
# Part 2 #
# #
#########################################
if part == 2:
sim = 0
left,right = loadList(input_f)
right = Counter(right)
for i in range(len(left)):
sim += (left[i] * right[left[i]])
print(sim)

View File

@ -57,7 +57,7 @@
## 2017 ## 2017
.-----------------------------------------------. .-----------------------------------------------.
| o──────*──────┐o┬──────────────────┐┌───────┐ | 25 | o──────*──────┐o┬──────────────────┐┌───────┐ | 25 *
| o──*──┐└───┐o─┴─┘o────────┬─────o┌─┘├───o┌──┤ | 24 | o──*──┐└───┐o─┴─┘o────────┬─────o┌─┘├───o┌──┤ | 24
| ┌──┘o─┴────┘┌────────────*├──────┘o─┘┌───┘┌─┘ | 23 * | ┌──┘o─┴────┘┌────────────*├──────┘o─┘┌───┘┌─┘ | 23 *
| ├───┐┌──────┴o*──|(────┐┌┘└──────────┘o┬──┘o┐ | 22 ** | ├───┐┌──────┴o*──|(────┐┌┘└──────────┘o┬──┘o┐ | 22 **

Binary file not shown.

View File

@ -12,6 +12,11 @@ def toGrid(input,parser=None):
grid.append(list(line.rstrip())) grid.append(list(line.rstrip()))
return grid return grid
def findDupes(input:list):
# Returns the indicies of duplicate values in list
return [item for item in set(input) if input.count(item) > 1]
def lprint(x:str,log:bool): def lprint(x:str,log:bool):
if log: if log:
print(x) print(x)