From f619033995b385168c01f645b4b85b9703d66f02 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Sun, 17 Nov 2024 11:59:16 +0100 Subject: aoc 2015, day 16 --- 2015/src/day16.cpp | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 2015/src/day16.cpp (limited to '2015') diff --git a/2015/src/day16.cpp b/2015/src/day16.cpp new file mode 100644 index 0000000..c9447a7 --- /dev/null +++ b/2015/src/day16.cpp @@ -0,0 +1,141 @@ +#include +#include +#include +#include +#include +using namespace std; + +struct Sue { + optional children; + optional cats; + optional samoyeds; + optional pomeranians; + optional akitas; + optional vizslas; + optional goldfish; + optional trees; + optional cars; + optional perfumes; +}; + +auto +split(const string& line, char sep = ' ') +{ + vector parts; + stringstream input{ line }; + + for ( string part; getline(input, part, sep); ) { + parts.emplace_back(part); + } + + return parts; +} + +auto +read_file(string_view filename) +{ + fstream input{ filename }; + vector records; + + auto invalidChar = [](char chr) { + return chr == ':' || chr == ','; + }; + + for ( string line; getline(input, line); ) { + line.erase(remove_if(line.begin(), line.end(), invalidChar), line.end()); + auto parts = split(line); + + Sue sue; + for ( size_t idx = 2; idx != parts.size(); idx += 2 ) { + auto key = parts[idx]; + auto value = stol(parts[idx + 1]); + if ( key == "children" ) { + sue.children = value; + } + else if ( key == "cats" ) { + sue.cats = value; + } + else if ( key == "samoyeds" ) { + sue.samoyeds = value; + } + else if ( key == "pomeranians" ) { + sue.pomeranians = value; + } + else if ( key == "akitas" ) { + sue.akitas = value; + } + else if ( key == "vizslas" ) { + sue.vizslas = value; + } + else if ( key == "goldfish" ) { + sue.goldfish = value; + } + else if ( key == "trees" ) { + sue.trees = value; + } + else if ( key == "cars" ) { + sue.cars = value; + } + else if ( key == "perfumes" ) { + sue.perfumes = value; + } + else { + cerr << "unknown property: " << key << ": " << value << endl; + } + } + records.emplace_back(sue); + } + return records; +} + +void +part1(const vector& sues) +{ + Sue testSue{ 3, 7, 2, 3, 0, 0, 5, 3, 2, 1 }; // NOLINT + + for ( size_t idx = 0; idx != sues.size(); ++idx ) { + const auto& sue = sues[idx]; + if ( (!sue.children.has_value() || sue.children == testSue.children) && + (!sue.cats.has_value() || sue.cats == testSue.cats) && + (!sue.samoyeds.has_value() || sue.samoyeds == testSue.samoyeds) && + (!sue.pomeranians.has_value() || sue.pomeranians == testSue.pomeranians) && + (!sue.akitas.has_value() || sue.akitas == testSue.akitas) && + (!sue.vizslas.has_value() || sue.vizslas == testSue.vizslas) && + (!sue.goldfish.has_value() || sue.goldfish == testSue.goldfish) && + (!sue.trees.has_value() || sue.trees == testSue.trees) && + (!sue.cars.has_value() || sue.cars == testSue.cars) && + (!sue.perfumes.has_value() || sue.perfumes == testSue.perfumes) ) { + cout << idx + 1 << endl; + } + } +} + +void +part2(const vector& sues) +{ + Sue testSue{ 3, 7, 2, 3, 0, 0, 5, 3, 2, 1 }; // NOLINT + + for ( size_t idx = 0; idx != sues.size(); ++idx ) { + const auto& sue = sues[idx]; + if ( (!sue.children.has_value() || sue.children == testSue.children) && + (!sue.cats.has_value() || sue.cats > testSue.cats) && + (!sue.samoyeds.has_value() || sue.samoyeds == testSue.samoyeds) && + (!sue.pomeranians.has_value() || sue.pomeranians < testSue.pomeranians) && + (!sue.akitas.has_value() || sue.akitas == testSue.akitas) && + (!sue.vizslas.has_value() || sue.vizslas == testSue.vizslas) && + (!sue.goldfish.has_value() || sue.goldfish < testSue.goldfish) && + (!sue.trees.has_value() || sue.trees > testSue.trees) && + (!sue.cars.has_value() || sue.cars == testSue.cars) && + (!sue.perfumes.has_value() || sue.perfumes == testSue.perfumes) ) { + cout << idx + 1 << endl; + } + } +} + +int +main() +{ + auto sues = read_file("data/day16.txt"); + part1(sues); + part2(sues); +} -- cgit v1.3