puzzles/advent_of_code_2018/day4/main1.cc
2022-12-01 13:46:47 +01:00

159 lines
No EOL
3.6 KiB
C++

#include <algorithm>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <map>
#include <string>
#include <vector>
using namespace std;
struct Event
{
tm time;
string event;
};
istream &operator>>(istream &in, Event &event)
{
char toss;
in >> toss; // toss '['
in >> event.time.tm_year;
event.time.tm_year -= 1900;
in >> toss; // toss '-'
in >> event.time.tm_mon;
in >> toss; // toss '-'
in >> event.time.tm_mday;
in >> event.time.tm_hour;
in >> toss; // toss ':'
in >> event.time.tm_min;
in >> toss; // toss ']'
getline(cin, event.event);
return in;
}
ostream &operator<<(ostream &out, Event const &event)
{
out << "Event: \n";
out << " " << put_time(&event.time, "%c") << "\n";
out << " - " << event.event << "\n";
return out;
}
int main()
{
vector<Event> events;
map<int, int[60]> guards;
cout << setfill(' ');
while(!cin.eof())
{
Event event{};
cin >> event;
events.push_back(event);
}
std::sort(events.begin(), events.end(),
[](Event &lhs, Event &rhs)
{
time_t l_time = mktime(&lhs.time);
time_t r_time = mktime(&rhs.time);
return l_time < r_time;
});
int current_id;
for (Event const &event : events)
{
size_t numstart = event.event.find("#");
if (numstart != string::npos)
{
size_t end = event.event.find(" ", numstart);
current_id = stoi(event.event.substr(numstart + 1, end - numstart - 1));
}
else if (event.event.find("asleep") != string::npos)
{
for (size_t idx = event.time.tm_min; idx != 60; ++idx)
++guards[current_id][idx];
}
else if (event.event.find("wakes") != string::npos)
{
for (size_t idx = event.time.tm_min; idx != 60; ++idx)
--guards[current_id][idx];
}
}
size_t max_id = 0;
size_t sleeper = 0;
// cout << " Guard ID Minute\n";
// cout << " 1 2 3 4 5\n";
// cout << " 012345678901234567890123456789012345678901234567890123456789\n";
cout << " ";
for (size_t idx = 0; idx != 60; ++idx)
cout << setw(3) << idx;
cout << " | total\n";
for (auto const &[id, sleep] : guards)
{
cout << "Guard " << setw(5) << id << ": ";
size_t total = 0;
for (int num : sleep)
{
cout << setw(3) << num;
total += num;
}
cout << " | " << total << "\n";
if (total > sleeper)
{
max_id = id;
sleeper = total;
}
}
cout << "Max sleeper: " << max_id << "\n";
size_t min_id = 0;
sleeper = 0;
for (size_t idx = 0; idx != 60; ++idx)
{
if (guards[max_id][idx] > sleeper)
{
sleeper = guards[max_id][idx];
min_id = idx;
}
}
cout << "Slept most in minute " << min_id << ", for " << sleeper << " minutes.\n";
sleeper = 0;
min_id = 0;
size_t minute = 0;
for (auto const &[id, sleep] : guards)
{
for (size_t idx = 0; idx != 60; ++idx)
{
if (sleep[idx] >= sleeper)
{
sleeper = sleep[idx];
min_id = id;
minute = idx;
}
}
}
cout << "Guard " << min_id << " is most frequently asleep on minute ";
cout << minute << "\n";
cout << sleeper * minute << "\n";
}