make a common lib for non-intcode problems

This commit is contained in:
Eric Mertens 2022-11-06 21:12:30 -08:00
parent 041c055f43
commit ebb068cfc5
24 changed files with 131 additions and 42 deletions

View File

@ -15,27 +15,31 @@ else()
endif()
add_subdirectory(lib)
add_subdirectory(intcode)
add_executable(day01 day01.cpp)
target_link_libraries(day01 aocpp)
add_executable(day02 day02.cpp)
target_link_libraries(day02 intcode)
target_link_libraries(day02 aocpp intcode)
add_executable(day05 day05.cpp)
target_link_libraries(day05 intcode)
target_link_libraries(day05 aocpp intcode)
add_executable(day07 day07.cpp)
target_link_libraries(day07 intcode)
target_link_libraries(day07 aocpp intcode)
add_executable(day09 day09.cpp)
target_link_libraries(day09 intcode)
target_link_libraries(day09 aocpp intcode)
add_executable(day11 day11.cpp)
target_link_libraries(day11 intcode)
target_link_libraries(day11 aocpp intcode)
add_executable(day13 day13.cpp)
target_link_libraries(day13 intcode)
target_link_libraries(day13 aocpp intcode)
add_executable(day15 day15.cpp)
target_link_libraries(day15 intcode)
target_link_libraries(day15 aocpp intcode)
add_executable(day23 day23.cpp)
target_link_libraries(day23 intcode)
target_link_libraries(day23 aocpp intcode)

33
day01.cpp Normal file
View File

@ -0,0 +1,33 @@
#include <algorithm>
#include <numeric>
#include <cstdlib>
#include <cstdint>
#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
#include <string>
#include <aocpp/Startup.hpp>
auto main(int argc, char** argv) -> int {
auto fin = aocpp::Startup(argc, argv);
std::vector<std::int64_t> input;
std::copy(std::istream_iterator<std::int64_t>{fin},
std::istream_iterator<std::int64_t>{},
std::back_inserter(input));
auto fuel = [](std::int64_t& x) { return x=x/3-2; };
std::int64_t part1 = 0;
std::int64_t part2 = 0;
for (auto x : input) {
part1 += fuel(x);
for (; x > 0; fuel(x)) {
part2 += x;
}
}
std::cout << "Part 1: " << part1 << std::endl;
std::cout << "Part 2: " << part2 << std::endl;
}

View File

