Added solution to Day 5 Part 1.
This commit is contained in:
parent
8fb1a7d95c
commit
80555c4d9c
2
2024/5/Makefile
Normal file
2
2024/5/Makefile
Normal file
@ -0,0 +1,2 @@
|
||||
a.out: main.cpp
|
||||
clang++ -std=c++2b -g -O0 main.cpp
|
1387
2024/5/data.txt
Normal file
1387
2024/5/data.txt
Normal file
File diff suppressed because it is too large
Load Diff
28
2024/5/data_test.txt
Normal file
28
2024/5/data_test.txt
Normal file
@ -0,0 +1,28 @@
|
||||
47|53
|
||||
97|13
|
||||
97|61
|
||||
97|47
|
||||
75|29
|
||||
61|13
|
||||
75|53
|
||||
29|13
|
||||
97|29
|
||||
53|29
|
||||
61|53
|
||||
97|53
|
||||
61|29
|
||||
47|13
|
||||
75|47
|
||||
97|75
|
||||
47|61
|
||||
75|61
|
||||
47|29
|
||||
75|13
|
||||
53|13
|
||||
|
||||
75,47,61,53,29
|
||||
97,61,53,29,13
|
||||
75,29,13
|
||||
75,97,47,61,53
|
||||
61,13,29
|
||||
97,13,75,29,47
|
131
2024/5/main.cpp
Normal file
131
2024/5/main.cpp
Normal file
@ -0,0 +1,131 @@
|
||||
#include <algorithm>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
#include <set>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
int main()
|
||||
{
|
||||
const std::string filename = "data.txt";
|
||||
std::ifstream ifs(filename);
|
||||
if(!ifs.is_open())
|
||||
{
|
||||
std::cerr << "Missing " << filename << "." << std::endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
unsigned long total = 0;
|
||||
unsigned long total_pt2 = 0;
|
||||
|
||||
std::map<long, std::set<long>> rules;
|
||||
std::vector<std::vector<long>> production;
|
||||
|
||||
bool reading_page_numbers = true;
|
||||
for(std::string line; std::getline(ifs, line); )
|
||||
{
|
||||
if(line == "")
|
||||
{
|
||||
// one blank line is the break between reading page numbers and records.
|
||||
if(reading_page_numbers)
|
||||
reading_page_numbers = false;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
std::istringstream input(line);
|
||||
if(reading_page_numbers)
|
||||
{
|
||||
// for each value in the line:
|
||||
std::vector<long> numbers;
|
||||
for(std::string value; std::getline(input, value, '|'); )
|
||||
{
|
||||
try {
|
||||
numbers.push_back(std::atoi(value.c_str()));
|
||||
} catch (const std::exception &e) {
|
||||
std::cout << "Error parsing rule number from " << value << std::endl;
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
if(numbers.size() != 2)
|
||||
{
|
||||
std::cout << "Error: Incorrect amount of page numbers (" << numbers.size()
|
||||
<< ") in rules import sequence." << std::endl;
|
||||
exit(-1);
|
||||
}
|
||||
rules[numbers[0]].insert(numbers[1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
// for each value in the line:
|
||||
production.push_back({});
|
||||
for(std::string value; std::getline(input, value, ','); )
|
||||
{
|
||||
try {
|
||||
production.back().push_back(std::atoi(value.c_str()));
|
||||
} catch (const std::exception &e) {
|
||||
std::cout << "Error parsing production number from " << value << std::endl;
|
||||
exit(-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// // Debug:
|
||||
// std::cout << "RULES:" << std::endl;
|
||||
// for(auto rule : rules)
|
||||
// {
|
||||
// std::cout << rule.first << " prints before ";
|
||||
// for(auto page : rule.second)
|
||||
// std::cout << page << ",";
|
||||
// std::cout << std::endl;
|
||||
// }
|
||||
// std::cout << std::endl;
|
||||
// std::cout << "PRODUCTION:" << std::endl;
|
||||
// for(auto row : production)
|
||||
// {
|
||||
// for(auto num : row)
|
||||
// std::cout << num << ",";
|
||||
// std::cout << std::endl;
|
||||
// }
|
||||
|
||||
// For each production run:
|
||||
for(auto row : production)
|
||||
{
|
||||
std::set<long> already_passed;
|
||||
bool bad = false;
|
||||
// For each page number in that production run:
|
||||
for(auto num : row)
|
||||
{
|
||||
// Check against all page numbers it shouldn't print after
|
||||
for(auto before : rules[num])
|
||||
{
|
||||
// If found, it's a bad row!
|
||||
if(std::find(already_passed.begin(), already_passed.end(), before) != already_passed.end())
|
||||
{
|
||||
bad = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Keep track of numbers we've looked at already:
|
||||
already_passed.insert(num);
|
||||
}
|
||||
|
||||
if(!bad)
|
||||
total += row[row.size() / 2];
|
||||
// else
|
||||
// std::cout << "not ";
|
||||
// std::cout << "safe: ";
|
||||
// for(auto num : row)
|
||||
// std::cout << num << ",";
|
||||
// std::cout << std::endl;
|
||||
}
|
||||
|
||||
std::cout << " Total: " << total << std::endl;
|
||||
std::cout << "PT2 Total: " << total_pt2 << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user