Compare commits
10 Commits
120a39fb6e
...
705053959f
Author | SHA1 | Date |
---|---|---|
|
705053959f | |
|
a6fb39f168 | |
|
c74be75bbe | |
|
9e34e3e4bb | |
|
a342582f69 | |
|
ac17bdf12e | |
|
1231d99316 | |
|
5f5728a6a5 | |
|
d152641c23 | |
|
72503af66b |
|
@ -1 +1,2 @@
|
||||||
/cmake-build-debug/
|
/cmake-build-debug/
|
||||||
|
/challenge-text/
|
||||||
|
|
100
days/day01.cpp
100
days/day01.cpp
|
@ -12,104 +12,6 @@
|
||||||
#include <bits/fs_fwd.h>
|
#include <bits/fs_fwd.h>
|
||||||
#include <bits/fs_path.h>
|
#include <bits/fs_path.h>
|
||||||
|
|
||||||
/*
|
|
||||||
--- 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 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?
|
|
||||||
|
|
||||||
--- Part Two ---
|
|
||||||
|
|
||||||
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 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?
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
void day01::Calculate()
|
void day01::Calculate()
|
||||||
{
|
{
|
||||||
|
@ -124,7 +26,7 @@ void day01::Calculate()
|
||||||
col2.reserve(estimated_size);
|
col2.reserve(estimated_size);
|
||||||
occurrence_map.reserve(estimated_size);
|
occurrence_map.reserve(estimated_size);
|
||||||
|
|
||||||
std::ifstream input("input/day01.txt");
|
std::ifstream input("input/challenges.txt");
|
||||||
|
|
||||||
if (!input)
|
if (!input)
|
||||||
{
|
{
|
||||||
|
|
139
days/day02.cpp
139
days/day02.cpp
|
@ -4,54 +4,99 @@
|
||||||
|
|
||||||
#include "day02.h"
|
#include "day02.h"
|
||||||
|
|
||||||
/*
|
#include <fstream>
|
||||||
--- Day 2: Red-Nosed Reports ---
|
#include <iostream>
|
||||||
|
#include <iterator>
|
||||||
Fortunately, the first location The Historians want to search isn't a long walk from the Chief Historian's office.
|
#include <vector>
|
||||||
|
#include <bits/fs_fwd.h>
|
||||||
While the Red-Nosed Reindeer nuclear fusion/fission plant appears to contain no sign of the Chief Historian, the
|
#include <bits/fs_path.h>
|
||||||
engineers there run up to you as soon as they see you. Apparently, they still talk about the time Rudolph was saved
|
|
||||||
through molecular synthesis from a single electron.
|
|
||||||
|
|
||||||
They're quick to add that - since you're already here - they'd really appreciate your help analyzing some unusual data
|
|
||||||
from the Red-Nosed reactor. You turn to check if The Historians are waiting for you, but they seem to have already
|
|
||||||
divided into groups that are currently searching every corner of the facility. You offer to help with the unusual data.
|
|
||||||
|
|
||||||
The unusual data (your puzzle input) consists of many reports, one report per line. Each report is a list of numbers
|
|
||||||
called levels that are separated by spaces. For example:
|
|
||||||
|
|
||||||
7 6 4 2 1
|
|
||||||
1 2 7 8 9
|
|
||||||
9 7 6 2 1
|
|
||||||
1 3 2 4 5
|
|
||||||
8 6 4 4 1
|
|
||||||
1 3 6 7 9
|
|
||||||
|
|
||||||
This example data contains six reports each containing five levels.
|
|
||||||
|
|
||||||
The engineers are trying to figure out which reports are safe. The Red-Nosed reactor safety systems can only
|
|
||||||
tolerate levels that are either gradually increasing or gradually decreasing. So, a report only counts as safe if
|
|
||||||
both of the following are true:
|
|
||||||
|
|
||||||
The levels are either all increasing or all decreasing.
|
|
||||||
Any two adjacent levels differ by at least one and at most three.
|
|
||||||
|
|
||||||
In the example above, the reports can be found safe or unsafe by checking those rules:
|
|
||||||
|
|
||||||
7 6 4 2 1: Safe because the levels are all decreasing by 1 or 2.
|
|
||||||
1 2 7 8 9: Unsafe because 2 7 is an increase of 5.
|
|
||||||
9 7 6 2 1: Unsafe because 6 2 is a decrease of 4.
|
|
||||||
1 3 2 4 5: Unsafe because 1 3 is increasing but 3 2 is decreasing.
|
|
||||||
8 6 4 4 1: Unsafe because 4 4 is neither an increase or a decrease.
|
|
||||||
1 3 6 7 9: Safe because the levels are all increasing by 1, 2, or 3.
|
|
||||||
|
|
||||||
So, in this example, 2 reports are safe.
|
|
||||||
|
|
||||||
Analyze the unusual data from the engineers. How many reports are safe?
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
void day02::Calculate()
|
void day02::Calculate()
|
||||||
{
|
{
|
||||||
|
//std::ifstream input("input/day02short.txt");
|
||||||
|
std::ifstream input("input/day02.txt");
|
||||||
|
|
||||||
}
|
if (!input)
|
||||||
|
{
|
||||||
|
std::cerr << "Failed to open input file." << std::endl;
|
||||||
|
std::cout << "Current path is " << std::filesystem::current_path() << '\n';
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int safeReports = 0;
|
||||||
|
for (std::string line; std::getline(input, line, '\n');)
|
||||||
|
{
|
||||||
|
std::istringstream iss(line);
|
||||||
|
std::vector numbers(std::istream_iterator<int>{iss}, std::istream_iterator<int>());
|
||||||
|
if (IsSafe(numbers, false))
|
||||||
|
{
|
||||||
|
safeReports++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::cout << safeReports << '\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
bool day02::IsSafe(const std::vector<int> &numbers, const bool secondPass)
|
||||||
|
{
|
||||||
|
int previousNumber = numbers.at(numbers.size() - 1);
|
||||||
|
bool increasing = false;
|
||||||
|
bool decreasing = false;
|
||||||
|
bool safe = true;
|
||||||
|
for (int i = numbers.size() - 2; i >= 0; i--)
|
||||||
|
{
|
||||||
|
const int currentNumber = numbers.at(i);
|
||||||
|
|
||||||
|
if (i == numbers.size() - 2)
|
||||||
|
{
|
||||||
|
if (previousNumber < currentNumber)
|
||||||
|
{
|
||||||
|
increasing = true;
|
||||||
|
}
|
||||||
|
if (previousNumber > currentNumber)
|
||||||
|
{
|
||||||
|
decreasing = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SafetyChecks(currentNumber, previousNumber, increasing, decreasing) == 1 && !secondPass)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (IsSafe(numbers, true))
|
||||||
|
{
|
||||||
|
safe = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
previousNumber = currentNumber;
|
||||||
|
}
|
||||||
|
if (safe)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int day02::SafetyChecks(const int current, const int previous, const bool increasing, const bool decreasing)
|
||||||
|
{
|
||||||
|
const int diff = abs(current - previous);
|
||||||
|
if (previous > current && increasing)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (previous < current && decreasing)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (current == previous)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if (diff < 1 || diff > 3)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
//safe
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -4,12 +4,17 @@
|
||||||
|
|
||||||
#ifndef DAY02_H
|
#ifndef DAY02_H
|
||||||
#define DAY02_H
|
#define DAY02_H
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
class day02
|
class day02
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static void Calculate();
|
static void Calculate();
|
||||||
|
|
||||||
|
static bool IsSafe(const std::vector<int>& numbers,bool secondPass);
|
||||||
|
|
||||||
|
static int SafetyChecks(int current, int previous, bool increasing, bool decreasing);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //DAY02_H
|
#endif //DAY02_H
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,8 @@
|
||||||
|
1 3 2 4 5
|
||||||
|
8 6 4 4 1
|
||||||
|
7 6 4 2 1
|
||||||
|
1 2 7 8 9
|
||||||
|
9 7 6 2 1
|
||||||
|
1 3 6 7 9
|
||||||
|
55 55 57 58 59 62 65 68
|
||||||
|
22 25 27 28 30 31 32 29
|
Loading…
Reference in New Issue