@ -1,6 +1,7 @@
#include <iostream>
#include <utility>
#include <aocpp/Startup.hpp>
#include <intcode/intcode.hpp>
using namespace intcode;
@ -17,7 +18,8 @@ auto Compute(Machine machine, ValueType x, ValueType y) {
} // namespace
auto main(int argc, char** argv) -> int {
auto machine = Startup(argc, argv);
auto fin = aocpp::Startup(argc, argv);
auto machine = Machine{ParseStream(fin)};
std::cout << "Part 1: " << Compute(machine, 12, 2) << std::endl;

View File

@ -1,6 +1,7 @@
#include <iostream>
#include <utility>
#include <aocpp/Startup.hpp>
#include <intcode/intcode.hpp>
using namespace intcode;
@ -17,7 +18,8 @@ auto Compute(Machine machine, ValueType d) -> ValueType {
} // namespace
auto main(int argc, char** argv) -> int {
auto machine = Startup(argc, argv);
auto fin = aocpp::Startup(argc, argv);
auto machine = Machine{ParseStream(fin)};
std::cout << "Part 1: " << Compute(machine, 1) << std::endl;
std::cout << "Part 2: " << Compute(std::move(machine), 5) << std::endl;
}

View File

@ -5,16 +5,19 @@
#include <utility>
#include <vector>
#include <aocpp/Startup.hpp>
#include <intcode/intcode.hpp>
using namespace intcode;
namespace {
template <class R> auto Controller(Machine machine, R const &params) {
auto& i = std::get<Input>(Step(machine)).input;
std::vector<Machine> amps;
amps.reserve(params.size());
for (auto p : params) {
i = p;
amps.push_back(machine);
StepInput(amps.back(), p);
}
return amps;
}
@ -59,7 +62,8 @@ auto optimize(Machine machine, std::vector<ValueType> params, F f) {
} // namespace
auto main(int argc, char** argv) -> int {
auto machine = Startup(argc, argv);
auto fin = aocpp::Startup(argc, argv);
auto machine = Machine{ParseStream(fin)};
std::cout << "Part 1: " << optimize(machine, {0, 1, 2, 3, 4}, compute1) << std::endl;
std::cout << "Part 2: " << optimize(std::move(machine), {5, 6, 7, 8, 9}, compute2) << std::endl;
}

View File

@ -1,6 +1,7 @@
#include <iostream>
#include <utility>
#include <aocpp/Startup.hpp>
#include <intcode/intcode.hpp>
using namespace intcode;
@ -17,7 +18,8 @@ auto Compute(Machine machine, ValueType d) -> ValueType {
} // namespace
auto main(int argc, char** argv) -> int {
auto machine = Startup(argc, argv);
auto fin = aocpp::Startup(argc, argv);
auto machine = Machine{ParseStream(fin)};
std::cout << "Part 1: " << Compute(machine, 1) << std::endl;
std::cout << "Part 2: " << Compute(std::move(machine), 2) << std::endl;
}

View File

@ -3,8 +3,10 @@
#include <tuple>
#include <map>
#include <aocpp/Startup.hpp>
#include <aocpp/Coord.hpp>
#include <intcode/intcode.hpp>
#include <intcode/Coord.hpp>
using namespace aocpp;
using namespace intcode;
namespace {
@ -36,7 +38,8 @@ auto Compute(Machine machine, ValueType start)
} // namespace
auto main(int argc, char** argv) -> int {
auto machine = Startup(argc, argv);
auto fin = aocpp::Startup(argc, argv);
auto machine = Machine{ParseStream(fin)};
std::cout << "Part 1: " << Compute(machine, 0).size() << "\nPart 2\n";
Draw(std::cout, Compute(std::move(machine), 1));
}

View File

@ -4,8 +4,10 @@
#include <tuple>
#include <set>
#include <aocpp/Startup.hpp>
#include <aocpp/Coord.hpp>
#include <intcode/intcode.hpp>
#include <intcode/Coord.hpp>
using namespace aocpp;
using namespace intcode;
namespace {
@ -58,7 +60,8 @@ auto Compute2(Machine machine) {
} // namespace
auto main(int argc, char** argv) -> int {
auto machine = Startup(argc, argv);
auto fin = aocpp::Startup(argc, argv);
auto machine = Machine{ParseStream(fin)};
std::cout << "Part 1: " << Compute1(machine) << std::endl;
std::cout << "Part 2: " << Compute2(std::move(machine)) << std::endl;
}

View File

@ -6,8 +6,10 @@
#include <utility>
#include <vector>
#include <aocpp/Coord.hpp>
#include <aocpp/Startup.hpp>
#include <intcode/intcode.hpp>
#include <intcode/Coord.hpp>
using namespace aocpp;
using namespace intcode;
namespace {
@ -89,7 +91,8 @@ auto Compute(std::map<Coord, ValueType> world) -> std::pair<int, int> {
} // namespace
auto main(int argc, char** argv) -> int {
auto [p1,p2] = Compute(Explore(Startup(argc, argv)));
auto fin = aocpp::Startup(argc, argv);
auto [p1,p2] = Compute(Explore(Machine{ParseStream(fin)}));
std::cout << "Part 1: " << p1 << std::endl;
std::cout << "Part 2: " << p2 << std::endl;
}

View File

@ -2,12 +2,11 @@
#include <deque>
#include <iostream>
#include <stdexcept>
#include <tuple>
#include <utility>
#include <variant>
#include <vector>
#include <fstream>
#include <aocpp/Startup.hpp>
#include <intcode/intcode.hpp>
using namespace intcode;
@ -19,10 +18,13 @@ using Ethernet = std::deque<Packet>;
auto BuildNetwork(Machine m) -> std::vector<Machine> {
std::vector<Machine> machines;
machines.reserve(50);
auto& i = std::get<Input>(Step(m)).input;
for (i = 0; i < 50; i++) {
machines.push_back(m);
}
return machines;
}
@ -55,7 +57,8 @@ auto Interact(Ethernet & ethernet, Machine & m, std::optional<Payload> p) -> voi
} // namespace
auto main(int argc, char** argv) -> int {
auto machines = BuildNetwork(Startup(argc, argv));
auto fin = aocpp::Startup(argc, argv);
auto machines = BuildNetwork(Machine{ParseStream(fin)});
auto ethernet = Ethernet{};
std::optional<ValueType> part1;

2
intcode/CMakeLists.txt Normal file
View File

@ -0,0 +1,2 @@
add_library(intcode src/Parser.cpp src/Interpreter.cpp src/Machine.cpp)
target_include_directories(intcode PUBLIC include)

View File

@ -4,6 +4,7 @@
#include <cstddef>
#include <unordered_map>
#include <vector>
#include <iostream>
namespace intcode {
@ -17,7 +18,10 @@ class Machine {
public:
Machine();
explicit Machine(std::vector<ValueType> ram);
/// Initialize a new machine with a given program starting
/// execution and program counter 0.
explicit Machine(std::vector<ValueType> program);
/// Access memory at absolute address
/// @param address

View File

@ -4,7 +4,6 @@
#include <intcode/Interpreter.hpp>
#include <intcode/Machine.hpp>
#include <intcode/Parser.hpp>
#include <intcode/Startup.hpp>
#include <Overload.hpp>
#endif

View File

@ -4,8 +4,8 @@ namespace intcode {
Machine::Machine() : rom_{}, ram_{}, pc_{0}, base_{0} {}
Machine::Machine(std::vector<ValueType> ram)
: rom_{ram}, ram_{}, pc_{0}, base_{0} {}
Machine::Machine(std::vector<ValueType> program)
: rom_{program}, ram_{}, pc_{0}, base_{0} {}
auto Machine::At(std::size_t i) -> ValueType & {
return i < rom_.size() ? rom_[i] : ram_[i];

View File

@ -1,2 +1,2 @@
add_library(intcode src/Coord.cpp src/Parser.cpp src/Interpreter.cpp src/Machine.cpp src/Startup.cpp)
target_include_directories(intcode PUBLIC include)
add_library(aocpp src/Startup.cpp src/Coord.cpp)
target_include_directories(aocpp PUBLIC include)

View File

@ -1,14 +1,12 @@
#ifndef INTCODE_COORD_HPP_
#define INTCODE_COORD_HPP_
#ifndef AOCPP_COORD_HPP_
#define AOCPP_COORD_HPP_
#include <functional>
#include <map>
#include <ostream>
#include <tuple>
#include <intcode/Machine.hpp>
namespace intcode {
namespace aocpp {
/// Cartesian coordinate
///
@ -19,7 +17,7 @@ struct Coord {
};
auto Draw(std::ostream & out, std::map<Coord, ValueType> image) -> void;
auto Draw(std::ostream & out, std::map<Coord, std::int64_t> image) -> void;
/// Move one unit up
auto Up(Coord) -> Coord;
@ -60,9 +58,9 @@ auto operator<<(std::ostream &, Coord) -> std::ostream &;
} // namespace
template<>
struct std::hash<intcode::Coord>
struct std::hash<aocpp::Coord>
{
auto operator()(intcode::Coord const& c) const noexcept -> std::size_t {
auto operator()(aocpp::Coord const& c) const noexcept -> std::size_t {
std::hash<std::int64_t> h;
return h(c.x) ^ h(c.y);
}

View File

@ -0,0 +1,10 @@
#ifndef AOCPP_STARTUP_HPP_
#define AOCPP_STARTUP_HPP_
#include <fstream>
namespace aocpp {
auto Startup(int argc, char ** argv) -> std::ifstream;
}
#endif

View File

@ -1,9 +1,9 @@
#include <intcode/Coord.hpp>
#include <aocpp/Coord.hpp>
namespace intcode {
namespace aocpp {
auto Draw(std::ostream & out, std::map<Coord, ValueType> image) -> void {
ValueType minX = 0, maxX = 0, minY = 0, maxY = 0;
auto Draw(std::ostream & out, std::map<Coord, std::int64_t> image) -> void {
std::int64_t minX = 0, maxX = 0, minY = 0, maxY = 0;
for (auto&& [k, _] : image) {
auto [x,y] = k;
minX = std::min(minX, x);
@ -11,8 +11,8 @@ auto Draw(std::ostream & out, std::map<Coord, ValueType> image) -> void {
minY = std::min(minY, y);
maxY = std::max(maxY, y);
}
for (ValueType y = minY; y <= maxY; y++) {
for (ValueType x = minX; x <= maxX; x++) {
for (std::int64_t y = minY; y <= maxY; y++) {
for (std::int64_t x = minX; x <= maxX; x++) {
auto it = image.find({x,y});
if (image.end() == it) {
out << "";

17
lib/src/Startup.cpp Normal file
View File

@ -0,0 +1,17 @@
#include <aocpp/Startup.hpp>
#include <cstdlib>
#include <iostream>
#include <fstream>
namespace aocpp {
auto Startup(int argc, char ** argv) -> std::ifstream {
if (argc != 2) {
std::cerr << "Expected input file argument\n";
exit(EXIT_FAILURE);
}
return std::ifstream{argv[1]};
}
}