Added 2022 (cpp)
This commit is contained in:
parent
11600f7ba9
commit
567c8487b5
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
||||
[submodule "2022/2022/cpp/doctest"]
|
||||
path = 2022/cpp/doctest
|
||||
url = git@github.com:doctest/doctest
|
35
2022/cpp/01/Makefile
Normal file
35
2022/cpp/01/Makefile
Normal file
@ -0,0 +1,35 @@
|
||||
# VERBOSE := 0
|
||||
CXXFLAGS := -Wall -O3 -DPART=2
|
||||
OBJ_DIR = build
|
||||
OBJ = answer.o
|
||||
|
||||
.PHONY: clean asdf sample1 sample2
|
||||
|
||||
asdf: result
|
||||
@echo "------- RESULT -------"
|
||||
@./result "input" | xclip -selection c
|
||||
@xclip -selection c -o
|
||||
|
||||
check: test
|
||||
./test
|
||||
|
||||
verbose: clean
|
||||
$(eval CXXFLAGS += -DVERBOSE)
|
||||
|
||||
test: $(OBJ_DIR)/$(OBJ)
|
||||
|
||||
sample1 sample2:
|
||||
$(eval CXXFLAGS += -DSAMPLE$(@:sample%=%))
|
||||
@-rm test
|
||||
|
||||
$(OBJ_DIR)/%.o: %.cpp
|
||||
@echo "Compiling $<..."
|
||||
@mkdir -p $(@D)
|
||||
gcc $(CXXFLAGS) -c -o $@ $<
|
||||
|
||||
result: $(OBJ_DIR)/$(OBJ)
|
||||
|
||||
clean:
|
||||
-rm -f *.o
|
||||
-rm -rf $(OBJ_DIR)/
|
||||
|
68
2022/cpp/01/answer.cpp
Normal file
68
2022/cpp/01/answer.cpp
Normal file
@ -0,0 +1,68 @@
|
||||
// AOC - 2022 - 01
|
||||
#include "answer.hpp"
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
std::vector<Input> get_input(const char * filename){
|
||||
std::ifstream stream(filename);
|
||||
std::string str;
|
||||
std::vector<Input> ret;
|
||||
ret.push_back(*new Input());
|
||||
|
||||
while (getline(stream, str)){
|
||||
if (str.length() == 0)
|
||||
ret.push_back(*new Input());
|
||||
else
|
||||
ret.back().calories.push_back(stoi(str));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::string get_result(std::vector<Input> inputs){
|
||||
std::string ret;
|
||||
#if PART==1
|
||||
uint max_sum = 0;
|
||||
for (auto& inp: inputs){
|
||||
|
||||
uint local_sum = 0;
|
||||
for (auto& n : inp.calories)
|
||||
local_sum += n;
|
||||
std::cout << local_sum << std::endl;
|
||||
if (local_sum > max_sum)
|
||||
max_sum = local_sum;
|
||||
}
|
||||
ret = std::to_string(max_sum);
|
||||
std::cout << ret << std::endl;
|
||||
#else
|
||||
std::vector<uint> top3(3);
|
||||
for (int i = 0; i < 3; i++){
|
||||
uint max_sum = 0;
|
||||
size_t max_idx = -1;
|
||||
size_t idx = 0;
|
||||
for (auto& inp: inputs){
|
||||
|
||||
uint local_sum = 0;
|
||||
for (auto& n : inp.calories)
|
||||
local_sum += n;
|
||||
std::cout << local_sum << std::endl;
|
||||
if (local_sum > max_sum) {
|
||||
max_sum = local_sum;
|
||||
max_idx = idx;
|
||||
}
|
||||
idx++;
|
||||
}
|
||||
top3.push_back(max_sum);
|
||||
inputs.erase(inputs.begin() + max_idx);
|
||||
}
|
||||
|
||||
uint sum = 0;
|
||||
for (auto& n : top3)
|
||||
sum += n;
|
||||
ret = std::to_string(sum);
|
||||
|
||||
std::cout << ret << std::endl;
|
||||
#endif
|
||||
return ret;
|
||||
|
||||
}
|
41
2022/cpp/01/answer.hpp
Normal file
41
2022/cpp/01/answer.hpp
Normal file
@ -0,0 +1,41 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <ostream>
|
||||
|
||||
template<class T>
|
||||
std::ostream &operator<<(std::ostream &os, const std::vector<T> &list) {
|
||||
unsigned long i = 0;
|
||||
os << "[";
|
||||
for (auto el : list) {
|
||||
os << el;
|
||||
if (i < list.size() - 1) {
|
||||
os << ", ";
|
||||
}
|
||||
i++;
|
||||
}
|
||||
os << "]";
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
struct Input{
|
||||
std::vector<uint> calories;
|
||||
|
||||
bool operator ==(const Input & rhs) const{
|
||||
return this->calories == rhs.calories;
|
||||
};
|
||||
};
|
||||
|
||||
inline std::ostream& operator<<(std::ostream &os, Input & inp){
|
||||
os << inp.calories;
|
||||
return os;
|
||||
}
|
||||
|
||||
|
||||
#ifndef VERBOSE
|
||||
#define VERBOSE 0
|
||||
#endif
|
||||
std::vector<Input> get_input(const char *);
|
||||
|
||||
std::string get_result(std::vector<Input>);
|
||||
|
BIN
2022/cpp/01/build/answer.o
Normal file
BIN
2022/cpp/01/build/answer.o
Normal file
Binary file not shown.
2251
2022/cpp/01/input
Normal file
2251
2022/cpp/01/input
Normal file
File diff suppressed because it is too large
Load Diff
BIN
2022/cpp/01/result
Executable file
BIN
2022/cpp/01/result
Executable file
Binary file not shown.
28
2022/cpp/01/result.cpp
Normal file
28
2022/cpp/01/result.cpp
Normal file
@ -0,0 +1,28 @@
|
||||
#include "answer.hpp"
|
||||
#include <iostream>
|
||||
|
||||
|
||||
void error(const char * msg){
|
||||
std::cerr << msg << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
if (argc < 2)
|
||||
error("Please specify the input file as first argument.");
|
||||
|
||||
#if !VERBOSE
|
||||
std::cout.setstate(std::ios_base::failbit);
|
||||
#endif
|
||||
|
||||
std::vector<Input> input = get_input(argv[1]);
|
||||
std::string result = get_result(input);
|
||||
|
||||
#if !VERBOSE
|
||||
std::cout.clear();
|
||||
#endif
|
||||
|
||||
std::cout << result << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
14
2022/cpp/01/sample1
Normal file
14
2022/cpp/01/sample1
Normal file
@ -0,0 +1,14 @@
|
||||
1000
|
||||
2000
|
||||
3000
|
||||
|
||||
4000
|
||||
|
||||
5000
|
||||
6000
|
||||
|
||||
7000
|
||||
8000
|
||||
9000
|
||||
|
||||
10000
|
14
2022/cpp/01/sample2
Normal file
14
2022/cpp/01/sample2
Normal file
@ -0,0 +1,14 @@
|
||||
1000
|
||||
2000
|
||||
3000
|
||||
|
||||
4000
|
||||
|
||||
5000
|
||||
6000
|
||||
|
||||
7000
|
||||
8000
|
||||
9000
|
||||
|
||||
10000
|
BIN
2022/cpp/01/test
Executable file
BIN
2022/cpp/01/test
Executable file
Binary file not shown.
65
2022/cpp/01/test.cpp
Normal file
65
2022/cpp/01/test.cpp
Normal file
@ -0,0 +1,65 @@
|
||||
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
|
||||
#include "answer.hpp"
|
||||
#include "../doctest/doctest/doctest.h"
|
||||
|
||||
#ifdef SAMPLE1
|
||||
|
||||
TEST_CASE("Part 1"){
|
||||
std::vector<Input> expected_input;
|
||||
|
||||
Input elf1;
|
||||
elf1.calories.insert(elf1.calories.end(), {
|
||||
1000,
|
||||
2000,
|
||||
3000,
|
||||
});
|
||||
|
||||
Input elf2;
|
||||
elf2.calories.insert(elf2.calories.end(), {
|
||||
4000,
|
||||
});
|
||||
|
||||
Input elf3;
|
||||
elf3.calories.insert(elf3.calories.end(), {
|
||||
5000,
|
||||
6000,
|
||||
});
|
||||
|
||||
Input elf4;
|
||||
elf4.calories.insert(elf4.calories.end(), {
|
||||
7000,
|
||||
8000,
|
||||
9000,
|
||||
});
|
||||
|
||||
Input elf5;
|
||||
elf5.calories.insert(elf5.calories.end(), {
|
||||
10000
|
||||
});
|
||||
|
||||
expected_input.insert(expected_input.end(), {
|
||||
elf1, elf2, elf3, elf4, elf5
|
||||
});
|
||||
|
||||
|
||||
std::vector<Input> actual_input = get_input("sample1");
|
||||
|
||||
SUBCASE("Testing input is parsed correctly"){
|
||||
CHECK(actual_input == expected_input);
|
||||
}
|
||||
|
||||
SUBCASE("Testing output is the one expected from AOC"){
|
||||
CHECK(get_result(actual_input) == "24000");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef SAMPLE2
|
||||
TEST_CASE("Part 2"){
|
||||
std::vector<Input> actual_input = get_input("sample2");
|
||||
|
||||
SUBCASE("Testing output is the one expected from AOC"){
|
||||
CHECK(get_result(actual_input) == "45000");
|
||||
}
|
||||
}
|
||||
#endif
|
36
2022/cpp/02/Makefile
Normal file
36
2022/cpp/02/Makefile
Normal file
@ -0,0 +1,36 @@
|
||||
PART := 1
|
||||
CXXFLAGS := -Wall -O3 -DPART=$(PART)
|
||||
OBJ_DIR = build
|
||||
OBJ = answer.o
|
||||
|
||||
.PHONY = clean asdf sample1 sample2
|
||||
|
||||
asdf: result
|
||||
@echo "------- RESULT -------"
|
||||
@./result "input" | xclip -selection c
|
||||
@xclip -selection c -o
|
||||
|
||||
check: test
|
||||
./test
|
||||
|
||||
test: $(OBJ_DIR)/$(OBJ)
|
||||
|
||||
verbose: clean
|
||||
$(eval CXXFLAGS += -DVERBOSE)
|
||||
|
||||
# sample1 sample2: $(OBJ_DIR)/$(OBJ)
|
||||
# $(eval CXXFLAGS += -DSAMPLE$(@:sample%=%))
|
||||
|
||||
$(OBJ_DIR)/$(OBJ): $(OBJ_DIR)/%.o: %.hpp
|
||||
|
||||
$(OBJ_DIR)/%.o: %.cpp
|
||||
@echo "Compiling $<..."
|
||||
@mkdir -p $(@D)
|
||||
gcc $(CXXFLAGS) -c -o $@ $<
|
||||
|
||||
result: $(OBJ_DIR)/$(OBJ)
|
||||
|
||||
clean:
|
||||
-rm -f *.o
|
||||
-rm -rf $(OBJ_DIR)/
|
||||
|
74
2022/cpp/02/answer.cpp
Normal file
74
2022/cpp/02/answer.cpp
Normal file
@ -0,0 +1,74 @@
|
||||
// AOC - 2022 - 02
|
||||
#include "answer.hpp"
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
Move get_move(const char & move){
|
||||
if (move == 'A' || move == 'X')
|
||||
return Move::ROCK;
|
||||
if (move == 'B' || move == 'Y')
|
||||
return Move::PAPER;
|
||||
if (move == 'C' || move == 'Z')
|
||||
return Move::SCISSORS;
|
||||
error("Move not valid");
|
||||
}
|
||||
|
||||
|
||||
std::vector<Input> get_input(const char * filename){
|
||||
std::ifstream stream(filename);
|
||||
std::string str;
|
||||
std::vector<Input> ret;
|
||||
|
||||
while (getline(stream, str)){
|
||||
#if PART == 1
|
||||
ret.push_back({
|
||||
.my = get_move(str[2]),
|
||||
.opponent = get_move(str[0])
|
||||
});
|
||||
#else
|
||||
Move opponent = get_move(str[0]);
|
||||
Move my;
|
||||
switch (str[2]) {
|
||||
case 'X': // lose
|
||||
my = static_cast<Move>((opponent - 1 + 3) % 3);
|
||||
break;
|
||||
case 'Y': // draw
|
||||
my = opponent;
|
||||
break;
|
||||
case 'Z': // win
|
||||
my = static_cast<Move>((opponent + 1) % 3);
|
||||
break;
|
||||
default:
|
||||
error("Part 2 move not valid");
|
||||
}
|
||||
ret.push_back({
|
||||
.my = my,
|
||||
.opponent = opponent
|
||||
});
|
||||
#endif
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::string get_result(std::vector<Input> input){
|
||||
std::string ret;
|
||||
uint score = 0;
|
||||
|
||||
for (auto round : input){
|
||||
std::cout << "before: " << score << std::endl;
|
||||
score += round.my + 1;
|
||||
if (round.my == round.opponent){ // draw
|
||||
score += 3;
|
||||
continue;
|
||||
}
|
||||
std::cout << round.my << " " << round.opponent << std::endl;
|
||||
if (round.my == (round.opponent + 1) % 3){ // win
|
||||
std::cout << "win" << std::endl;
|
||||
score += 6;
|
||||
}
|
||||
std::cout << "after: " << score << std::endl;
|
||||
}
|
||||
ret = std::to_string(score);
|
||||
|
||||
return ret;
|
||||
}
|
36
2022/cpp/02/answer.hpp
Normal file
36
2022/cpp/02/answer.hpp
Normal file
@ -0,0 +1,36 @@
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include "lib.hpp"
|
||||
|
||||
enum Move {
|
||||
ROCK,
|
||||
PAPER,
|
||||
SCISSORS
|
||||
};
|
||||
|
||||
|
||||
struct Input{
|
||||
Move my, opponent;
|
||||
|
||||
bool operator ==(const Input & rhs) const{
|
||||
return this->my == rhs.my && this->opponent == rhs.opponent;
|
||||
}
|
||||
};
|
||||
|
||||
inline std::ostream& operator<<(std::ostream &os, Input & inp){
|
||||
os << "my: " << inp.my << ", opponent: " << inp.opponent;
|
||||
return os;
|
||||
}
|
||||
|
||||
|
||||
#ifndef VERBOSE
|
||||
#define VERBOSE 0
|
||||
#endif
|
||||
std::vector<Input> get_input(const char *);
|
||||
|
||||
std::string get_result(std::vector<Input>);
|
||||
|
||||
inline void error(const char * msg){
|
||||
std::cerr << msg << std::endl;
|
||||
exit(1);
|
||||
}
|
BIN
2022/cpp/02/build/answer.o
Normal file
BIN
2022/cpp/02/build/answer.o
Normal file
Binary file not shown.
2500
2022/cpp/02/input
Normal file
2500
2022/cpp/02/input
Normal file
File diff suppressed because it is too large
Load Diff
18
2022/cpp/02/lib.hpp
Normal file
18
2022/cpp/02/lib.hpp
Normal file
@ -0,0 +1,18 @@
|
||||
#include <ostream>
|
||||
#include <vector>
|
||||
|
||||
template<class T>
|
||||
std::ostream &operator<<(std::ostream &os, const std::vector<T> &list) {
|
||||
unsigned long i = 0;
|
||||
os << "[";
|
||||
for (auto el : list) {
|
||||
os << el;
|
||||
if (i < list.size() - 1) {
|
||||
os << ", ";
|
||||
}
|
||||
i++;
|
||||
}
|
||||
os << "]";
|
||||
|
||||
return os;
|
||||
}
|
BIN
2022/cpp/02/result
Executable file
BIN
2022/cpp/02/result
Executable file
Binary file not shown.
22
2022/cpp/02/result.cpp
Normal file
22
2022/cpp/02/result.cpp
Normal file
@ -0,0 +1,22 @@
|
||||
#include "answer.hpp"
|
||||
#include <iostream>
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
if (argc < 2)
|
||||
error("Please specify the input file as first argument.");
|
||||
|
||||
#if !VERBOSE
|
||||
std::cout.setstate(std::ios_base::failbit);
|
||||
#endif
|
||||
|
||||
std::vector<Input> input = get_input(argv[1]);
|
||||
std::string result = get_result(input);
|
||||
|
||||
#if !VERBOSE
|
||||
std::cout.clear();
|
||||
#endif
|
||||
|
||||
std::cout << result << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
3
2022/cpp/02/sample1
Normal file
3
2022/cpp/02/sample1
Normal file
@ -0,0 +1,3 @@
|
||||
A Y
|
||||
B X
|
||||
C Z
|
3
2022/cpp/02/sample2
Normal file
3
2022/cpp/02/sample2
Normal file
@ -0,0 +1,3 @@
|
||||
A Y
|
||||
B X
|
||||
C Z
|
BIN
2022/cpp/02/test
Executable file
BIN
2022/cpp/02/test
Executable file
Binary file not shown.
41
2022/cpp/02/test.cpp
Normal file
41
2022/cpp/02/test.cpp
Normal file
@ -0,0 +1,41 @@
|
||||
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
|
||||
#include "../doctest/doctest/doctest.h"
|
||||
#include "answer.hpp"
|
||||
|
||||
#if PART == 1
|
||||
TEST_CASE("Part 1"){
|
||||
std::vector<Input> expected_input;
|
||||
expected_input.push_back({.my = Move::PAPER, .opponent = Move::ROCK});
|
||||
expected_input.push_back({.my = Move::ROCK, .opponent = Move::PAPER});
|
||||
expected_input.push_back({.my = Move::SCISSORS, .opponent = Move::SCISSORS});
|
||||
|
||||
std::vector<Input> actual_input = get_input("sample1");
|
||||
|
||||
SUBCASE("Testing input is parsed correctly"){
|
||||
CHECK(actual_input == expected_input);
|
||||
}
|
||||
|
||||
SUBCASE("Testing output is the one expected from AOC"){
|
||||
CHECK(get_result(actual_input) == "15");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if PART == 2
|
||||
TEST_CASE("Part 2"){
|
||||
std::vector<Input> expected_input;
|
||||
expected_input.push_back({.my = Move::ROCK, .opponent = Move::ROCK});
|
||||
expected_input.push_back({.my = Move::ROCK, .opponent = Move::PAPER});
|
||||
expected_input.push_back({.my = Move::ROCK, .opponent = Move::SCISSORS});
|
||||
|
||||
std::vector<Input> actual_input = get_input("sample2");
|
||||
|
||||
SUBCASE("Testing input is parsed correctly"){
|
||||
CHECK(actual_input == expected_input);
|
||||
}
|
||||
|
||||
SUBCASE("Testing output is the one expected from AOC"){
|
||||
CHECK(get_result(actual_input) == "12");
|
||||
}
|
||||
}
|
||||
#endif
|
33
2022/cpp/03/Makefile
Normal file
33
2022/cpp/03/Makefile
Normal file
@ -0,0 +1,33 @@
|
||||
PART := 1
|
||||
CXXFLAGS := -Wall -O3 -DPART=$(PART)
|
||||
OBJ_DIR = build
|
||||
OBJ = answer.o
|
||||
|
||||
.PHONY = clean asdf sample1 sample2
|
||||
|
||||
asdf: result
|
||||
@echo "------- RESULT -------"
|
||||
@./result "input" | xclip -selection c
|
||||
@xclip -selection c -o
|
||||
|
||||
check: test
|
||||
./test
|
||||
|
||||
test: $(OBJ_DIR)/$(OBJ)
|
||||
|
||||
verbose: clean
|
||||
$(eval CXXFLAGS += -DVERBOSE)
|
||||
|
||||
$(OBJ_DIR)/$(OBJ): $(OBJ_DIR)/%.o: %.hpp
|
||||
|
||||
$(OBJ_DIR)/%.o: %.cpp
|
||||
@echo "Compiling $<..."
|
||||
@mkdir -p $(@D)
|
||||
gcc $(CXXFLAGS) -c -o $@ $<
|
||||
|
||||
result: $(OBJ_DIR)/$(OBJ)
|
||||
|
||||
clean:
|
||||
-rm -f *.o
|
||||
-rm -rf $(OBJ_DIR)/
|
||||
|
77
2022/cpp/03/answer.cpp
Normal file
77
2022/cpp/03/answer.cpp
Normal file
@ -0,0 +1,77 @@
|
||||
// AOC - 2022 - 03
|
||||
#include "answer.hpp"
|
||||
|
||||
#include <algorithm>
|
||||
#include <cctype>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <unordered_set>
|
||||
|
||||
std::vector<Input> get_input(const char *filename) {
|
||||
std::ifstream stream(filename);
|
||||
std::string str;
|
||||
std::vector<Input> ret;
|
||||
|
||||
while (getline(stream, str))
|
||||
ret.push_back({.content = str});
|
||||
return ret;
|
||||
}
|
||||
|
||||
int get_priority(const char &c) {
|
||||
return std::islower(c) ? 1 + (c - 'a') : 27 + (c - 'A');
|
||||
}
|
||||
|
||||
std::string get_result(std::vector<Input> input) {
|
||||
std::string ret;
|
||||
|
||||
int score = 0;
|
||||
#if PART == 1
|
||||
// filter through the first half to find common elements
|
||||
for (auto &sacks : input) {
|
||||
size_t size = sacks.content.size();
|
||||
if (size % 2 == 1)
|
||||
error("sack does not have even number of elements");
|
||||
|
||||
std::string sack1 = sacks.content.substr(0, size / 2);
|
||||
std::string sack2 = sacks.content.substr(size / 2);
|
||||
std::unordered_set<char> common_items;
|
||||
|
||||
std::copy_if(
|
||||
sack1.begin(), sack1.end(),
|
||||
std::inserter(common_items, common_items.end()),
|
||||
[sack2](char c) { return sack2.find(c) != std::string::npos; });
|
||||
|
||||
std::cout << sacks << std::endl;
|
||||
std::cout << common_items << std::endl;
|
||||
|
||||
// get priority of items found
|
||||
for (auto &item : common_items)
|
||||
score += get_priority(item);
|
||||
std::cout << "score: " << score << std::endl;
|
||||
}
|
||||
#else
|
||||
std::vector<std::vector<std::string>> groups;
|
||||
for (size_t i = 0; i < input.size(); i += 3) {
|
||||
groups.insert(groups.end(), {input[i + 0].content, input[i + 1].content,
|
||||
input[i + 2].content});
|
||||
}
|
||||
for (auto &group : groups) {
|
||||
std::cout << group << std::endl;
|
||||
std::unordered_set<char> common_items;
|
||||
std::copy_if(group[0].begin(), group[0].end(),
|
||||
std::inserter(common_items, common_items.end()),
|
||||
[group](char c) {
|
||||
return group[1].find(c) != std::string::npos &&
|
||||
group[2].find(c) != std::string::npos;
|
||||
});
|
||||
|
||||
// get priority of items found
|
||||
for (auto &item : common_items)
|
||||
score += get_priority(item);
|
||||
std::cout << "score: " << score << std::endl;
|
||||
}
|
||||
#endif
|
||||
ret = std::to_string(score);
|
||||
return ret;
|
||||
}
|
33
2022/cpp/03/answer.hpp
Normal file
33
2022/cpp/03/answer.hpp
Normal file
@ -0,0 +1,33 @@
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include "lib.hpp"
|
||||
|
||||
#ifndef PART
|
||||
#define PART 2
|
||||
#endif
|
||||
|
||||
#ifndef VERBOSE
|
||||
#define VERBOSE 0
|
||||
#endif
|
||||
|
||||
struct Input{
|
||||
std::string content;
|
||||
bool operator ==(const Input & rhs) const{
|
||||
return this->content == rhs.content;
|
||||
}
|
||||
};
|
||||
|
||||
inline std::ostream& operator<<(std::ostream &os, Input & inp){
|
||||
os << inp.content;
|
||||
return os;
|
||||
}
|
||||
|
||||
std::vector<Input> get_input(const char *);
|
||||
|
||||
std::string get_result(std::vector<Input>);
|
||||
|
||||
inline void error(const char * msg){
|
||||
std::cerr << msg << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
|
BIN
2022/cpp/03/build/answer.o
Normal file
BIN
2022/cpp/03/build/answer.o
Normal file
Binary file not shown.
300
2022/cpp/03/input
Normal file
300
2022/cpp/03/input
Normal file
@ -0,0 +1,300 @@
|
||||
wgqJtbJMqZVTwWPZZT
|
||||
LHcTGHQhzrTzBsZFPHFZWFFs
|
||||
RnLRClzGzRGLGLGCNRjTMjJfgmffSffMqNgp
|
||||
WPLgsfLmLgqZvZgSRR
|
||||
RbwHdbDdQFFFMvvMjbhqhZZS
|
||||
lzTdldBDszfGcRsr
|
||||
ZjnhJjMjnbdnbHdFLmmfFLmnCCWFFl
|
||||
PpNwtRsNsZSsRwCfzQQBfQszCBsC
|
||||
PpwcqqVZRtbggggjcgJJ
|
||||
ntczBcVcgnHzgBHnVntcBBFhgsmmmssqWNWNWqLvNhsqTN
|
||||
bSSGdSDZbGSGdDmLmGTvTGmLFFhm
|
||||
PlFbDpJDPbPdPbZQZDZlSCDBfMVRwBzBtBQzfzRHVMVRtH
|
||||
fDVrmmrvcmCcVpfcfGlswpPwsttMpjJMPPjjtP
|
||||
RgSTdndFLbJqqPssWWjPWjPjHS
|
||||
FqgzQnTqJRRQqLLhTCDhDCDmcmlvvlhcVm
|
||||
nnqVtHbfVHZVmtlvmHtZtrFSFTRRFhRccTbrLsLSGr
|
||||
cCNJQJPJQgjjMQdDrGGsRhTFGFRFSpMS
|
||||
gzdCwWdjNPgzcJgjwdZtVlHHmvvmZlvffHnz
|
||||
FFgsgwNwWvggQsMWDwvQQvQcccdcJZDtJGBtVGGGtcVlzt
|
||||
rjfTrbjpjRSRTbTpzldjjHBtJGBdltJG
|
||||
RbrPTfpCfmbpmnfRRCvMvQWNBwFFgMsgBL
|
||||
zzLHgjjjdFHWbGBjjzcbgQRmSvqsSpmRsRSQSmRMWv
|
||||
ZfJVrwPhZhZlhQQqBSQSNSqM
|
||||
tnCfrDCltfPzHFFLBgngHz
|
||||
DCpwrrMhwCrCMVCpGFqpVDnWWTWBtnTWvWfvbbTdFWRv
|
||||
lmhhcsQPmTtTnnPBTB
|
||||
QmcjNJsJzHNljZsNqDCGGhwqCqhgDDZV
|
||||
hLfRnSLfhcndCCPfJJjzJfzt
|
||||
pHNWwDpGGNJBZjjNNj
|
||||
gmgwwHpWTpmGDmDTggqHmmDSsnnhvcqScdVVSVcjLrRcnq
|
||||
CdlTJgnQJVCllNVWTPZBmPPGhGRmghPRGs
|
||||
wHDrSwtHbmhRvHVZ
|
||||
DzzwrtVFjLNnMTCTLCWW
|
||||
SppdsnGpNVnZZZLPMlMPGq
|
||||
mdcfvTTbBddLJgZJLlcFqJ
|
||||
fzTvfwjjfzzCbvvjvQjWvNHVNNVWrRtdnVNppNprDp
|
||||
lmlCGTmNbZlbSFlbNGfnzWfWzCdWWfVdwRCf
|
||||
jDHtHHvLjQtqrsqpjBBLprRzwfwJfzzhRnczhWQVwzVR
|
||||
rqpPtpPjDqpqDLtLrPGGFSFgPlNZZSGMPnMZ
|
||||
pSHShqgSMzVpphFnJMFMBtssdjRJ
|
||||
PZDbZfmCDgDfDNQPwCflCQNJsjRBRBFsdBWBsJRjsbsFJF
|
||||
DQvCwwZrPPlffDmQCDwZQPmPhqVTcGhSHSLTpSGhLHzpGghr
|
||||
gPqgqqmmmPgsqvGmsMCCnfZZfvBpWZhVrrZdHBvH
|
||||
TSlcttTjRTDlDDTRhZVdrHHpWVnfVrtd
|
||||
SFJzFzcJjcRJwGGqJMMCwW
|
||||
gzWNLSjRLzlNqqQMLhvQccGGmcQm
|
||||
fFrttPdTFTrpVwGpbdVQQp
|
||||
HnTBGfHTGzWWqCqngn
|
||||
SddrLdVpjjVSgRBszFswzwlV
|
||||
mtPMbMqPMvqHHHDTTglBvsFshFFg
|
||||
bmBHbtPctMtbMNMtbPtPqHmMjpdZdcJGrjSWWZGjJZnjndWj
|
||||
nljWJHRHGrDcMBbDLZHV
|
||||
wdvwmhghhbtBMcLtwZ
|
||||
gvQvvghTfPSmpmQljGFRjQbFGCsJbC
|
||||
BmphBWmDBBQfpVgQZpjg
|
||||
rqqGrrrqlnqqHqjNnVDSSSgQQffj
|
||||
FqLrbsLFsbLbLqHlMrmwwPDcCmMMmJBwDJcC
|
||||
wZccfslqZPFFjrFbFfQQ
|
||||
vvTvVWCJJZVBWCSvnVJJrhjQVMjVjzbgMQbjpphh
|
||||
BBmNWBvZRvSqwsGwssPcmc
|
||||
LGpnfcnzfzQdNFNHqHJptq
|
||||
RBNNvZSBRbRCCDJqHrDZqHFZtw
|
||||
SRNhRsNhWSNWsRRvgjngQnnMTnTgQjGMff
|
||||
twtZmwqBHtmqnnmlGLfcfvQQ
|
||||
dgMSPSMdQGclRRdF
|
||||
pVMrDgThDDlPWPWbBZtZqqttBqjqjT
|
||||
PPSWCGSzpCCQwNsNPFhTNVbB
|
||||
vqcgJngqLLcZLvBhNTVlbsvdFF
|
||||
DDmHgRjHZhHtGfWpQH
|
||||
sBLbwWWBvsBsqLqStRjcGGRnggjGcntJDn
|
||||
NCMQPMQPMQNzGGRRgRJRGzcG
|
||||
dHQNfPCFTQfFfVVNvwwJvSWSqWqrSqdS
|
||||
prDBnnDpFDprnDPBDQBvpBZttcSqSZSZcScFJSHcZJtz
|
||||
VhMVdLsjdqVWJSWZZZcHst
|
||||
hLVdGLfqjGjlfhCfCLjTTmrlpQBPBmvnrgDgpp
|
||||
SSSTJmmgbGwtmRZHCCZRCH
|
||||
FWcPQrrWqflzSWpRHZCZHRSt
|
||||
PSQzzdcQTghdndDJ
|
||||
cLlrNPvljRhRgTlM
|
||||
VmDBGnVdmJDnDBndnnVwDRvMgRsTbTzMMsgZghzzsB
|
||||
SpHvmGnSDJnwvDQqfrCPLpPLCfpF
|
||||
PppbRCCgpzzQCgCSgZTlNNTWnNNDNlRnGl
|
||||
hwMhLtBcBdjjNzWzlclcNGTs
|
||||
FjJFHJwhfwLHMLJLwPmqfQPgVCmQgCmCzC
|
||||
jTtMqFjMBqBmTntTztBTnTZBRZRLpLJgDgJNhghJrNNhhLJh
|
||||
DCDdvdGsVDVsflVdQSsfSwhRJlgppgpRpbWLgJbJpgbR
|
||||
wfSHSsdSVvQSwfwQPQPqHtFDcMzmtjBntqMTqn
|
||||
HQhQWLCSHCSCjnjQdSJdCSQgTTmZPTVZmqnTpPtnpmRmpp
|
||||
vDrzhvGzfchvlGvMFMrqVqPgZVVtZtVRgZgm
|
||||
bcvMfwvDsDfbvfwDbbdhCShWCBLLJWjHsHjj
|
||||
zLSsJNCjsjLCNLCgGcwBPPdwBwqwqz
|
||||
WMFZprZDbrddWRVRRDvlPPBcPhhlBqqHPGPhhffg
|
||||
VdbFvZWWWZZDFTLtCmNntjTnLSnn
|
||||
JLVhhwRbhVwcLFJFhhJcccqwsvpRlllvpWvZSBSSSRsNWpzl
|
||||
jgzfPffgZNspgZQS
|
||||
fjCmDCGnfmTfFqrFnhqbFzqt
|
||||
SfMRRNHSNNLfRfHcRRsqwdCCsssTqBCvgBLv
|
||||
llDDWQnFGtQnmtGQDWQFsgdHVBddndHsgqTsCTsg
|
||||
GzGjpWmWbmQmbpGGmGjHSrZcMfZSRPJPfcMRcb
|
||||
PDdMdRTRrLDSwzJvfSvJ
|
||||
FnjQnsqsFTnStvplhhzzFS
|
||||
TBHHCsgVRRcMHbLR
|
||||
GcLdGBJvBvLJHccJBvqHpGzDFfzwfzjwhDwrSFpfpDSn
|
||||
mZZrTTQVmQmlsMPVblZQVZmfCwjzzjChzCCbDSzhFjfnSb
|
||||
gZlRlZNPlmlgTTPmNRvJWcqrNLdvHWLBcHtH
|
||||
jWWbBwgwWwwtvvSCtHvgWsMFmscHzTGMmcssGFTTGz
|
||||
ZrLtpLnlfQJqnfJtpLnZlrqdNNGqcDNNFFTNDzzMMTMsMNMs
|
||||
LJQrnZnfLZnlrZflJJRVRQbbwBgCtCVjWgjBjjgbPjBB
|
||||
fqQVfRqSqmpnlLnm
|
||||
jFcjMJTjhwwggjFtgzCHmCzCmGzGlzpn
|
||||
wstMFFjWDfQRvmDPSB
|
||||
PgTFGPgcBZPcHPFBZRjGPgwCnmwCsmSdQdThmMMMQCQS
|
||||
JbpvWtvfHblWDHJDzmndSdMQnSwCdhMdQD
|
||||
rfvWlLlbtfJvvLJpqWbbqZRRGPVFNHVFgZNVFBgH
|
||||
TRMrrGBLMLPtbssTGtBHwZmdQQbdNzzZZNZZdwjd
|
||||
CVlVhCnclvhWSFFfQrWNrjmpNfwmjZ
|
||||
rlqFlclChhCvnlDvgVvRRtPtqTGJHRMBRTPPqM
|
||||
gZzCrQGQdrQvZHPTHWDbTgWPJM
|
||||
nSpLlcnnVjsSVLLnLSnhLSsJPTTWFsqfbPMFMqJDbfqM
|
||||
VwwnpwLnlPdQCwPPCC
|
||||
lRlrnlrsrMlhVsRnVhGPvCFNcPBDBvccrCGr
|
||||
RZQTzWTRdDNvBDdNcC
|
||||
TqjZbWRHmlMJgnmsng
|
||||
scQmLfQBQQvvZfLsmmvDJwpgSNSDDdcJSSwTGD
|
||||
PHlMbtzCCnlbztMRzlPNNdNwGpDpwgwptNLGpw
|
||||
rRHnLbhCzbbCHnHjMbzzjzFZmfQqWZQqvmhmfVZmqFBW
|
||||
fLTQWTMQtjcCGCJCbf
|
||||
gGsmsVSzmjCFHJCJgg
|
||||
SPRsSwSvBsPRPsqzwSVqzmhVWtLWhTDNLlTDtLTWGpNMtDLt
|
||||
mbzRbchRRQzzssLdhLggLddJ
|
||||
DCqDNNNWvDvjcPLsJcLLdv
|
||||
cpFCVNnVBHtbfFRtMRFf
|
||||
PFRcCCPtsDDDtjVspgwmgTNpTgTpspsw
|
||||
BqqqdJdHdMgSfMmZpZND
|
||||
vDHJGdLbLzBJdGnDdrBqVtCzWPPhthtPFzzPCFtV
|
||||
HvhvHdFdvJDfHdZdpfhrmGPljPRrGPPVDGrWWC
|
||||
NMMsRBMzcRRMMBSzcnbmNGrCVCWrCqPClmPqlG
|
||||
zLBbwMzQnRSQMThtZFLvpdgHtJfF
|
||||
DpcJcJPmMcLSHHZCfpnH
|
||||
BsBFvvqTFlbhgdbBBblfZLCLzfHWfjnjLCnCrh
|
||||
dTsNgqFvNgsGlZJRtVtMPmtDmG
|
||||
LdGQqzPGCCjJTJdTLJQJtFcFRSctcrFNFltPFtcc
|
||||
HphMMbbMdBMHbBhhgHMnhvwFFvtrlSNRNgcRllcvcc
|
||||
spHMhBnHnnsmWdnsnMBMdVGGmzjzLmZLDQCCCCZjqjTD
|
||||
DDZMzcTRgDMLzqCffhfWfcWnfj
|
||||
NsHVVJmswwSSwNPPNjnhqhnCCnhNvjfTnv
|
||||
rSSddrGSGrlMrpTpQT
|
||||
bbbfCfrLHMMMWVWC
|
||||
SqsvNZqQvvqcjNvqZsMMwgFgFplTHQVRFgWH
|
||||
BSZWWqBZBjmPGJGLbBtf
|
||||
RNCNfzfRHmzHwSdRdGfzRJPqFcFcDFGccZZqtLtGLtgl
|
||||
pjhVMhvhbjvPcDJvcZqt
|
||||
bsQMTsjppmSdTnHSJH
|
||||
PtLwpSwdSJwQnGvvqtvMhZ
|
||||
TlFcHlTjVjsDTQnCQhbZGCVVnb
|
||||
cjljTslTrlzzHDNRfNgLSNBJfBwNfG
|
||||
HvsZZqqqwWZswWHTmHsvvfhSfBfDffjchfBbhD
|
||||
MCpnCVpQClRNnlNQVQClfDhScmjBfLhmLDGbBNbS
|
||||
gmtpJpQQllJnWdZWwJWFwJJT
|
||||
TzBvBwwdhgRPGHlRHh
|
||||
NLWttJsrLWttppLpsGlsmVbVGRljGDRgjV
|
||||
MlllnNFnnQqCdzqq
|
||||
vptzrJhMMGGMptJPhJGJPvdFTFcSsTBVsczBScTSFFfn
|
||||
gbRjWgRjCqjZnfHCHnTSVBHF
|
||||
mRwqNbmqlbbjqRNlLbNrDJntNDGtDhNpGMrpvJ
|
||||
GPWZLgWqLHHGbgbbGPPmqHqfcjjRHJJBDRBRjBBjMHjwvwQc
|
||||
dhpFSpzVSSMSlDBvMQ
|
||||
TndsVNztVTspnsdpshtmZLPCGGNPfgqbWWfDGb
|
||||
CbqDjjCdClqgrfJvrv
|
||||
NGNPtGGzzHztPWWnlgJvfBnWBFgp
|
||||
hGzNHhsmGccwHPHZHcwdCCdbTVRTvSmTCjbLCb
|
||||
sqnqsHGpJbqnrbshpshHmmmCWZZmWwfTjTjHmfLZ
|
||||
dPggRgSDDttMFgctgdDtDcDcRWJBmjTWwmRLBLfmwBBjZWTB
|
||||
PFcVPlJPglbqhhrnnlNz
|
||||
wZdDNDdPPfhqwWqbsF
|
||||
VTngRzpnzMLvzTCLlhvDfltqqDttqFqs
|
||||
mggTVpCDDSNjBmPZrd
|
||||
cSdqJSTTTJcSJpCdQbqTCPPdjdDtGzwzjDwjwwwwzD
|
||||
rVvsBBVgsVBhHhfljtgbPgGtWjPtwt
|
||||
fvHsVZHVnRHpSJJRmbbSLT
|
||||
lDDPRRjwLGlvVRDRPlwwwPvmpSfhVWSzhqfzqpHpVpVHfqSH
|
||||
qBnqBNsBBChhCSfZ
|
||||
nTQbQnNNQJTLvlmTPLqqmG
|
||||
TTCJhDrmDpRVhvhHfffwzwfz
|
||||
dmmdmglWcqvHvWsHzB
|
||||
gdQMZbtlgQlZcMSttCNmVVrLSTTJ
|
||||
PLZLqhZZzZLBjjjGrrPjMH
|
||||
CcQcCcfRlWDjdrMrBrHC
|
||||
WlWFMcFpcRFmsWFcmflqSJzTqzwLvshggsZJwz
|
||||
LgqRDDDHHGTpgpJrQrQhhhCqrwPw
|
||||
ZSBWjjFshCFlQDrJ
|
||||
SjWnnbWtWnsztgGDDbDTGgHHGp
|
||||
llfvMlvzjzGzGRfvMSGRfSdStrCtQNCZrrFdJJLnNtLZ
|
||||
shhhshPHsTTqsBHTVTwTwZZnCtQrQnJtQCCJBCCZdZ
|
||||
TPHTPTHmDnljplfpGfGm
|
||||
qcNTmvvSvTNrWhRrTdthzW
|
||||
bDVJphpMMJwJpMHtrrttWsgwtzRW
|
||||
bFpGJbllPfplVQmnhvvcSmCFqq
|
||||
GTPJGMQTPQMqZjHTBmnndBVddHrrzNrz
|
||||
bbcRFgDpptRbffwmzmrvLmcZvmLmLv
|
||||
WCwgWbpgwtgfpfMlQGPhSPZWTZPl
|
||||
DsPCswsMPBMwPDCVJPnTPPWFGJNJmbJW
|
||||
RvvddfvftdtvNzghGSbFnWTntJSttGbG
|
||||
LNgRddgRlgzcgCDjjjHjcBCwcM
|
||||
gnVtgBnpwBgShBgcwhJJhjCMMMDmLRjDRMjrDMMMDMqMRF
|
||||
slsblHPNHlbTNbsPvszHQWbzqrZLMRmFMFmdFmrtDFdMLNZD
|
||||
bPzfvbfsvvlHtlzPHllHGTlTppCJpgcngcpwnwCGGJnnShwV
|
||||
cgQRgtzDbHPcgHzQWpTjTLdjjNNpNLsDss
|
||||
nwccZBmwcJqmJnjsTvmlTSsdlTNs
|
||||
CCGFCBVrBwwGBhqVnZBrqWMMQzHfQcHzzzPtfztGfg
|
||||
lhnwnhlbgbngbcfDgJLJQqDdVd
|
||||
FSrvtMFZVJJJVtcq
|
||||
jZNNNNjmjSPjFTJmGGzswwzHwHpBsbPblhhW
|
||||
tnDWHntzDtzQBZLMLzNLDDcRFFjhJBmcFRCTjRchcRvT
|
||||
sqwsPlbGfSbPGSVbJfpjjhcTFmCRjjvmTTvRdw
|
||||
lJqSqPVbgGSGrVSqJqflbWZQNDMLHnrQQWNDMtQMQz
|
||||
lpltwwJqsWVLPtVt
|
||||
DGHsDdZQzHLSLZcFRrFS
|
||||
BGsGCnHmMlMwCfwT
|
||||
nrRNzRMPrrPnNwNzTSFSTNtqZdtMttvQqQmjdjvZpgjZ
|
||||
GWVhGcGhHhGcffbZGDmmtttQvpdtbpppdj
|
||||
HGlHBhHGJfJJhCfZzLTTNnNrTnCNwT
|
||||
jBpCZStjBwWrQCMrhw
|
||||
TvcHBzHdPPzdvFTzzJlvzdQfThrhhrhfQTWMQfWMqfwf
|
||||
bzGJJBJcJvdvBPFzddGgjZSbZZngRZNNnnsjRs
|
||||
dqPqbpPFJfsFfMcNQNNtNmzrNQJn
|
||||
VVBDWvwZWDLwGlDhLGWWVcmQtSNmLmtSdSSTmrcQQm
|
||||
lZlhwDCdhhHllvWvjMHbgMpgffMggpPb
|
||||
SWSFLLFWDSWDNFzmmLMfGlfsdfnJMBfwMGVnBf
|
||||
vPtgZcctcTQQZRRcgCtZwRfqBVGqnVTBGVnqlsdBJnqV
|
||||
RcjgwbbgNSbFbhDb
|
||||
JrRZLrHvjQFPLnnBPQ
|
||||
DhwbtHbzpcpFTgtQ
|
||||
zlDwlHlzWSwDqhMMbSJVZVvrCrCZJZNZdJ
|
||||
fgNCZSDtDfDZTrTfqWghQGzGQshgpGGFQg
|
||||
RFvLnvFjnVjmLQGPQWLmWh
|
||||
MdwwVMFbMdRHFbccbCZJtbDJrqqJZNJZCZ
|
||||
fdZVBMMdfdfBCzhTzMdMCgCrGGrpQJmSmGJGmpJQVpLmqV
|
||||
RbFnhNsvlDsFHttllGmqGpPLvJpmPJSqLL
|
||||
tjNsDnNwbNjttNNZTzhMWzcZcMTwMd
|
||||
DjSSMShjRjPCbDFCdCSDbpBBswfNWZBZZrBVBPNfVmVf
|
||||
zltLjLqqGlzQntqqGztqcgncZrVrmNfNwWBVrVmrgwrfswsW
|
||||
qcTqHLlnJzGznLJtHGhMbhjFhMMpFbpbThpp
|
||||
ZVFZcctFQzsCtbZFnPPHqmqpwmvPmp
|
||||
NrjGfMgcLLcfdLqpmRwRRqJJmdPw
|
||||
LMNDgMBGlgGDLMNDGljctVbVWZTTCWChhTttsl
|
||||
RMGRRhhgzgZMtHdGTtvDwDJFCDvvwdvwqFFv
|
||||
rfrrjLNmmSnSjVSmNNPPbJVbqvqsqvhvFqCq
|
||||
flrpnSlrSNfjrNjSphNSWlHRGzTgtQGHQtttBTRBRQHW
|
||||
tplDDprhbvprvrJDprCpbsvHRfzSzTtzmRqSTznRRBRnSfFF
|
||||
MVwWjVNVQGfcMnTmRnBm
|
||||
VQwGLNLjWNWPGjZbsDBppBZhhDvBlZ
|
||||
RVVrGVVchRZsnzRzBWZb
|
||||
FQHWWCHwQmWmlqfCHSwJnsbNJnNsvttntBtb
|
||||
QQSFgqgqLMLPPdWdMVhWDT
|
||||
cZrMjncTdfJpPJbr
|
||||
WHNqnQwwCwvlqHtCtHNslNlvLLPDfSVdVPVDVSfVSbftffVf
|
||||
NCwwwQwllwnvgsvZzgzFZzBzjGGGMM
|
||||
MvHpfzcTcZzpphhbsDSTStsltqSDtS
|
||||
PRmnwCrWnWQrmNMRNnlNGbqlbDltdlbDtNtD
|
||||
CRJnmRVWJfgMLvcz
|
||||
HPFbHrrwLdVdgbDZqcphCqSZBhLZ
|
||||
tQRfRRGtvTNNSGTMjjmDCRhmqpBChqhsRDZh
|
||||
vjSfMzGQNQQnMtNTTWNNjgblFdFHwgdJJHHPwddgnr
|
||||
BggPRVBPPgfCBmJTjTTqpTNpZBwMbr
|
||||
lclLLllsQLFlsbMqNrMwTpwpcM
|
||||
SvbDzSDbWFJfWPPgdnfR
|
||||
GbpSSbGDNbSSJbDZNZbDppGtMntHLHvHCTLCJMHnRCMLTT
|
||||
cdwddjBfPsmPPQqQqscnHgRMtngvtjjgCCTMzM
|
||||
WvwPvWvflBwdQPlNVVhbDGpFhNGhbl
|
||||
WZRGmRvpCRFTZMQQQMCdddDDcD
|
||||
lqgqsgvjVtbMDzzbtcDQ
|
||||
NsNNgjNNjsNhnSvRmnpGRmSTSG
|
||||
nTgFtDTDDLrFBStdGdcHcbvGSc
|
||||
QPzfPCMzWCjfMPJhWGlRbRWRWrRRdVVH
|
||||
zhCrCQCjPrpNNBsNspNnwq
|
||||
zTJpqFzbTzsWsVbbfLGfSSCDNSBCHfMLHG
|
||||
rZcvtmhctrvmlPPmmmrhhmBLCHDCCLLDlqMlGMNDMwDC
|
||||
rRhRhnnQPZhtZcZtdttZgqFWWVjssqQpppWpFpJW
|
||||
NWPhdWJPWVzVqQrqmSsPbrPP
|
||||
cZDRjGsffGsCDfffgjGgRQSrTcTmSlTrbnqmSSrlln
|
||||
fFGCjGCjLDLFRgfDHZvzLVWtvsWWBtzJNWMB
|
||||
qMVbtnmMMTpCppsR
|
||||
NffHGrWzWWgDBfTRhChCnSCWcnjT
|
||||
QrlQBPBrlPHrrQlrHFLqPnLvVvbVmVVJtq
|
||||
MVMpHMZLVCpMrfWjvWnfrJ
|
||||
hlblzDDzwlSlGtRhRlSdrfGGWnWWfFPjJjnfqWGF
|
||||
lmlhBRlDhhhDRRhwDmBpHJmsNCHmCgNHJCJLsc
|
||||
jvsLgmqLgHvbPPVbNjSCjC
|
||||
pwTcRpRWLRMLJJFwBBGWcFWNVlDDCSTVttNPblZZCVVDlP
|
||||
GcdhccpcpRpGRhGmfsHHzLQQHrmsnh
|
||||
FMmSRgtMltMnVgnmNvlrsJrsZWjspvsZJp
|
||||
QbdhqwqbNqdHbTdcbcpsrpvjfWfLJLfwJrWp
|
||||
DQBBQqQGccdTPGqqBNtFGRSMRSFGtnVSnnmM
|
||||
fPjGrfFrrprprdrbQPZwlcZwZmlJwH
|
||||
qvNnvWnvWDvSvqNtWSLWStqbcJBQwQJwQZHLBZbcmJbblb
|
||||
DMtvqSvvDtntCRfwzGCgdzzFjG
|
||||
TfdZgtmfDgqgvlLFFsFHvcvZ
|
||||
pphWQMVjQVVBWWjRlHlHnlcLDDhcnF
|
||||
JQwwWVPBwMJpJwpWwGBWNzrDzSSzfgTPqTSTTtSPgt
|
35
2022/cpp/03/lib.hpp
Normal file
35
2022/cpp/03/lib.hpp
Normal file
@ -0,0 +1,35 @@
|
||||
#include <ostream>
|
||||
#include <unordered_set>
|
||||
#include <vector>
|
||||
|
||||
template<class T>
|
||||
std::ostream &operator<<(std::ostream &os, const std::unordered_set<T> &list) {
|
||||
unsigned long i = 0;
|
||||
os << "[";
|
||||
for (auto el : list) {
|
||||
os << el;
|
||||
if (i < list.size() - 1) {
|
||||
os << ", ";
|
||||
}
|
||||
i++;
|
||||
}
|
||||
os << "]";
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
template<class T>
|
||||
std::ostream &operator<<(std::ostream &os, const std::vector<T> &list) {
|
||||
unsigned long i = 0;
|
||||
os << "[";
|
||||
for (auto el : list) {
|
||||
os << el;
|
||||
if (i < list.size() - 1) {
|
||||
os << ", ";
|
||||
}
|
||||
i++;
|
||||
}
|
||||
os << "]";
|
||||
|
||||
return os;
|
||||
}
|
BIN
2022/cpp/03/result
Executable file
BIN
2022/cpp/03/result
Executable file
Binary file not shown.
23
2022/cpp/03/result.cpp
Normal file
23
2022/cpp/03/result.cpp
Normal file
@ -0,0 +1,23 @@
|
||||
#include "answer.hpp"
|
||||
#include <iostream>
|
||||
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
if (argc < 2)
|
||||
error("Please specify the input file as first argument.");
|
||||
|
||||
#if !VERBOSE
|
||||
std::cout.setstate(std::ios_base::failbit);
|
||||
#endif
|
||||
|
||||
std::vector<Input> input = get_input(argv[1]);
|
||||
std::string result = get_result(input);
|
||||
|
||||
#if !VERBOSE
|
||||
std::cout.clear();
|
||||
#endif
|
||||
|
||||
std::cout << result << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
6
2022/cpp/03/sample1
Normal file
6
2022/cpp/03/sample1
Normal file
@ -0,0 +1,6 @@
|
||||
vJrwpWtwJgWrhcsFMMfFFhFp
|
||||
jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
|
||||
PmmdzqPrVvPwwTWBwg
|
||||
wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
|
||||
ttgJtRGJQctTZtZT
|
||||
CrZsJsPPZsGzwwsLwLmpwMDw
|
6
2022/cpp/03/sample2
Normal file
6
2022/cpp/03/sample2
Normal file
@ -0,0 +1,6 @@
|
||||
vJrwpWtwJgWrhcsFMMfFFhFp
|
||||
jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
|
||||
PmmdzqPrVvPwwTWBwg
|
||||
wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
|
||||
ttgJtRGJQctTZtZT
|
||||
CrZsJsPPZsGzwwsLwLmpwMDw
|
BIN
2022/cpp/03/test
Executable file
BIN
2022/cpp/03/test
Executable file
Binary file not shown.
34
2022/cpp/03/test.cpp
Normal file
34
2022/cpp/03/test.cpp
Normal file
@ -0,0 +1,34 @@
|
||||
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
|
||||
#include "../doctest/doctest/doctest.h"
|
||||
#include "answer.hpp"
|
||||
|
||||
#if PART == 1
|
||||
TEST_CASE("Part 1") {
|
||||
std::vector<Input> expected_input;
|
||||
expected_input.insert(expected_input.end(), {
|
||||
{.content = "vJrwpWtwJgWrhcsFMMfFFhFp"},
|
||||
{.content = "jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL"},
|
||||
{.content = "PmmdzqPrVvPwwTWBwg"},
|
||||
{.content = "wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn"},
|
||||
{.content = "ttgJtRGJQctTZtZT"},
|
||||
{.content = "CrZsJsPPZsGzwwsLwLmpwMDw"},
|
||||
});
|
||||
std::vector<Input> actual_input = get_input("sample1");
|
||||
|
||||
SUBCASE("Testing input is parsed correctly") { CHECK(actual_input == expected_input); }
|
||||
|
||||
SUBCASE("Testing output is the one expected from AOC") {
|
||||
CHECK(get_result(actual_input) == "157");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if PART == 2
|
||||
TEST_CASE("Part 2") {
|
||||
std::vector<Input> actual_input = get_input("sample2");
|
||||
|
||||
SUBCASE("Testing output is the one expected from AOC") {
|
||||
CHECK(get_result(actual_input) == "70");
|
||||
}
|
||||
}
|
||||
#endif
|
33
2022/cpp/04/Makefile
Normal file
33
2022/cpp/04/Makefile
Normal file
@ -0,0 +1,33 @@
|
||||
PART := 1
|
||||
CXXFLAGS := -Wall -O3 -DPART=$(PART)
|
||||
OBJ_DIR = build
|
||||
OBJ = answer.o
|
||||
|
||||
.PHONY = clean asdf sample1 sample2
|
||||
|
||||
asdf: result
|
||||
@echo "------- RESULT -------"
|
||||
@./result "input" | xclip -selection c
|
||||
@xclip -selection c -o
|
||||
|
||||
check: test
|
||||
./test
|
||||
|
||||
test: $(OBJ_DIR)/$(OBJ)
|
||||
|
||||
verbose: clean
|
||||
$(eval CXXFLAGS += -DVERBOSE)
|
||||
|
||||
$(OBJ_DIR)/$(OBJ): $(OBJ_DIR)/%.o: %.hpp
|
||||
|
||||
$(OBJ_DIR)/%.o: %.cpp
|
||||
@echo "Compiling $<..."
|
||||
@mkdir -p $(@D)
|
||||
gcc $(CXXFLAGS) -c -o $@ $<
|
||||
|
||||
result: $(OBJ_DIR)/$(OBJ)
|
||||
|
||||
clean:
|
||||
-rm -f *.o
|
||||
-rm -rf $(OBJ_DIR)/
|
||||
|
52
2022/cpp/04/answer.cpp
Normal file
52
2022/cpp/04/answer.cpp
Normal file
@ -0,0 +1,52 @@
|
||||
// AOC - 2022 - 04
|
||||
#include "answer.hpp"
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
|
||||
Range get_range(std::stringstream & ss) {
|
||||
uint start, end;
|
||||
char _;
|
||||
ss >> start;
|
||||
ss >> _;
|
||||
ss >> end;
|
||||
ss >> _;
|
||||
return {start, end};
|
||||
}
|
||||
|
||||
std::vector<Input> get_input(const char * filename) {
|
||||
std::ifstream stream(filename);
|
||||
std::string str;
|
||||
std::vector<Input> ret;
|
||||
|
||||
while (getline(stream, str)) {
|
||||
std::stringstream ss(str);
|
||||
ret.push_back({get_range(ss), get_range(ss)});
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool Range::fully_contains(const Range & rhs) const {
|
||||
return this->start <= rhs.start && this->end >= rhs.end;
|
||||
}
|
||||
|
||||
bool Range::is_disjoint_from(const Range & rhs) const {
|
||||
return this->start < rhs.start && this->end < rhs.start;
|
||||
}
|
||||
|
||||
bool Range::overlaps(const Range & rhs) const {
|
||||
return !this->is_disjoint_from(rhs) && !rhs.is_disjoint_from(*this);
|
||||
}
|
||||
|
||||
std::string get_result(std::vector<Input> input) {
|
||||
std::string ret;
|
||||
uint count = 0;
|
||||
for (auto & ranges : input)
|
||||
#if PART == 1
|
||||
count += ranges.r1.fully_contains(ranges.r2) || ranges.r2.fully_contains(ranges.r1);
|
||||
#else
|
||||
count += ranges.r1.overlaps(ranges.r2);
|
||||
#endif
|
||||
ret = std::to_string(count);
|
||||
return ret;
|
||||
}
|
45
2022/cpp/04/answer.hpp
Normal file
45
2022/cpp/04/answer.hpp
Normal file
@ -0,0 +1,45 @@
|
||||
#include <string>
|
||||
#include "lib.hpp"
|
||||
|
||||
#ifndef VERBOSE
|
||||
#define VERBOSE 0
|
||||
#endif
|
||||
|
||||
#ifndef PART
|
||||
#define PART 1
|
||||
#endif
|
||||
|
||||
struct Range{
|
||||
uint start, end;
|
||||
bool operator ==(const Range & rhs) const{
|
||||
return this->start == rhs.start && this->end == rhs.end;
|
||||
}
|
||||
bool fully_contains(const Range & rhs) const;
|
||||
bool overlaps(const Range & rhs) const;
|
||||
bool is_disjoint_from(const Range & rhs) const;
|
||||
};
|
||||
|
||||
struct Input{
|
||||
Range r1, r2;
|
||||
|
||||
bool operator ==(const Input & rhs) const{
|
||||
return this->r1 == rhs.r1 && this->r2 == rhs.r2;
|
||||
}
|
||||
};
|
||||
|
||||
inline std::ostream& operator<<(std::ostream &os, Range & range){
|
||||
os << "[" << range.start << ", " << range.end << "]";
|
||||
return os;
|
||||
}
|
||||
|
||||
inline std::ostream& operator<<(std::ostream &os, Input & inp){
|
||||
os << inp.r1 << " & " << inp.r2;
|
||||
return os;
|
||||
}
|
||||
|
||||
|
||||
std::vector<Input> get_input(const char *);
|
||||
|
||||
std::string get_result(std::vector<Input>);
|
||||
|
||||
|
BIN
2022/cpp/04/build/answer.o
Normal file
BIN
2022/cpp/04/build/answer.o
Normal file
Binary file not shown.
1000
2022/cpp/04/input
Normal file
1000
2022/cpp/04/input
Normal file
File diff suppressed because it is too large
Load Diff
24
2022/cpp/04/lib.hpp
Normal file
24
2022/cpp/04/lib.hpp
Normal file
@ -0,0 +1,24 @@
|
||||
#include <iostream>
|
||||
#include <ostream>
|
||||
#include <vector>
|
||||
|
||||
template<class T>
|
||||
std::ostream &operator<<(std::ostream &os, const std::vector<T> &list) {
|
||||
unsigned long i = 0;
|
||||
os << "[";
|
||||
for (auto el : list) {
|
||||
os << el;
|
||||
if (i < list.size() - 1) {
|
||||
os << ", ";
|
||||
}
|
||||
i++;
|
||||
}
|
||||
os << "]";
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
inline void error(const char * msg){
|
||||
std::cerr << msg << std::endl;
|
||||
exit(1);
|
||||
}
|
BIN
2022/cpp/04/result
Executable file
BIN
2022/cpp/04/result
Executable file
Binary file not shown.
23
2022/cpp/04/result.cpp
Normal file
23
2022/cpp/04/result.cpp
Normal file
@ -0,0 +1,23 @@
|
||||
#include "answer.hpp"
|
||||
#include <iostream>
|
||||
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
if (argc < 2)
|
||||
error("Please specify the input file as first argument.");
|
||||
|
||||
#if !VERBOSE
|
||||
std::cout.setstate(std::ios_base::failbit);
|
||||
#endif
|
||||
|
||||
std::vector<Input> input = get_input(argv[1]);
|
||||
std::string result = get_result(input);
|
||||
|
||||
#if !VERBOSE
|
||||
std::cout.clear();
|
||||
#endif
|
||||
|
||||
std::cout << result << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
6
2022/cpp/04/sample1
Normal file
6
2022/cpp/04/sample1
Normal file
@ -0,0 +1,6 @@
|
||||
2-4,6-8
|
||||
2-3,4-5
|
||||
5-7,7-9
|
||||
2-8,3-7
|
||||
6-6,4-6
|
||||
2-6,4-8
|
BIN
2022/cpp/04/test
Executable file
BIN
2022/cpp/04/test
Executable file
Binary file not shown.
35
2022/cpp/04/test.cpp
Normal file
35
2022/cpp/04/test.cpp
Normal file
@ -0,0 +1,35 @@
|
||||
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
|
||||
#include "../doctest/doctest/doctest.h"
|
||||
#include "answer.hpp"
|
||||
|
||||
#if PART == 1
|
||||
TEST_CASE("Part 1"){
|
||||
std::vector<Input> expected_input;
|
||||
expected_input.insert(expected_input.end(), {
|
||||
{{2, 4}, {6, 8}},
|
||||
{{2, 3}, {4, 5}},
|
||||
{{5, 7}, {7, 9}},
|
||||
{{2, 8}, {3, 7}},
|
||||
{{6, 6}, {4, 6}},
|
||||
{{2, 6}, {4, 8}},
|
||||
});
|
||||
std::vector<Input> actual_input = get_input("sample1");
|
||||
|
||||
SUBCASE("Testing input is parsed correctly"){
|
||||
CHECK(actual_input == expected_input);
|
||||
}
|
||||
|
||||
SUBCASE("Testing output is the one expected from AOC"){
|
||||
CHECK(get_result(actual_input) == "2");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if PART == 2
|
||||
TEST_CASE("Part 2"){
|
||||
std::vector<Input> actual_input = get_input("sample1");
|
||||
SUBCASE("Testing output is the one expected from AOC"){
|
||||
CHECK(get_result(actual_input) == "4");
|
||||
}
|
||||
}
|
||||
#endif
|
33
2022/cpp/05/Makefile
Normal file
33
2022/cpp/05/Makefile
Normal file
@ -0,0 +1,33 @@
|
||||
PART := 1
|
||||
CXXFLAGS := -Wall -O3 -DPART=$(PART)
|
||||
OBJ_DIR = build
|
||||
OBJ = answer.o
|
||||
|
||||
.PHONY = clean asdf sample1 sample2
|
||||
|
||||
asdf: result
|
||||
@echo "------- RESULT -------"
|
||||
@./result "input" | xclip -selection c
|
||||
@xclip -selection c -o
|
||||
|
||||
check: test
|
||||
./test
|
||||
|
||||
test: $(OBJ_DIR)/$(OBJ)
|
||||
|
||||
verbose: clean
|
||||
$(eval CXXFLAGS += -DVERBOSE)
|
||||
|
||||
$(OBJ_DIR)/$(OBJ): $(OBJ_DIR)/%.o: %.hpp
|
||||
|
||||
$(OBJ_DIR)/%.o: %.cpp
|
||||
@echo "Compiling $<..."
|
||||
@mkdir -p $(@D)
|
||||
gcc $(CXXFLAGS) -c -o $@ $<
|
||||
|
||||
result: $(OBJ_DIR)/$(OBJ)
|
||||
|
||||
clean:
|
||||
-rm -f *.o
|
||||
-rm -rf $(OBJ_DIR)/
|
||||
|
91
2022/cpp/05/answer.cpp
Normal file
91
2022/cpp/05/answer.cpp
Normal file
@ -0,0 +1,91 @@
|
||||
// AOC - 2022 - 05
|
||||
#include "answer.hpp"
|
||||
#include <algorithm>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
|
||||
#define STACK_WIDTH 4
|
||||
|
||||
stacks_t get_stacks(std::vector<std::string> stack_lines, uint n_stacks) {
|
||||
// reverse so that stack_lines[0] is the bottom of the stacks
|
||||
std::reverse(stack_lines.begin(), stack_lines.end());
|
||||
|
||||
std::vector<std::vector<char>> stacks(n_stacks);
|
||||
uint max_height = stack_lines.size();
|
||||
|
||||
for (uint h = 0; h < max_height; h++) {
|
||||
for (uint i = 0; i < n_stacks; i++) {
|
||||
char item = stack_lines[h][i * STACK_WIDTH + 1];
|
||||
if (item != ' ')
|
||||
stacks[i].push_back(item);
|
||||
}
|
||||
}
|
||||
return stacks;
|
||||
}
|
||||
|
||||
Move get_move(std::string line) {
|
||||
std::stringstream ss(line);
|
||||
std::string _;
|
||||
uint item, from, to;
|
||||
ss >> _; // move
|
||||
ss >> item;
|
||||
ss >> _; // from
|
||||
ss >> from;
|
||||
ss >> _; // to
|
||||
ss >> to;
|
||||
return {--item, --from, --to};
|
||||
}
|
||||
|
||||
Input get_input(const char * filename) {
|
||||
std::ifstream stream(filename);
|
||||
std::string str;
|
||||
Input ret;
|
||||
|
||||
std::vector<std::string> stack_lines;
|
||||
stacks_t stacks;
|
||||
|
||||
while (getline(stream, str) && !std::isdigit(str[1])) {
|
||||
stack_lines.push_back(str);
|
||||
}
|
||||
std::reverse(str.begin(), str.end() - 1);
|
||||
std::stringstream ss(str);
|
||||
uint n_stacks;
|
||||
ss >> n_stacks;
|
||||
stacks = get_stacks(stack_lines, n_stacks);
|
||||
|
||||
getline(stream, str); // get rid of the empty line between the stacks and
|
||||
// the move instructions
|
||||
|
||||
std::vector<Move> moves;
|
||||
while (getline(stream, str))
|
||||
moves.push_back(get_move(str));
|
||||
|
||||
return {stacks, moves};
|
||||
}
|
||||
|
||||
template <class T> std::vector<T> pop(std::vector<T> & v, uint i) {
|
||||
std::vector<T> ret(v.begin() + i, v.end());
|
||||
v.erase(v.begin() + i, v.end());
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::string get_result(Input input) {
|
||||
std::string ret;
|
||||
stacks_t stacks = input.stacks;
|
||||
std::cout << stacks << std::endl;
|
||||
for (auto & move : input.moves) {
|
||||
std::cout << move << std::endl;
|
||||
std::vector<char> tbi = pop(stacks[move.from], stacks[move.from].size() - 1 - move.item);
|
||||
#if PART == 1
|
||||
std::reverse(tbi.begin(), tbi.end());
|
||||
#endif
|
||||
stacks[move.to].insert(stacks[move.to].end(),
|
||||
tbi.begin(), tbi.end());
|
||||
std::cout << stacks << std::endl << std::endl;
|
||||
}
|
||||
|
||||
for (auto & stack : stacks)
|
||||
ret += stack.back();
|
||||
return ret;
|
||||
}
|
61
2022/cpp/05/answer.hpp
Normal file
61
2022/cpp/05/answer.hpp
Normal file
@ -0,0 +1,61 @@
|
||||
#include <stack>
|
||||
#include <string>
|
||||
#include "lib.hpp"
|
||||
|
||||
#ifndef VERBOSE
|
||||
#define VERBOSE 0
|
||||
#endif
|
||||
|
||||
#ifndef PART
|
||||
#define PART 2
|
||||
#endif
|
||||
|
||||
struct Move{
|
||||
uint item, from, to;
|
||||
|
||||
bool operator ==(const Move & rhs) const{
|
||||
return this->item == rhs.item && this->from == rhs.from && this->to == rhs.to;
|
||||
}
|
||||
};
|
||||
|
||||
typedef std::vector<std::vector<char>> stacks_t;
|
||||
|
||||
struct Input{
|
||||
stacks_t stacks;
|
||||
std::vector<Move> moves;
|
||||
bool operator ==(const Input & rhs) const{
|
||||
return this->moves == rhs.moves && this->stacks == rhs.stacks;
|
||||
}
|
||||
};
|
||||
|
||||
inline std::ostream& operator<<(std::ostream &os, stacks_t & stacks){
|
||||
uint i = 0;
|
||||
for (auto & stack: stacks){
|
||||
os << i++ << " ";
|
||||
for (auto & item : stack)
|
||||
os << item << " ";
|
||||
os << std::endl;
|
||||
}
|
||||
return os;
|
||||
}
|
||||
|
||||
inline std::ostream& operator<<(std::ostream &os, Move & move){
|
||||
os << "move " << move.item << " from " << move.from << " to " << move.to;
|
||||
return os;
|
||||
}
|
||||
|
||||
inline std::ostream& operator<<(std::ostream &os, Input & inp){
|
||||
os << "---------------------------------" << std::endl;
|
||||
os << inp.stacks << std::endl;
|
||||
for (auto & move: inp.moves)
|
||||
os << move << std::endl;
|
||||
os << "---------------------------------" << std::endl;
|
||||
return os;
|
||||
}
|
||||
|
||||
|
||||
Input get_input(const char *);
|
||||
|
||||
std::string get_result(Input);
|
||||
|
||||
|
BIN
2022/cpp/05/build/answer.o
Normal file
BIN
2022/cpp/05/build/answer.o
Normal file
Binary file not shown.
512
2022/cpp/05/input
Normal file
512
2022/cpp/05/input
Normal file
@ -0,0 +1,512 @@
|
||||
[F] [L] [M]
|
||||
[T] [H] [V] [G] [V]
|
||||
[N] [T] [D] [R] [N] [D]
|
||||
[Z] [B] [C] [P] [B] [R] [Z]
|
||||
[M] [J] [N] [M] [F] [M] [V] [H]
|
||||
[G] [J] [L] [J] [S] [C] [G] [M] [F]
|
||||
[H] [W] [V] [P] [W] [H] [H] [N] [N]
|
||||
[J] [V] [G] [B] [F] [G] [D] [H] [G]
|
||||
1 2 3 4 5 6 7 8 9
|
||||
|
||||
move 6 from 4 to 3
|
||||
move 5 from 8 to 9
|
||||
move 1 from 4 to 5
|
||||
move 1 from 4 to 5
|
||||
move 2 from 2 to 7
|
||||
move 2 from 1 to 6
|
||||
move 9 from 6 to 1
|
||||
move 12 from 3 to 5
|
||||
move 1 from 8 to 4
|
||||
move 3 from 1 to 5
|
||||
move 1 from 6 to 7
|
||||
move 10 from 5 to 2
|
||||
move 14 from 5 to 1
|
||||
move 8 from 7 to 9
|
||||
move 11 from 2 to 9
|
||||
move 1 from 3 to 9
|
||||
move 11 from 1 to 5
|
||||
move 2 from 1 to 9
|
||||
move 1 from 4 to 8
|
||||
move 6 from 1 to 5
|
||||
move 1 from 8 to 3
|
||||
move 16 from 5 to 1
|
||||
move 4 from 1 to 3
|
||||
move 1 from 5 to 6
|
||||
move 4 from 3 to 4
|
||||
move 1 from 6 to 7
|
||||
move 21 from 9 to 6
|
||||
move 2 from 1 to 9
|
||||
move 2 from 4 to 9
|
||||
move 5 from 9 to 4
|
||||
move 9 from 1 to 6
|
||||
move 6 from 4 to 6
|
||||
move 1 from 6 to 2
|
||||
move 1 from 7 to 6
|
||||
move 1 from 3 to 2
|
||||
move 8 from 6 to 9
|
||||
move 3 from 1 to 8
|
||||
move 1 from 2 to 1
|
||||
move 13 from 6 to 3
|
||||
move 1 from 1 to 9
|
||||
move 2 from 1 to 6
|
||||
move 3 from 8 to 4
|
||||
move 4 from 4 to 9
|
||||
move 3 from 1 to 3
|
||||
move 22 from 9 to 8
|
||||
move 1 from 2 to 9
|
||||
move 6 from 8 to 9
|
||||
move 15 from 6 to 5
|
||||
move 5 from 8 to 9
|
||||
move 11 from 9 to 8
|
||||
move 13 from 5 to 1
|
||||
move 1 from 6 to 5
|
||||
move 1 from 9 to 3
|
||||
move 21 from 8 to 3
|
||||
move 3 from 5 to 3
|
||||
move 11 from 1 to 2
|
||||
move 25 from 3 to 1
|
||||
move 5 from 1 to 7
|
||||
move 20 from 1 to 7
|
||||
move 1 from 6 to 7
|
||||
move 16 from 3 to 9
|
||||
move 8 from 9 to 6
|
||||
move 1 from 1 to 5
|
||||
move 5 from 9 to 4
|
||||
move 2 from 2 to 1
|
||||
move 2 from 9 to 4
|
||||
move 1 from 9 to 4
|
||||
move 1 from 8 to 4
|
||||
move 1 from 5 to 2
|
||||
move 3 from 4 to 6
|
||||
move 1 from 4 to 7
|
||||
move 9 from 7 to 6
|
||||
move 5 from 4 to 6
|
||||
move 7 from 7 to 2
|
||||
move 1 from 1 to 6
|
||||
move 11 from 2 to 5
|
||||
move 10 from 5 to 1
|
||||
move 1 from 6 to 8
|
||||
move 1 from 5 to 7
|
||||
move 24 from 6 to 1
|
||||
move 12 from 1 to 4
|
||||
move 12 from 4 to 8
|
||||
move 2 from 2 to 7
|
||||
move 3 from 7 to 2
|
||||
move 5 from 2 to 8
|
||||
move 9 from 8 to 9
|
||||
move 9 from 8 to 5
|
||||
move 1 from 9 to 1
|
||||
move 14 from 1 to 8
|
||||
move 11 from 7 to 9
|
||||
move 4 from 1 to 3
|
||||
move 7 from 1 to 2
|
||||
move 3 from 3 to 7
|
||||
move 12 from 9 to 7
|
||||
move 8 from 7 to 2
|
||||
move 4 from 9 to 2
|
||||
move 1 from 3 to 6
|
||||
move 5 from 5 to 9
|
||||
move 14 from 2 to 1
|
||||
move 8 from 9 to 4
|
||||
move 6 from 4 to 5
|
||||
move 5 from 5 to 7
|
||||
move 1 from 8 to 2
|
||||
move 2 from 4 to 6
|
||||
move 4 from 7 to 3
|
||||
move 10 from 8 to 4
|
||||
move 2 from 3 to 6
|
||||
move 7 from 7 to 6
|
||||
move 10 from 4 to 8
|
||||
move 5 from 1 to 6
|
||||
move 8 from 2 to 1
|
||||
move 7 from 6 to 8
|
||||
move 9 from 6 to 5
|
||||
move 16 from 1 to 6
|
||||
move 2 from 3 to 9
|
||||
move 1 from 7 to 4
|
||||
move 2 from 9 to 1
|
||||
move 14 from 6 to 7
|
||||
move 1 from 6 to 3
|
||||
move 2 from 6 to 3
|
||||
move 9 from 5 to 7
|
||||
move 3 from 1 to 6
|
||||
move 3 from 3 to 7
|
||||
move 5 from 5 to 9
|
||||
move 3 from 6 to 2
|
||||
move 1 from 6 to 2
|
||||
move 12 from 8 to 2
|
||||
move 5 from 2 to 1
|
||||
move 2 from 1 to 3
|
||||
move 25 from 7 to 1
|
||||
move 1 from 4 to 6
|
||||
move 2 from 3 to 9
|
||||
move 26 from 1 to 9
|
||||
move 2 from 1 to 8
|
||||
move 1 from 6 to 8
|
||||
move 1 from 7 to 1
|
||||
move 7 from 8 to 1
|
||||
move 7 from 1 to 5
|
||||
move 1 from 1 to 2
|
||||
move 2 from 8 to 6
|
||||
move 32 from 9 to 8
|
||||
move 1 from 6 to 5
|
||||
move 5 from 2 to 9
|
||||
move 1 from 9 to 7
|
||||
move 24 from 8 to 3
|
||||
move 1 from 6 to 9
|
||||
move 3 from 2 to 5
|
||||
move 1 from 7 to 9
|
||||
move 4 from 9 to 3
|
||||
move 8 from 8 to 7
|
||||
move 18 from 3 to 7
|
||||
move 20 from 7 to 8
|
||||
move 6 from 8 to 9
|
||||
move 6 from 5 to 1
|
||||
move 8 from 9 to 4
|
||||
move 3 from 5 to 4
|
||||
move 8 from 8 to 4
|
||||
move 2 from 5 to 2
|
||||
move 3 from 1 to 5
|
||||
move 4 from 3 to 7
|
||||
move 6 from 2 to 9
|
||||
move 3 from 3 to 6
|
||||
move 6 from 4 to 5
|
||||
move 2 from 6 to 3
|
||||
move 1 from 3 to 1
|
||||
move 4 from 3 to 8
|
||||
move 8 from 4 to 3
|
||||
move 4 from 3 to 7
|
||||
move 4 from 4 to 5
|
||||
move 4 from 9 to 5
|
||||
move 3 from 3 to 4
|
||||
move 3 from 4 to 9
|
||||
move 1 from 1 to 4
|
||||
move 2 from 1 to 5
|
||||
move 7 from 7 to 8
|
||||
move 4 from 7 to 4
|
||||
move 1 from 6 to 7
|
||||
move 1 from 1 to 5
|
||||
move 1 from 3 to 8
|
||||
move 11 from 5 to 9
|
||||
move 17 from 9 to 8
|
||||
move 13 from 8 to 4
|
||||
move 1 from 4 to 8
|
||||
move 4 from 7 to 1
|
||||
move 4 from 8 to 3
|
||||
move 6 from 5 to 4
|
||||
move 3 from 3 to 6
|
||||
move 2 from 1 to 9
|
||||
move 1 from 9 to 5
|
||||
move 1 from 3 to 5
|
||||
move 5 from 5 to 9
|
||||
move 2 from 1 to 8
|
||||
move 21 from 8 to 6
|
||||
move 2 from 8 to 4
|
||||
move 4 from 9 to 6
|
||||
move 1 from 9 to 7
|
||||
move 19 from 4 to 1
|
||||
move 28 from 6 to 5
|
||||
move 7 from 4 to 2
|
||||
move 28 from 5 to 3
|
||||
move 1 from 9 to 4
|
||||
move 1 from 4 to 2
|
||||
move 1 from 7 to 8
|
||||
move 1 from 8 to 9
|
||||
move 13 from 1 to 3
|
||||
move 8 from 2 to 8
|
||||
move 3 from 1 to 2
|
||||
move 5 from 8 to 5
|
||||
move 1 from 2 to 7
|
||||
move 1 from 9 to 7
|
||||
move 1 from 2 to 3
|
||||
move 2 from 7 to 9
|
||||
move 1 from 2 to 6
|
||||
move 1 from 9 to 1
|
||||
move 9 from 3 to 9
|
||||
move 3 from 9 to 1
|
||||
move 1 from 6 to 8
|
||||
move 21 from 3 to 7
|
||||
move 7 from 9 to 4
|
||||
move 2 from 4 to 2
|
||||
move 1 from 8 to 6
|
||||
move 7 from 1 to 4
|
||||
move 7 from 7 to 8
|
||||
move 4 from 5 to 9
|
||||
move 10 from 7 to 1
|
||||
move 7 from 3 to 9
|
||||
move 1 from 7 to 9
|
||||
move 1 from 5 to 3
|
||||
move 3 from 3 to 5
|
||||
move 10 from 4 to 2
|
||||
move 1 from 3 to 7
|
||||
move 2 from 4 to 9
|
||||
move 3 from 9 to 1
|
||||
move 3 from 7 to 1
|
||||
move 1 from 6 to 4
|
||||
move 1 from 1 to 2
|
||||
move 1 from 3 to 4
|
||||
move 2 from 4 to 3
|
||||
move 1 from 7 to 4
|
||||
move 4 from 8 to 9
|
||||
move 1 from 4 to 9
|
||||
move 3 from 1 to 9
|
||||
move 12 from 1 to 7
|
||||
move 2 from 9 to 5
|
||||
move 12 from 9 to 7
|
||||
move 5 from 5 to 1
|
||||
move 1 from 8 to 5
|
||||
move 4 from 1 to 4
|
||||
move 1 from 9 to 6
|
||||
move 1 from 3 to 4
|
||||
move 3 from 8 to 3
|
||||
move 1 from 1 to 7
|
||||
move 8 from 2 to 5
|
||||
move 2 from 8 to 1
|
||||
move 10 from 7 to 1
|
||||
move 4 from 9 to 5
|
||||
move 2 from 5 to 8
|
||||
move 11 from 5 to 4
|
||||
move 6 from 7 to 2
|
||||
move 2 from 2 to 1
|
||||
move 1 from 7 to 5
|
||||
move 1 from 5 to 1
|
||||
move 2 from 4 to 8
|
||||
move 1 from 6 to 9
|
||||
move 8 from 4 to 3
|
||||
move 8 from 1 to 7
|
||||
move 7 from 1 to 2
|
||||
move 4 from 3 to 9
|
||||
move 1 from 9 to 6
|
||||
move 7 from 2 to 1
|
||||
move 5 from 2 to 3
|
||||
move 2 from 7 to 8
|
||||
move 5 from 8 to 4
|
||||
move 2 from 9 to 3
|
||||
move 1 from 8 to 1
|
||||
move 6 from 3 to 5
|
||||
move 10 from 3 to 1
|
||||
move 3 from 5 to 3
|
||||
move 3 from 2 to 1
|
||||
move 1 from 5 to 4
|
||||
move 6 from 4 to 5
|
||||
move 1 from 6 to 2
|
||||
move 3 from 4 to 7
|
||||
move 1 from 9 to 4
|
||||
move 2 from 3 to 1
|
||||
move 1 from 9 to 8
|
||||
move 1 from 3 to 7
|
||||
move 4 from 4 to 8
|
||||
move 2 from 7 to 4
|
||||
move 8 from 5 to 9
|
||||
move 2 from 8 to 6
|
||||
move 2 from 4 to 3
|
||||
move 2 from 3 to 4
|
||||
move 4 from 9 to 7
|
||||
move 1 from 8 to 7
|
||||
move 2 from 6 to 9
|
||||
move 2 from 8 to 9
|
||||
move 1 from 2 to 9
|
||||
move 1 from 7 to 8
|
||||
move 1 from 2 to 7
|
||||
move 19 from 7 to 6
|
||||
move 1 from 8 to 1
|
||||
move 2 from 4 to 8
|
||||
move 5 from 6 to 1
|
||||
move 2 from 7 to 2
|
||||
move 2 from 2 to 8
|
||||
move 2 from 1 to 8
|
||||
move 4 from 8 to 2
|
||||
move 3 from 2 to 8
|
||||
move 6 from 9 to 5
|
||||
move 8 from 6 to 3
|
||||
move 26 from 1 to 6
|
||||
move 1 from 5 to 3
|
||||
move 1 from 1 to 5
|
||||
move 8 from 3 to 1
|
||||
move 1 from 3 to 7
|
||||
move 3 from 9 to 2
|
||||
move 4 from 2 to 6
|
||||
move 26 from 6 to 1
|
||||
move 1 from 7 to 5
|
||||
move 3 from 8 to 4
|
||||
move 2 from 8 to 2
|
||||
move 7 from 1 to 2
|
||||
move 1 from 5 to 9
|
||||
move 2 from 4 to 6
|
||||
move 9 from 6 to 2
|
||||
move 18 from 1 to 7
|
||||
move 6 from 7 to 1
|
||||
move 6 from 5 to 6
|
||||
move 1 from 1 to 2
|
||||
move 19 from 2 to 7
|
||||
move 1 from 4 to 2
|
||||
move 9 from 7 to 1
|
||||
move 3 from 6 to 7
|
||||
move 1 from 9 to 4
|
||||
move 1 from 2 to 3
|
||||
move 8 from 7 to 8
|
||||
move 4 from 6 to 5
|
||||
move 2 from 6 to 3
|
||||
move 1 from 4 to 2
|
||||
move 4 from 5 to 1
|
||||
move 8 from 8 to 7
|
||||
move 17 from 7 to 8
|
||||
move 3 from 3 to 1
|
||||
move 1 from 2 to 8
|
||||
move 8 from 8 to 4
|
||||
move 8 from 8 to 7
|
||||
move 1 from 8 to 2
|
||||
move 7 from 7 to 6
|
||||
move 1 from 2 to 7
|
||||
move 5 from 7 to 8
|
||||
move 7 from 1 to 6
|
||||
move 10 from 6 to 1
|
||||
move 4 from 7 to 9
|
||||
move 3 from 9 to 7
|
||||
move 1 from 7 to 2
|
||||
move 6 from 4 to 2
|
||||
move 7 from 1 to 5
|
||||
move 4 from 2 to 5
|
||||
move 16 from 1 to 9
|
||||
move 3 from 2 to 7
|
||||
move 2 from 4 to 9
|
||||
move 4 from 1 to 6
|
||||
move 5 from 7 to 4
|
||||
move 4 from 6 to 3
|
||||
move 1 from 7 to 4
|
||||
move 1 from 6 to 9
|
||||
move 1 from 8 to 5
|
||||
move 4 from 3 to 2
|
||||
move 2 from 5 to 3
|
||||
move 3 from 6 to 2
|
||||
move 3 from 2 to 1
|
||||
move 9 from 5 to 8
|
||||
move 1 from 3 to 1
|
||||
move 10 from 8 to 1
|
||||
move 1 from 8 to 5
|
||||
move 16 from 9 to 2
|
||||
move 1 from 3 to 2
|
||||
move 12 from 1 to 9
|
||||
move 1 from 9 to 2
|
||||
move 3 from 1 to 6
|
||||
move 2 from 1 to 9
|
||||
move 3 from 6 to 8
|
||||
move 20 from 2 to 7
|
||||
move 16 from 9 to 7
|
||||
move 1 from 7 to 5
|
||||
move 2 from 5 to 9
|
||||
move 2 from 2 to 3
|
||||
move 2 from 8 to 5
|
||||
move 3 from 9 to 7
|
||||
move 2 from 5 to 2
|
||||
move 1 from 4 to 6
|
||||
move 2 from 1 to 4
|
||||
move 23 from 7 to 5
|
||||
move 4 from 8 to 5
|
||||
move 7 from 7 to 1
|
||||
move 16 from 5 to 7
|
||||
move 1 from 6 to 5
|
||||
move 1 from 2 to 4
|
||||
move 2 from 3 to 9
|
||||
move 1 from 2 to 3
|
||||
move 13 from 5 to 1
|
||||
move 1 from 3 to 8
|
||||
move 1 from 9 to 4
|
||||
move 19 from 1 to 9
|
||||
move 2 from 1 to 9
|
||||
move 22 from 9 to 8
|
||||
move 14 from 8 to 5
|
||||
move 12 from 5 to 3
|
||||
move 21 from 7 to 9
|
||||
move 14 from 9 to 7
|
||||
move 1 from 8 to 6
|
||||
move 9 from 3 to 7
|
||||
move 1 from 3 to 2
|
||||
move 4 from 4 to 1
|
||||
move 1 from 2 to 4
|
||||
move 1 from 3 to 9
|
||||
move 6 from 8 to 9
|
||||
move 4 from 1 to 7
|
||||
move 2 from 5 to 9
|
||||
move 6 from 4 to 5
|
||||
move 4 from 7 to 4
|
||||
move 1 from 5 to 3
|
||||
move 5 from 9 to 7
|
||||
move 2 from 3 to 1
|
||||
move 6 from 9 to 6
|
||||
move 1 from 1 to 6
|
||||
move 2 from 4 to 2
|
||||
move 8 from 7 to 5
|
||||
move 20 from 7 to 5
|
||||
move 2 from 5 to 6
|
||||
move 4 from 9 to 5
|
||||
move 1 from 1 to 3
|
||||
move 1 from 3 to 4
|
||||
move 1 from 2 to 7
|
||||
move 1 from 4 to 9
|
||||
move 9 from 6 to 3
|
||||
move 2 from 4 to 3
|
||||
move 28 from 5 to 3
|
||||
move 1 from 8 to 3
|
||||
move 1 from 8 to 1
|
||||
move 1 from 2 to 8
|
||||
move 1 from 6 to 2
|
||||
move 1 from 8 to 1
|
||||
move 6 from 5 to 7
|
||||
move 1 from 5 to 1
|
||||
move 1 from 9 to 2
|
||||
move 1 from 1 to 3
|
||||
move 1 from 9 to 7
|
||||
move 2 from 1 to 2
|
||||
move 11 from 3 to 8
|
||||
move 3 from 8 to 6
|
||||
move 3 from 6 to 9
|
||||
move 25 from 3 to 7
|
||||
move 4 from 3 to 8
|
||||
move 4 from 2 to 3
|
||||
move 9 from 8 to 9
|
||||
move 2 from 3 to 7
|
||||
move 3 from 8 to 2
|
||||
move 11 from 9 to 7
|
||||
move 1 from 9 to 1
|
||||
move 4 from 7 to 3
|
||||
move 1 from 1 to 5
|
||||
move 23 from 7 to 2
|
||||
move 12 from 2 to 3
|
||||
move 2 from 3 to 9
|
||||
move 12 from 2 to 1
|
||||
move 2 from 3 to 9
|
||||
move 1 from 5 to 4
|
||||
move 1 from 2 to 5
|
||||
move 1 from 9 to 4
|
||||
move 1 from 5 to 9
|
||||
move 2 from 4 to 2
|
||||
move 3 from 1 to 4
|
||||
move 1 from 2 to 1
|
||||
move 10 from 3 to 2
|
||||
move 7 from 7 to 3
|
||||
move 11 from 7 to 9
|
||||
move 5 from 3 to 1
|
||||
move 1 from 4 to 5
|
||||
move 11 from 2 to 3
|
||||
move 9 from 9 to 3
|
||||
move 3 from 9 to 4
|
||||
move 2 from 4 to 8
|
||||
move 1 from 5 to 6
|
||||
move 13 from 1 to 5
|
||||
move 3 from 3 to 8
|
||||
move 3 from 7 to 2
|
||||
move 1 from 7 to 4
|
||||
move 3 from 8 to 3
|
||||
move 8 from 3 to 8
|
||||
move 4 from 4 to 5
|
||||
move 2 from 8 to 2
|
||||
move 8 from 8 to 3
|
||||
move 1 from 6 to 3
|
||||
move 2 from 2 to 8
|
||||
move 6 from 5 to 2
|
||||
move 3 from 2 to 8
|
||||
move 1 from 1 to 7
|
||||
move 2 from 9 to 3
|
||||
move 3 from 5 to 4
|
||||
move 2 from 8 to 6
|
24
2022/cpp/05/lib.hpp
Normal file
24
2022/cpp/05/lib.hpp
Normal file
@ -0,0 +1,24 @@
|
||||
#include <iostream>
|
||||
#include <ostream>
|
||||
#include <vector>
|
||||
|
||||
template<class T>
|
||||
std::ostream &operator<<(std::ostream &os, const std::vector<T> &list) {
|
||||
unsigned long i = 0;
|
||||
os << "[";
|
||||
for (auto el : list) {
|
||||
os << el;
|
||||
if (i < list.size() - 1) {
|
||||
os << ", ";
|
||||
}
|
||||
i++;
|
||||
}
|
||||
os << "]";
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
inline void error(const char * msg){
|
||||
std::cerr << msg << std::endl;
|
||||
exit(1);
|
||||
}
|
BIN
2022/cpp/05/result
Executable file
BIN
2022/cpp/05/result
Executable file
Binary file not shown.
23
2022/cpp/05/result.cpp
Normal file
23
2022/cpp/05/result.cpp
Normal file
@ -0,0 +1,23 @@
|
||||
#include "answer.hpp"
|
||||
#include <iostream>
|
||||
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
if (argc < 2)
|
||||
error("Please specify the input file as first argument.");
|
||||
|
||||
#if !VERBOSE
|
||||
std::cout.setstate(std::ios_base::failbit);
|
||||
#endif
|
||||
|
||||
Input input = get_input(argv[1]);
|
||||
std::string result = get_result(input);
|
||||
|
||||
#if !VERBOSE
|
||||
std::cout.clear();
|
||||
#endif
|
||||
|
||||
std::cout << result << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
9
2022/cpp/05/sample1
Normal file
9
2022/cpp/05/sample1
Normal file
@ -0,0 +1,9 @@
|
||||
[D]
|
||||
[N] [C]
|
||||
[Z] [M] [P]
|
||||
1 2 3
|
||||
|
||||
move 1 from 2 to 1
|
||||
move 3 from 1 to 3
|
||||
move 2 from 2 to 1
|
||||
move 1 from 1 to 2
|
9
2022/cpp/05/sample2
Normal file
9
2022/cpp/05/sample2
Normal file
@ -0,0 +1,9 @@
|
||||
[D]
|
||||
[N] [C]
|
||||
[Z] [M] [P]
|
||||
1 2 3
|
||||
|
||||
move 1 from 2 to 1
|
||||
move 3 from 1 to 3
|
||||
move 2 from 2 to 1
|
||||
move 1 from 1 to 2
|
BIN
2022/cpp/05/test
Executable file
BIN
2022/cpp/05/test
Executable file
Binary file not shown.
40
2022/cpp/05/test.cpp
Normal file
40
2022/cpp/05/test.cpp
Normal file
@ -0,0 +1,40 @@
|
||||
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
|
||||
#include "../doctest/doctest/doctest.h"
|
||||
#include "answer.hpp"
|
||||
|
||||
#if PART == 1
|
||||
TEST_CASE("Part 1") {
|
||||
Input expected_input{.stacks =
|
||||
{
|
||||
{'Z', 'N'},
|
||||
{'M', 'C', 'D'},
|
||||
{'P'},
|
||||
},
|
||||
.moves = {
|
||||
{0, 1, 0},
|
||||
{2, 0, 2},
|
||||
{1, 1, 0},
|
||||
{0, 0, 1},
|
||||
}};
|
||||
|
||||
Input actual_input = get_input("sample1");
|
||||
std::cout << expected_input << std::endl;
|
||||
std::cout << actual_input << std::endl;
|
||||
|
||||
SUBCASE("Testing input is parsed correctly") { CHECK(actual_input == expected_input); }
|
||||
|
||||
SUBCASE("Testing output is the one expected from AOC") {
|
||||
CHECK(get_result(actual_input) == "CMZ");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if PART == 2
|
||||
TEST_CASE("Part 2") {
|
||||
Input actual_input = get_input("sample2");
|
||||
|
||||
SUBCASE("Testing output is the one expected from AOC") {
|
||||
CHECK(get_result(actual_input) == "MCD");
|
||||
}
|
||||
}
|
||||
#endif
|
33
2022/cpp/06/Makefile
Normal file
33
2022/cpp/06/Makefile
Normal file
@ -0,0 +1,33 @@
|
||||
PART := 1
|
||||
CXXFLAGS := -Wall -O3 -DPART=$(PART)
|
||||
OBJ_DIR = build
|
||||
OBJ = answer.o
|
||||
|
||||
.PHONY = clean asdf sample1 sample2
|
||||
|
||||
asdf: result
|
||||
@echo "------- RESULT -------"
|
||||
@./result "input" | xclip -selection c
|
||||
@xclip -selection c -o
|
||||
|
||||
check: test
|
||||
./test
|
||||
|
||||
test: $(OBJ_DIR)/$(OBJ)
|
||||
|
||||
verbose: clean
|
||||
$(eval CXXFLAGS += -DVERBOSE)
|
||||
|
||||
$(OBJ_DIR)/$(OBJ): $(OBJ_DIR)/%.o: %.hpp
|
||||
|
||||
$(OBJ_DIR)/%.o: %.cpp
|
||||
@echo "Compiling $<..."
|
||||
@mkdir -p $(@D)
|
||||
gcc $(CXXFLAGS) -c -o $@ $<
|
||||
|
||||
result: $(OBJ_DIR)/$(OBJ)
|
||||
|
||||
clean:
|
||||
-rm -f *.o
|
||||
-rm -rf $(OBJ_DIR)/
|
||||
|
58
2022/cpp/06/answer.cpp
Normal file
58
2022/cpp/06/answer.cpp
Normal file
@ -0,0 +1,58 @@
|
||||
// AOC - 2022 - 06
|
||||
#include "answer.hpp"
|
||||
|
||||
#include <algorithm>
|
||||
#include <deque>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <queue>
|
||||
#include <unordered_set>
|
||||
|
||||
Input get_input(const char* filename) {
|
||||
std::ifstream stream(filename);
|
||||
std::string str;
|
||||
getline(stream, str);
|
||||
return {str};
|
||||
}
|
||||
|
||||
template <class T>
|
||||
bool contains_duplicates(std::deque<T> q) {
|
||||
std::unordered_set<T> set;
|
||||
for (auto& elem : q) {
|
||||
if (set.find(elem) != set.end())
|
||||
return true;
|
||||
set.insert(elem);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string get_result(Input input) {
|
||||
std::string ret;
|
||||
std::stringstream stream(input.str);
|
||||
std::deque<char> q;
|
||||
char c;
|
||||
#if PART == 1
|
||||
#define Q_SIZE 4
|
||||
#else
|
||||
#define Q_SIZE 14
|
||||
#endif
|
||||
for (int i = 0; i < Q_SIZE - 1; i++) {
|
||||
stream >> c;
|
||||
q.push_back(c);
|
||||
}
|
||||
|
||||
int i = Q_SIZE - 1;
|
||||
while (stream.rdbuf()->in_avail()) {
|
||||
i++;
|
||||
stream >> c;
|
||||
q.push_back(c);
|
||||
if (!contains_duplicates(q)) {
|
||||
std::cout << q << "is duplicate free" << std::endl;
|
||||
break;
|
||||
}
|
||||
std::cout << q << " DOES contain duplicates" << std::endl;
|
||||
q.pop_front();
|
||||
}
|
||||
ret = std::to_string(i);
|
||||
return ret;
|
||||
}
|
29
2022/cpp/06/answer.hpp
Normal file
29
2022/cpp/06/answer.hpp
Normal file
@ -0,0 +1,29 @@
|
||||
#include "lib.hpp"
|
||||
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
|
||||
#ifndef VERBOSE
|
||||
#define VERBOSE 0
|
||||
#endif
|
||||
|
||||
#ifndef PART
|
||||
#define PART 2
|
||||
#endif
|
||||
|
||||
struct Input {
|
||||
std::string str;
|
||||
|
||||
bool operator==(const Input& rhs) const {
|
||||
return this->str == rhs.str;
|
||||
}
|
||||
};
|
||||
|
||||
inline std::ostream& operator<<(std::ostream& os, Input& inp) {
|
||||
os << inp.str;
|
||||
return os;
|
||||
}
|
||||
|
||||
Input get_input(const char*);
|
||||
|
||||
std::string get_result(Input);
|
BIN
2022/cpp/06/build/answer.o
Normal file
BIN
2022/cpp/06/build/answer.o
Normal file
Binary file not shown.
1
2022/cpp/06/input
Normal file
1
2022/cpp/06/input
Normal file
@ -0,0 +1 @@
|
||||
hlfhfzffqnnrlnnvnmmgbgwgttbppcrcnnmdmfdmmgwwrrqnrrscrctcbttvcvtvvhchjhccjgjttmddplplqplqlbqlblrrbrvvprpffpmmzpmpcczjzzbwwfssvrrvggncgncgcwczzswwqqjjflffpwfpwpbwpwpdpbpvvqffcfcjffjllncczfzzmhzzmddgdrgrwwjzzdjjsnjsjfsjsjhhcchlccchqchhzzpnngdgndnpnppsdsggbvgvgpprqrqmmlzmzllvrrcvclcwczcqqcdcfcqqmmzbzdzdjzdjdmjdjzdjjcvjvcjvcvssltstttfbtftrfrlrdllrqqfssslccjdcjdjfdjfjqjnqjnjnrnddtnndtnnztzqztqztqzzpmzmggzrgrwwdqwdwcdwdnnmlmgmtmtstwssbffcnclclnclcjjcjpcpqcpqcpqpmqqfccpcjppnspsnnzggnpntndtdqtthwhnhwnwllzhlzhlzzghzghhlhvhwhjhfjjcnjnvjnjvvqccdmmgddllnmnrrdtdnncggfhgfglfgfmfnnpvvggznnwvnwwfgghrrfwrwzwszzzldzdldhlhblhblhbbbgjgsjggmqqmrrzggrhhwpwdpwdpwplpgpbggtssqffbqfbqbnnsqnqfnngcnnmwnmnbmmmslsjllbtbbpllltzzhgzztllsdllrvvhvjvbbhcbhchmchcctbcttvccgwcwpcchrcrdrdggcrrntrrfllcffbdfflrrrgbgrbbbdqbqjbbgbgrrqwqtwqwhwghwhzwwcswsnwnqqjhjhwhfwhffdfgddgjgsjgjhgglhlwhlhssfqfhhdmdnmnppdcddfzzhmhqqntqnnjvnjvjddcvcgcbgbbpjbjtbjjfgftgffplljfjrrhqqpddlssrvsrvrpppsllsdsqqqzzfttqsqzssjbbrnbnnrbbsrshsrrshrhwhbwbrrsrfrttfqtfqqfddvrvjrjvjsjhjsjdjqdjjlqjjjgcjcmcncfcrcwrwsrsslffzszmsszrsssrnrjjvbvpvcppptbbhhrddbcbggbqbmmsqqwggfpfbblmldmmpmwpwfwjfjsjnjmmpllccjzcjcwwpswshhpthhzchctcbcrrrrmvrvrdvvjmmvgmgwglghllvmllzlzzsvzzrmmhnnsjnnpvpwvpwwmvwwdqqdffhhhmccfgfvggchcctrrmdrrhrhnhnzzgpzzgttnhthvhzzqvvvwpwqpqdppsnnrgnnhphphmhcmcrmrvvqlvqqsccqhchzhwwmvmzmczzgsgdsggthgglrlnrlllbdllhwlwltwwcswsgssbhbsbvsbsbwbhbnncrcllttbrbppjccfpfhhgshschsccmrcmmcrrrzvvrcrggmwgwjwnwjjbffjddjnjgngqgdgnndznndvvfqfgfvvrvqrvvpllnsszbsbdbbdzbdbzbqbzznrznzjzpptcptccvwccfscffrftrrsnsvvswvvhbhzzfbzffncchhcnngzzcpcmmfttsntnjjsccqbcqqmzzgppdhppdtppmffgtgvvlzlpptdtttdppqjqtqctcrrzsswwtnwtnwnqqvbbdgjhvmmzpnhfvsbddzhgdwcnfdstvhhbzlzcfjwhlptbhmbmblprtsdmrdhbbbwpplnzgdnrzjmgzgpqbggnqvwwtntzgfwqrztqtdrsnhpfzswptggnvbszdcrmrhhtlrrfnpqrnpwrbmhlfwmdqqdbqrwbzqjbzwrgmbgrtzrhdclqfgsrtsgfwqrnnqgwsncmpgffggssrqvwjlhpsghbqdtzwmvzzvcmzsjqvprvcqwqjbcqcqrhpwwcsrscgmfdppbgvmnrdfrppblznbstnjzwwgstjvtprjbhtpdfgrhdjnjmnlbfwggzhcngvcwvcfpcwdtdppwjrdzsnjlnrzbfqqshlnzvwsmscgpfwjzhtwgfwgzdhbdwwzbsmfwwbmvrlrpswnjlmfbfzhwvcmgwfzssmmtjlwtrpwpwgnspbgchdncbfcpjsvtzjqtwqwjwgbhrbwvhqbcstsgsnwsjmhrlrvzgqhqfrmnrjdrhdjwcwctpdrzctlvnfzmzwhsnfprlzgzjpqvzchlmvbhffhpfjtvsdbvbdmwgvmqpflhwwndbqthmmwshdtspsrvqdflmmzwbqbqmpfdwjmvpbzdnqzfmhzdgldqjjvgpfcqftvjzwnzmfqdggrwlfzdhjnhmtrjbnllgqpntwmhnwtglnqdwbqdblpwnnrdwzpsqzfwqcmhqhnpsdcwvdldphgnrtqzdbnnzdzfttldrqcztlvlrgpdqzrcthslmtqhfvbzrfgnlrprcpbsctqhspbhnjtzrzhqjzszbzdthttqmbznzssftztwlggmdqqdtfllqjzjtvpgjfhtbwtbmtjplqnbdmsvlnqcwtdbdvfjnzgsmpnhbvvwwfbrgffjqfsccdjdwvbsdhqwfzvcpjzjbdjgrdctjplhwbdhhnbnwstvndnnwtsgbhzbvwdshvmnbwsthlrggtmddvjbfzfrnrdrqfjpslrccctzpjbwpdbhlbzfmwbltcqfngdprvfhgcszdtpnrcpdmllfnlspgrdrpwqmqbmrglvlrsmrfqrtzzgjcvqtqzpmghjrvmdmvvqztrjzbzjwdqsmrwpqnswbzhjbzzhdvmnfdsztzdzrjssgnnfqvbtsqrrmcppjgrmnstrnrlwjvvcczqlcbmwqzdfpssfwdfrvwtstwchdgwtrhhcmppcqlmrqlnwqccfphsdhbsbmtjvpcwwjrmrllbpnrmpbvwgwbftpdpphccwqcblcnvvbbppscmnjqgddllbnbvmmqzdffrrjtqwllzgpqrmnlfqrptzqmdmnrfnjpvqvjbsqrhljslgqqcqqtmtbwjrpphtjgjbqpzmzrzjrfjwcdcnbsjfljclffjplnrrcfbmhphtcjrzlrvvjcznpgpnrdwwqvgnbnzqnlcghhgwvhqbvjzfbdvhrzlqfbtlqhpltfjlfpbnjbphmmpntzqgjmwjtchwmlwvfjmfflqzpqnvvrgnbddzlfpdpdjghfgbsfddjspnfdwvqppncmdgfrnvrpcrflhgjgbwdsbwblfcwbtlrrnjjdhbvmrzgsvjwgfnnhqfbvhprlmwwqgclzlbqbrdspcbhftmdscsmpwrggrmnsvjphjmzmmrlrhnmdhwjlbmjchtvsrcplfspsssjznmzcrqnsjjtwjzvlhshbptqwwvjhjvzrhphphsbphpnzpfbwcdnqrhrrvlrwrztlpqnrcfzrncsvpzqzgslrlrwhvtgjmfncldqmvshlmnlpqbgvnwqfcthgrgllmqrjqmfgznspgltpptglpdcvhtzsprprbldbzhbmjsqzwvjggwhsczltcvgwqhspzpzvljwqjgrgtwswjdswlzjzslrsslvqzncjwhbbjpbdthqpgmhfglggmlrgwdsplgscrwstntvrhjzjjlshtgmnnhvsjwfmcjbpzjcstmnpvtbgrfcfdwjljsrfhdphrdcslwhgvlnwltwchplvfzntfgcnlsvzrvnnczhhqdlwjvqprhmtjdtwmppffmszzzqtfrgnhnzqgqzhrjzgntcszstrfhhtptgvswvzvjcgcntmhzzmdgsmtgzhpfvqfnwmsjdhtfgmmbrrfsdlptchqqzqdqjncmtpznfssrcnmcdnthglmfzsfgltrndqsfmdftmfgchbwmzgrtjvgqtshlltthnnpqnzfrchzhdzrrnpzvfzblrmhwdwjnqdptlbvndmmlhzhvsfdlmlhqrgqqzsdqtpczwcrwcbsftvvphfbwjrvrnrcqbbcsqgnhltwzvllljcvpwjgslbmngcdmpdvjlgcnrzwqjdgrblncpqmrgjmpqjzvdmcmwfnwqlszdgwqdfznhsnpsjrfwrqpqmpvhstmzgqblfmcfvwljbhdfhdmqcvrwnqcstwtzgmng
|
39
2022/cpp/06/lib.hpp
Normal file
39
2022/cpp/06/lib.hpp
Normal file
@ -0,0 +1,39 @@
|
||||
#include <deque>
|
||||
#include <iostream>
|
||||
#include <ostream>
|
||||
#include <vector>
|
||||
|
||||
template <class T>
|
||||
std::ostream& operator<<(std::ostream& os, const std::vector<T>& list) {
|
||||
unsigned long i = 0;
|
||||
os << "[";
|
||||
for (auto el : list) {
|
||||
os << el;
|
||||
if (i < list.size() - 1)
|
||||
os << ", ";
|
||||
i++;
|
||||
}
|
||||
os << "]";
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
template <class T>
|
||||
std::ostream& operator<<(std::ostream& os, const std::deque<T>& list) {
|
||||
unsigned long i = 0;
|
||||
os << "[";
|
||||
for (auto el : list) {
|
||||
os << el;
|
||||
if (i < list.size() - 1)
|
||||
os << ", ";
|
||||
i++;
|
||||
}
|
||||
os << "]";
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
inline void error(const char* msg) {
|
||||
std::cerr << msg << std::endl;
|
||||
exit(1);
|
||||
}
|
BIN
2022/cpp/06/result
Executable file
BIN
2022/cpp/06/result
Executable file
Binary file not shown.
23
2022/cpp/06/result.cpp
Normal file
23
2022/cpp/06/result.cpp
Normal file
@ -0,0 +1,23 @@
|
||||
#include "answer.hpp"
|
||||
#include <iostream>
|
||||
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
if (argc < 2)
|
||||
error("Please specify the input file as first argument.");
|
||||
|
||||
#if !VERBOSE
|
||||
std::cout.setstate(std::ios_base::failbit);
|
||||
#endif
|
||||
|
||||
Input input = get_input(argv[1]);
|
||||
std::string result = get_result(input);
|
||||
|
||||
#if !VERBOSE
|
||||
std::cout.clear();
|
||||
#endif
|
||||
|
||||
std::cout << result << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
1
2022/cpp/06/sample1
Normal file
1
2022/cpp/06/sample1
Normal file
@ -0,0 +1 @@
|
||||
mjqjpqmgbljsphdztnvjfqwrcgsmlb
|
1
2022/cpp/06/sample2
Normal file
1
2022/cpp/06/sample2
Normal file
@ -0,0 +1 @@
|
||||
bvwbjplbgvbhsrlpgdmjqwftvncz
|
1
2022/cpp/06/sample3
Normal file
1
2022/cpp/06/sample3
Normal file
@ -0,0 +1 @@
|
||||
nppdvjthqldpwncqszvftbrmjlhg
|
1
2022/cpp/06/sample4
Normal file
1
2022/cpp/06/sample4
Normal file
@ -0,0 +1 @@
|
||||
nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg
|
1
2022/cpp/06/sample5
Normal file
1
2022/cpp/06/sample5
Normal file
@ -0,0 +1 @@
|
||||
zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw
|
BIN
2022/cpp/06/test
Executable file
BIN
2022/cpp/06/test
Executable file
Binary file not shown.
67
2022/cpp/06/test.cpp
Normal file
67
2022/cpp/06/test.cpp
Normal file
@ -0,0 +1,67 @@
|
||||
#include <ostream>
|
||||
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
|
||||
#include "../doctest/doctest/doctest.h"
|
||||
#include "answer.hpp"
|
||||
|
||||
#if PART == 1
|
||||
|
||||
TEST_CASE("Part 1") {
|
||||
std::vector<Input> expected_inputs;
|
||||
expected_inputs.insert(expected_inputs.end(),
|
||||
{
|
||||
{"mjqjpqmgbljsphdztnvjfqwrcgsmlb"},
|
||||
{"bvwbjplbgvbhsrlpgdmjqwftvncz"},
|
||||
{"nppdvjthqldpwncqszvftbrmjlhg"},
|
||||
{"nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg"},
|
||||
{"zcfzfwzzqfrljwzlrfnpqdbhtmscgvjw"},
|
||||
});
|
||||
|
||||
std::vector<std::string> expected_outputs;
|
||||
expected_outputs.insert(expected_outputs.end(),
|
||||
{
|
||||
"7",
|
||||
"5",
|
||||
"6",
|
||||
"10",
|
||||
"11",
|
||||
});
|
||||
|
||||
for (int i : {0, 1, 2, 3, 4}) {
|
||||
Input expected_input = expected_inputs[i];
|
||||
|
||||
std::string sample_name = "sample" + std::to_string(i + 1);
|
||||
Input actual_input = get_input(sample_name.c_str());
|
||||
|
||||
SUBCASE("Testing input is parsed correctly") {
|
||||
CHECK(actual_input == expected_input);
|
||||
}
|
||||
|
||||
SUBCASE("Testing output is the one expected from AOC") {
|
||||
CHECK(get_result(actual_input) == expected_outputs[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if PART == 2
|
||||
TEST_CASE("Part 2") {
|
||||
std::vector<std::string> expected_outputs;
|
||||
expected_outputs.insert(expected_outputs.end(),
|
||||
{
|
||||
"19",
|
||||
"23",
|
||||
"23",
|
||||
"29",
|
||||
"26",
|
||||
});
|
||||
|
||||
for (int i : {0, 1, 2, 3, 4}) {
|
||||
std::string sample_name = "sample" + std::to_string(i + 1);
|
||||
Input actual_input = get_input(sample_name.c_str());
|
||||
|
||||
SUBCASE("Testing output is the one expected from AOC") {
|
||||
CHECK(get_result(actual_input) == expected_outputs[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
33
2022/cpp/07/Makefile
Normal file
33
2022/cpp/07/Makefile
Normal file
@ -0,0 +1,33 @@
|
||||
PART := 1
|
||||
CXXFLAGS := -Wall -O3 -DPART=$(PART)
|
||||
OBJ_DIR = build
|
||||
OBJ = answer.o
|
||||
|
||||
.PHONY = clean asdf sample1 sample2
|
||||
|
||||
asdf: result
|
||||
@echo "------- RESULT -------"
|
||||
@./result "input" | xclip -selection c
|
||||
@xclip -selection c -o
|
||||
|
||||
check: test
|
||||
./test
|
||||
|
||||
test: $(OBJ_DIR)/$(OBJ)
|
||||
|
||||
verbose: clean
|
||||
$(eval CXXFLAGS += -DVERBOSE)
|
||||
|
||||
$(OBJ_DIR)/$(OBJ): $(OBJ_DIR)/%.o: %.hpp
|
||||
|
||||
$(OBJ_DIR)/%.o: %.cpp
|
||||
@echo "Compiling $<..."
|
||||
@mkdir -p $(@D)
|
||||
gcc $(CXXFLAGS) -c -o $@ $<
|
||||
|
||||
result: $(OBJ_DIR)/$(OBJ)
|
||||
|
||||
clean:
|
||||
-rm -f *.o
|
||||
-rm -rf $(OBJ_DIR)/
|
||||
|
145
2022/cpp/07/answer.cpp
Normal file
145
2022/cpp/07/answer.cpp
Normal file
@ -0,0 +1,145 @@
|
||||
// AOC - 2022 - 07
|
||||
#include "answer.hpp"
|
||||
|
||||
#include <deque>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
|
||||
bool is_dir(std::string line) {
|
||||
return line.substr(0, 3) == "dir";
|
||||
}
|
||||
|
||||
bool is_command(std::string line) {
|
||||
return line[0] == '$';
|
||||
}
|
||||
|
||||
Dir* get_subdir(Dir* current_dir, const std::string& subdir_name) {
|
||||
for (auto& dir : current_dir->dirs)
|
||||
if (dir->name == subdir_name)
|
||||
return dir;
|
||||
|
||||
std::cerr << "'" << subdir_name << "' not in " << current_dir->name
|
||||
<< std::endl;
|
||||
error("couldn't find subdir");
|
||||
}
|
||||
|
||||
Dir* handle_command(
|
||||
Dir* current_dir, std::string& cmd_line, std::ifstream& input) {
|
||||
std::cout << "CWD: " << current_dir->name << std::endl;
|
||||
std::cout << "Handling cmd: '" << cmd_line << "'" << std::endl;
|
||||
std::stringstream cmd_stream(cmd_line);
|
||||
std::string cmd, _;
|
||||
cmd_stream >> _; // $
|
||||
cmd_stream >> cmd;
|
||||
std::string line;
|
||||
|
||||
Dir* reading_dir = current_dir;
|
||||
if (cmd == "ls") {
|
||||
if (!cmd_stream.eof()) {
|
||||
std::string dir_name;
|
||||
cmd_stream >> dir_name;
|
||||
reading_dir = get_subdir(current_dir, dir_name);
|
||||
}
|
||||
|
||||
while (std::getline(input, line) && !is_command(line)) {
|
||||
if (is_dir(line)) {
|
||||
std::string dir_name = line.substr(4);
|
||||
std::cout << "Adding dir '" << dir_name << "' to "
|
||||
<< current_dir->name << std::endl;
|
||||
reading_dir->dirs.push_back(new Dir{reading_dir, dir_name});
|
||||
} else {
|
||||
uint size;
|
||||
std::string file_name;
|
||||
std::stringstream file_line_stream(line);
|
||||
file_line_stream >> size;
|
||||
file_line_stream >> file_name;
|
||||
reading_dir->files.push_back({size, file_name});
|
||||
}
|
||||
}
|
||||
std::cout << "After reading, the cwd looks like" << std::endl;
|
||||
std::cout << *reading_dir << std::endl;
|
||||
if (is_command(line))
|
||||
return handle_command(current_dir, line, input);
|
||||
else
|
||||
return current_dir;
|
||||
} else if (cmd == "cd") {
|
||||
std::string new_dirname;
|
||||
cmd_stream >> new_dirname;
|
||||
std::cout << "cd-ing to " << new_dirname << std::endl;
|
||||
if (new_dirname == "..") {
|
||||
std::cout << "\t thus to " << current_dir->parent->name
|
||||
<< std::endl;
|
||||
return current_dir->parent;
|
||||
} else
|
||||
return get_subdir(current_dir, new_dirname);
|
||||
} else {
|
||||
std::cerr << "Invalid cmd: " << cmd << std::endl;
|
||||
error("Invalid command");
|
||||
}
|
||||
}
|
||||
|
||||
Input get_input(const char* filename) {
|
||||
std::ifstream stream(filename);
|
||||
std::string str;
|
||||
|
||||
Dir* root = new Dir{nullptr, "/"};
|
||||
getline(stream, str); // cd /
|
||||
Dir* current_dir = root;
|
||||
|
||||
while (getline(stream, str))
|
||||
current_dir = handle_command(current_dir, str, stream);
|
||||
|
||||
std::cout << "current" << std::endl;
|
||||
std::cout << *current_dir << std::endl;
|
||||
std::cout << "root" << std::endl;
|
||||
std::cout << *root << std::endl;
|
||||
|
||||
return {*root};
|
||||
}
|
||||
|
||||
#define CUTOFF_SIZE 100000
|
||||
#define FILESYSTEM_SIZE 70000000
|
||||
#define NEEDED_SIZE 30000000
|
||||
|
||||
std::string get_result(Input input) {
|
||||
std::string ret;
|
||||
#if PART == 1
|
||||
std::vector<Dir*> queue;
|
||||
queue.push_back(&input.root);
|
||||
int i = 0;
|
||||
uint res = 0;
|
||||
while (i < queue.size()) {
|
||||
std::cout << "ehhlo?" << std::endl;
|
||||
Dir d = *queue[i++];
|
||||
if (d.get_size() < CUTOFF_SIZE)
|
||||
res += d.get_size();
|
||||
for (auto& d : d.dirs)
|
||||
queue.push_back(d);
|
||||
for (auto& d : queue)
|
||||
std::cout << *d << std::endl;
|
||||
}
|
||||
ret = std::to_string(res);
|
||||
#else
|
||||
uint space_to_free = input.root.get_size() - NEEDED_SIZE;
|
||||
std::cout << space_to_free << std::endl;
|
||||
std::vector<Dir*> queue;
|
||||
queue.push_back(&input.root);
|
||||
int i = 0;
|
||||
uint min_above_needed = -1;
|
||||
while (i < queue.size()) {
|
||||
Dir d = *queue[i++];
|
||||
if (d.get_size() < space_to_free)
|
||||
continue;
|
||||
else if (d.get_size() < min_above_needed)
|
||||
min_above_needed = d.get_size();
|
||||
|
||||
for (auto& sub_dir : d.dirs)
|
||||
queue.push_back(sub_dir);
|
||||
for (auto& d : queue)
|
||||
std::cout << d->name << std::endl;
|
||||
}
|
||||
ret = std::to_string(min_above_needed);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
80
2022/cpp/07/answer.hpp
Normal file
80
2022/cpp/07/answer.hpp
Normal file
@ -0,0 +1,80 @@
|
||||
#include "lib.hpp"
|
||||
|
||||
#include <string>
|
||||
|
||||
#ifndef VERBOSE
|
||||
#define VERBOSE 0
|
||||
#endif
|
||||
|
||||
#ifndef PART
|
||||
#define PART 2
|
||||
#endif
|
||||
|
||||
struct File {
|
||||
uint size;
|
||||
std::string name;
|
||||
|
||||
bool operator==(const File& rhs) const {
|
||||
return this->name == rhs.name && this->size == rhs.size;
|
||||
}
|
||||
};
|
||||
|
||||
struct Dir {
|
||||
Dir* parent;
|
||||
std::string name;
|
||||
std::vector<Dir*> dirs;
|
||||
std::vector<File> files;
|
||||
uint size = 0;
|
||||
|
||||
uint get_size() {
|
||||
if (this->size > 0)
|
||||
return this->size;
|
||||
uint res = 0;
|
||||
for (auto& f : this->files)
|
||||
res += f.size;
|
||||
|
||||
for (auto& d : this->dirs)
|
||||
res += d->get_size();
|
||||
this->size = res;
|
||||
return res;
|
||||
}
|
||||
|
||||
bool operator==(const Dir& rhs) const {
|
||||
return this->name == rhs.name && this->dirs == rhs.dirs &&
|
||||
this->files == rhs.files;
|
||||
}
|
||||
};
|
||||
|
||||
struct Input {
|
||||
Dir root;
|
||||
|
||||
bool operator==(const Input& rhs) const {
|
||||
return this->root == rhs.root;
|
||||
}
|
||||
};
|
||||
|
||||
inline std::ostream& operator<<(std::ostream& os, File& file) {
|
||||
os << "- " << file.name << " (file, size=" << file.size << ")" << std::endl;
|
||||
return os;
|
||||
}
|
||||
|
||||
inline std::ostream& operator<<(std::ostream& os, Dir& dir) {
|
||||
os << "- " << dir.name << " (dir";
|
||||
if (dir.parent)
|
||||
os << ", parent=" << dir.parent->name;
|
||||
os << ")" << std::endl;
|
||||
for (auto& d : dir.dirs)
|
||||
os << '\t' << *d;
|
||||
for (auto& f : dir.files)
|
||||
os << '\t' << f;
|
||||
return os;
|
||||
}
|
||||
|
||||
inline std::ostream& operator<<(std::ostream& os, Input& inp) {
|
||||
os << inp.root;
|
||||
return os;
|
||||
}
|
||||
|
||||
Input get_input(const char*);
|
||||
|
||||
std::string get_result(Input);
|
BIN
2022/cpp/07/build/answer.o
Normal file
BIN
2022/cpp/07/build/answer.o
Normal file
Binary file not shown.
1101
2022/cpp/07/input
Normal file
1101
2022/cpp/07/input
Normal file
File diff suppressed because it is too large
Load Diff
23
2022/cpp/07/lib.hpp
Normal file
23
2022/cpp/07/lib.hpp
Normal file
@ -0,0 +1,23 @@
|
||||
#include <iostream>
|
||||
#include <ostream>
|
||||
#include <vector>
|
||||
|
||||
template <class T>
|
||||
std::ostream& operator<<(std::ostream& os, const std::vector<T>& list) {
|
||||
unsigned long i = 0;
|
||||
os << "[";
|
||||
for (auto el : list) {
|
||||
os << el;
|
||||
if (i < list.size() - 1)
|
||||
os << ", ";
|
||||
i++;
|
||||
}
|
||||
os << "]";
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
inline void error(const char* msg) {
|
||||
std::cerr << msg << std::endl;
|
||||
exit(1);
|
||||
}
|
BIN
2022/cpp/07/result
Executable file
BIN
2022/cpp/07/result
Executable file
Binary file not shown.
23
2022/cpp/07/result.cpp
Normal file
23
2022/cpp/07/result.cpp
Normal file
@ -0,0 +1,23 @@
|
||||
#include "answer.hpp"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
if (argc < 2)
|
||||
error("Please specify the input file as first argument.");
|
||||
|
||||
#if !VERBOSE
|
||||
std::cout.setstate(std::ios_base::failbit);
|
||||
#endif
|
||||
|
||||
Input input = get_input(argv[1]);
|
||||
std::string result = get_result(input);
|
||||
|
||||
#if !VERBOSE
|
||||
std::cout.clear();
|
||||
#endif
|
||||
|
||||
std::cout << result << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
23
2022/cpp/07/sample1
Normal file
23
2022/cpp/07/sample1
Normal file
@ -0,0 +1,23 @@
|
||||
$ cd /
|
||||
$ ls
|
||||
dir a
|
||||
14848514 b.txt
|
||||
8504156 c.dat
|
||||
dir d
|
||||
$ cd a
|
||||
$ ls
|
||||
dir e
|
||||
29116 f
|
||||
2557 g
|
||||
62596 h.lst
|
||||
$ cd e
|
||||
$ ls
|
||||
584 i
|
||||
$ cd ..
|
||||
$ cd ..
|
||||
$ cd d
|
||||
$ ls
|
||||
4060174 j
|
||||
8033020 d.log
|
||||
5626152 d.ext
|
||||
7214296 k
|
23
2022/cpp/07/sample2
Normal file
23
2022/cpp/07/sample2
Normal file
@ -0,0 +1,23 @@
|
||||
$ cd /
|
||||
$ ls
|
||||
dir a
|
||||
14848514 b.txt
|
||||
8504156 c.dat
|
||||
dir d
|
||||
$ cd a
|
||||
$ ls
|
||||
dir e
|
||||
29116 f
|
||||
2557 g
|
||||
62596 h.lst
|
||||
$ cd e
|
||||
$ ls
|
||||
584 i
|
||||
$ cd ..
|
||||
$ cd ..
|
||||
$ cd d
|
||||
$ ls
|
||||
4060174 j
|
||||
8033020 d.log
|
||||
5626152 d.ext
|
||||
7214296 k
|
BIN
2022/cpp/07/test
Executable file
BIN
2022/cpp/07/test
Executable file
Binary file not shown.
25
2022/cpp/07/test.cpp
Normal file
25
2022/cpp/07/test.cpp
Normal file
@ -0,0 +1,25 @@
|
||||
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
|
||||
#include "../doctest/doctest/doctest.h"
|
||||
#include "answer.hpp"
|
||||
|
||||
#if PART == 1
|
||||
TEST_CASE("Part 1") {
|
||||
Input actual_input = get_input("sample1");
|
||||
std::cout << "actual_input" << std::endl;
|
||||
std::cout << actual_input << std::endl;
|
||||
|
||||
SUBCASE("Testing output is the one expected from AOC") {
|
||||
CHECK(get_result(actual_input) == "95437");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if PART == 2
|
||||
TEST_CASE("Part 2") {
|
||||
Input actual_input = get_input("sample2");
|
||||
|
||||
SUBCASE("Testing output is the one expected from AOC") {
|
||||
CHECK(get_result(actual_input) == "24933642");
|
||||
}
|
||||
}
|
||||
#endif
|
33
2022/cpp/08/Makefile
Normal file
33
2022/cpp/08/Makefile
Normal file
@ -0,0 +1,33 @@
|
||||
PART := 1
|
||||
CXXFLAGS := -Wall -O3 -DPART=$(PART)
|
||||
OBJ_DIR = build
|
||||
OBJ = answer.o
|
||||
|
||||
.PHONY = clean asdf sample1 sample2
|
||||
|
||||
asdf: result
|
||||
@echo "------- RESULT -------"
|
||||
@./result "input" | xclip -selection c
|
||||
@xclip -selection c -o
|
||||
|
||||
check: test
|
||||
./test
|
||||
|
||||
test: $(OBJ_DIR)/$(OBJ)
|
||||
|
||||
verbose: clean
|
||||
$(eval CXXFLAGS += -DVERBOSE)
|
||||
|
||||
$(OBJ_DIR)/$(OBJ): $(OBJ_DIR)/%.o: %.hpp
|
||||
|
||||
$(OBJ_DIR)/%.o: %.cpp
|
||||
@echo "Compiling $<..."
|
||||
@mkdir -p $(@D)
|
||||
gcc $(CXXFLAGS) -c -o $@ $<
|
||||
|
||||
result: $(OBJ_DIR)/$(OBJ)
|
||||
|
||||
clean:
|
||||
-rm -f *.o
|
||||
-rm -rf $(OBJ_DIR)/
|
||||
|
130
2022/cpp/08/answer.cpp
Normal file
130
2022/cpp/08/answer.cpp
Normal file
@ -0,0 +1,130 @@
|
||||
// AOC - 2022 - 08
|
||||
#include "answer.hpp"
|
||||
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
Input get_input(const char* filename) {
|
||||
std::ifstream stream(filename);
|
||||
std::string str;
|
||||
Input ret;
|
||||
|
||||
getline(stream, str);
|
||||
ret.width = str.size();
|
||||
for (auto c : str)
|
||||
ret.trees.push_back(c);
|
||||
|
||||
while (getline(stream, str))
|
||||
for (char c : str)
|
||||
ret.trees.push_back(c);
|
||||
ret.height = ret.trees.size() / ret.width;
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool is_tree_seen(uint x, uint y, Forest& forest) {
|
||||
Tree current_tree = forest.tree_at(x, y);
|
||||
bool is_seen = true;
|
||||
// north
|
||||
for (uint i = 0; i < y; i++)
|
||||
if (forest.tree_at(x, i) >= current_tree)
|
||||
is_seen = false;
|
||||
if (is_seen)
|
||||
return true;
|
||||
|
||||
is_seen = true;
|
||||
// east
|
||||
for (uint i = x + 1; i < forest.width; i++)
|
||||
if (forest.tree_at(i, y) >= current_tree)
|
||||
is_seen = false;
|
||||
if (is_seen)
|
||||
return true;
|
||||
|
||||
is_seen = true;
|
||||
// south
|
||||
for (uint i = y + 1; i < forest.height; i++)
|
||||
if (forest.tree_at(x, i) >= current_tree)
|
||||
is_seen = false;
|
||||
if (is_seen)
|
||||
return true;
|
||||
|
||||
is_seen = true;
|
||||
// west
|
||||
for (uint i = 0; i < x; i++)
|
||||
if (forest.tree_at(i, y) >= current_tree)
|
||||
is_seen = false;
|
||||
|
||||
if (!is_seen)
|
||||
std::cout << "couldn't see tree " << current_tree << " at " << x << ", "
|
||||
<< y << std::endl;
|
||||
|
||||
return is_seen;
|
||||
}
|
||||
|
||||
uint scenic_score(uint x, uint y, Forest& forest) {
|
||||
Tree current_tree = forest.tree_at(x, y);
|
||||
uint total_score = 1;
|
||||
uint score = 0;
|
||||
|
||||
// north
|
||||
for (int i = y - 1; i >= 0; i--) {
|
||||
score++;
|
||||
if (forest.tree_at(x, i) >= current_tree)
|
||||
break;
|
||||
}
|
||||
total_score *= score;
|
||||
|
||||
score = 0;
|
||||
// east
|
||||
for (uint i = x + 1; i < forest.width; i++) {
|
||||
score++;
|
||||
if (forest.tree_at(i, y) >= current_tree)
|
||||
break;
|
||||
}
|
||||
total_score *= score;
|
||||
|
||||
score = 0;
|
||||
// south
|
||||
for (uint i = y + 1; i < forest.height; i++) {
|
||||
score++;
|
||||
if (forest.tree_at(x, i) >= current_tree)
|
||||
break;
|
||||
}
|
||||
total_score *= score;
|
||||
|
||||
score = 0;
|
||||
// west
|
||||
for (int i = x - 1; i >= 0; i--) {
|
||||
score++;
|
||||
if (forest.tree_at(i, y) >= current_tree)
|
||||
break;
|
||||
}
|
||||
|
||||
total_score *= score;
|
||||
|
||||
return total_score;
|
||||
}
|
||||
|
||||
std::string get_result(Input& forest) {
|
||||
std::string ret;
|
||||
#if PART == 1
|
||||
uint count = 2 * forest.width + 2 * forest.height - 4;
|
||||
for (uint y = 1; y < forest.height - 1; y++) {
|
||||
for (uint x = 1; x < forest.width - 1; x++)
|
||||
if (is_tree_seen(x, y, forest))
|
||||
count++;
|
||||
}
|
||||
ret = std::to_string(count);
|
||||
#else
|
||||
uint max_scenic_score = 0;
|
||||
for (uint y = 1; y < forest.height - 1; y++) {
|
||||
for (uint x = 1; x < forest.width - 1; x++) {
|
||||
uint score = scenic_score(x, y, forest);
|
||||
if (max_scenic_score < score)
|
||||
max_scenic_score = score;
|
||||
}
|
||||
}
|
||||
ret = std::to_string(max_scenic_score);
|
||||
#endif
|
||||
return ret;
|
||||
}
|
48
2022/cpp/08/answer.hpp
Normal file
48
2022/cpp/08/answer.hpp
Normal file
@ -0,0 +1,48 @@
|
||||
#include "lib.hpp"
|
||||
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
|
||||
#ifndef VERBOSE
|
||||
#define VERBOSE 0
|
||||
#endif
|
||||
|
||||
#ifndef PART
|
||||
#define PART 2
|
||||
#endif
|
||||
|
||||
|
||||
typedef uint8_t Tree;
|
||||
|
||||
struct Forest {
|
||||
uint width, height;
|
||||
std::vector<Tree> trees;
|
||||
|
||||
bool operator==(const Forest& rhs) const {
|
||||
return this->trees == rhs.trees;
|
||||
}
|
||||
|
||||
uint get_idx(uint x, uint y) {
|
||||
return y * width + x;
|
||||
}
|
||||
|
||||
Tree tree_at(uint x, uint y) {
|
||||
return trees[get_idx(x, y)];
|
||||
}
|
||||
};
|
||||
|
||||
typedef Forest Input;
|
||||
|
||||
inline std::ostream& operator<<(std::ostream& os, Input& inp) {
|
||||
uint col = 0;
|
||||
for (auto& tree : inp.trees) {
|
||||
os << tree;
|
||||
if (++col % inp.width == 0)
|
||||
os << '\n';
|
||||
}
|
||||
return os;
|
||||
}
|
||||
|
||||
Input get_input(const char*);
|
||||
|
||||
std::string get_result(Input&);
|
BIN
2022/cpp/08/build/answer.o
Normal file
BIN
2022/cpp/08/build/answer.o
Normal file
Binary file not shown.
99
2022/cpp/08/input
Normal file
99
2022/cpp/08/input
Normal file
@ -0,0 +1,99 @@
|
||||
200120010031113332213034140102430141241124321111512323442304040044220141342121012210022220211111200
|
||||
111021120230012003124233312003010303204555454332453445353125225214221214442214301113012111020220220
|
||||
010000112330232223210123331341111021455213441355415452453433542411022110033014112420103200010200112
|
||||
210220131023203033023421012411405531115123145115445215311422135252541100222231431331003220231121021
|
||||
020112210133112114444340100410411231114131452544155151415233415312511222041221113442132231003203100
|
||||
121210122332301142321211440441113455552434332511455325315545354524142541534411112013143013120333022
|
||||
002022223332143323320030004111431434153352153321414154453442552321332341355132444030442110103203212
|
||||
212130023213100232130230411132244242133251435525323326611211534441513532233340420321144212221332012
|
||||
112201210213131241203033341411115513233426453426433653356253533133113511115222441140433214102332200
|
||||
212012000101044144022321521321444445566546646625625665232323663631331412343532242340023204432003233
|
||||
101233132121222100241254211542133266356326564552445466322626353633223221135151311240430411433022011
|
||||
200132020222314334333551152431232424524623645555522366665322366466545513112135535223102441334310202
|
||||
023113000020114221524122422222662645435544455234636242322656464245462233555511334411233402112203303
|
||||
323212301014434412315252233452332225554646452654545433445553336343544664455435323243510303023142200
|
||||
310022200424121333144123222262332322343322244646667564465544426245466232342143412141451122001041322
|
||||
212301111322001335441132334525635254352425553354565445643472236236266635446421522132452121404230333
|
||||
222212444300345211222512256444456624535343536756355746664436374344346652444335121144422222340114403
|
||||
133103420101433344253425324366444265345745457464444766674564476573243345254266312555221132304022243
|
||||
104024111323421413115464433455553477333456354575666765646757774776752425462423244113225443242031103
|
||||
102001244212344453145353232652647556546465453563544776667356374453675332254663444121345213131024201
|
||||
224444241243433331136646422564367344447534333336573546336576477746463642222264422255444411444213332
|
||||
111102440221143134255523244546456346745346547453543465664363545634575433436342252431313443241200434
|
||||
134231321331555233423635635366465473563535535586445888474374535544636375425246452265522242444124430
|
||||
234112414314111344422243544643454775656784865866884848444877466476364476356322553554245224411411221
|
||||
034400114351525345222546546744637535635657575787587675474664764764736443646462322222525151425423322
|
||||
200214241324215322354446653764777674587466544685754678446567884767437556756324542252661541311422130
|
||||
343144113253113264625454456777333344687566876677476786864558645875776364454562645333232242321313142
|
||||
343024121143435322432236376444777668467756646886688564457885758774655565674476525265433235351133020
|
||||
403402124545255442342535445764457654765745674556784877787445455686478773563733543423236235255444144
|
||||
103322531152132266562676355566367676848756788886766967585484486646776553753344443262466623351341241
|
||||
310355244513624552353465735465555764667556575665597778969594858667646774744555337236256442514154340
|
||||
023311451112523462333545544537465688645559988688956997665697964748587858337347363225646321434554144
|
||||
320135522136342345436443367666564847488558589757575579796688785767645678467555334323622425311134113
|
||||
302355525243323546577736555686874886486985688686888898966978978668487864787645754566534465541511251
|
||||
334125312126266532347576536548547584696886997768569758698995755875465674754333433642553345425533431
|
||||
341111335132225635365534457665748575977867585959997886979957965558787465664637533766462255534332423
|
||||
332515314534343636736373478687676678865555895657977886779567677978977887466835476754353523355412552
|
||||
223554423243256435734467677444784886576856669787898778968956989875566754875777467667635224535114135
|
||||
155522522343322534364735656868875656687568869667769697877887796866975856457447636733764232364431215
|
||||
242345244424435673345476658556448689589759768689899966877768987857579874745884637474453634352133231
|
||||
415255446645436567674735664645455855996887768879976678686967768687868985856885736776326622253351232
|
||||
345511155426334655353457846578475998667966669787979667866969678557875668566464436456435236255355314
|
||||
142554534636264637437346664558867877978687978689679869967766679569789677485678377367342526223134543
|
||||
445152112563265336347774464854776998568899676687677797996796877777879786686845577654534235322155423
|
||||
333311452256452445537757558677965658888896678979799998788899698785896978877575444547572432544335251
|
||||
153342523322435374455644657476596955598987666997999878876686677879688676464687476363732553363413554
|
||||
144335145664565566437454557675966795686769969779977988878679878778787789465465637576634655354532332
|
||||
152415343652336664567566647557776598677998979889877998977867798897785759685544636646555455665423232
|
||||
233452324356364643433768554555595977968766779897887998898666688775789556775758843355374525244243434
|
||||
415514136342636535455644448567857957878867697988999887897878896698589669784466744746433345345355353
|
||||
232342145445335734443368474877857768999979889789879797978786868766697957448687837436437246435352325
|
||||
423142134652644455355368647749855698998886897798977997799867788779868756865564445675347463653623132
|
||||
221215125542657466763755887857659858677696867997877899797779899996787779754784846775376254442211254
|
||||
154531463524644747547747455647685566769977767978799879788898879798999996758665537564563322242224125
|
||||
114543323332546776763457675777969696978788779877889799879998997975759878686666834757774555334611241
|
||||
353441154256436766664748544445957885788777978878979877989798876799786999466647747557553324526153313
|
||||
433233236244364537664567776764977668967888876787887977898978679686668778764647857553662664333221513
|
||||
112335142543334473565677774456986769698869989679787999966877889796668798648474667745633463364123315
|
||||
113555236654542657737447854474695576987788777767987976776779677896568655666568777374452626625515123
|
||||
335535115334436455537766485588496998559679678997888767666867796988758985466776445675326242423551222
|
||||
113534446446435634464566878474597579966586699697988866966997787776788976778774466655756463456235323
|
||||
432234422656545375357656547448457656589888789768979867898878979959955468888683644466555336562315155
|
||||
313344415452422533675445775845665999956589788887986877769867786689888565577764433373633363624515141
|
||||
222432351346446453465663784584875977688789959977876966969658866777886544775874577535665532224311252
|
||||
225114233145352533344653757488874695566977756698769768695668575699668757584555454357642544414312222
|
||||
033415322244643242337557674678486867575857998965787859688788778777887745544746656765646262354135222
|
||||
244444135424622245536477356767676647596876888859989597677576756885858547856577434533266366252341111
|
||||
043422441154553466473376764757644888596669857975585975898957778585855575867574554436566563342243533
|
||||
331142132342425642446677456357664865566895568659588999997598897847485545576757377726563624233332331
|
||||
023252542543632422666654576368776445864568889675685656595757555564576478356355573264462564525315531
|
||||
401013153355343645357335364463874854866687865999886679877556446867474565563474773455256232432344241
|
||||
021145311524153334266573666344586785645787666877957988698886547444446737764473344255436645355133043
|
||||
343022114235145422524664767447348848745548778464684486768568675765556575337775543626443412212441440
|
||||
111402455441135334663624565477563468586767564584754776865658486876757446535673333342623334312243002
|
||||
300312451335434322222245676775746358685854756547745674447587647487533473336654232544332431554454412
|
||||
433111155454541556355524273356653577688858857767884847858548544877576457444762553325524214215402141
|
||||
131233333423335563265232427676636343767667757678865557657665545337553674363435662333422331253432142
|
||||
424110224332255444554444426563344537343587775787775766858448446366677553432226234426335534235001312
|
||||
333412002215124441543424366273747763767633456777658554454464446357566564765333524264253113145112300
|
||||
101110030515255434456252656567734365435643756543777575374763565634563366532624443621453215143234300
|
||||
303322412424455315323623364345353365376676743654344676735433644466637676342646445331232331222232310
|
||||
323112211415542144152522545435246756534467755554567676637543357465766366552324534423444455001240332
|
||||
104010010231221552145233456226456635564775656444567465773637433733444632663325561451234351230241312
|
||||
121411232340543435321316435636242655564355535365574763633547465475523553325562122152444444042300041
|
||||
131012210332331125512334254246234345354543573744464635755354544666345534262435114123351541032131413
|
||||
320204021134412321515435566234224352423426577577364457356445435455454244243342521425351312003010221
|
||||
323114214132034241313542544555435465334424654666346364554655422236635456436354122354410044244241323
|
||||
013302120424301452153353441245652435266525344656664634425626224355262362255351231351513443132401213
|
||||
320030122021334215313244242334523262333453263233364243362363226452453421344311524253311414201210001
|
||||
232000301112410134252124412414346224626463252363536262245565624425334453135542241232142142113023001
|
||||
023101113421202000305251552134255163452646652324334242436543224522235515444445314014323100240020120
|
||||
320223110031202012323335553432231212252653563665545464422324656333443431535442453303001103202231020
|
||||
102033222010100142203435155413125314311166645446465322244546532441244154143433143443342400201012012
|
||||
103310002120123402241302221241151441435355114335344522434421453552354154135223134443030043002000021
|
||||
112323110033212002113322411233332355223342424233213123445224135331545115152043042400020200022133330
|
||||
022111301200101044211214231433231311322554214331413543414521424255241531111410022413003020200231110
|
||||
012022111212202121003233141343155411314255551134343533133453252153433344441013011221420230021203220
|
||||
221101122202110034040022441212441254112211113355531534335143125434435312222200311411322330203331100
|
||||
210122210200133032213341213111433213432513121525124133544144433541201142230241123430213303001122221
|
23
2022/cpp/08/lib.hpp
Normal file
23
2022/cpp/08/lib.hpp
Normal file
@ -0,0 +1,23 @@
|
||||
#include <iostream>
|
||||
#include <ostream>
|
||||
#include <vector>
|
||||
|
||||
template <class T>
|
||||
std::ostream& operator<<(std::ostream& os, const std::vector<T>& list) {
|
||||
unsigned long i = 0;
|
||||
os << "[";
|
||||
for (auto el : list) {
|
||||
os << el;
|
||||
if (i < list.size() - 1)
|
||||
os << ", ";
|
||||
i++;
|
||||
}
|
||||
os << "]";
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
inline void error(const char* msg) {
|
||||
std::cerr << msg << std::endl;
|
||||
exit(1);
|
||||
}
|
BIN
2022/cpp/08/result
Executable file
BIN
2022/cpp/08/result
Executable file
Binary file not shown.
23
2022/cpp/08/result.cpp
Normal file
23
2022/cpp/08/result.cpp
Normal file
@ -0,0 +1,23 @@
|
||||
#include "answer.hpp"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
if (argc < 2)
|
||||
error("Please specify the input file as first argument.");
|
||||
|
||||
#if !VERBOSE
|
||||
std::cout.setstate(std::ios_base::failbit);
|
||||
#endif
|
||||
|
||||
Input input = get_input(argv[1]);
|
||||
std::string result = get_result(input);
|
||||
|
||||
#if !VERBOSE
|
||||
std::cout.clear();
|
||||
#endif
|
||||
|
||||
std::cout << result << std::endl;
|
||||
|
||||
return 0;
|
||||
}
|
5
2022/cpp/08/sample1
Normal file
5
2022/cpp/08/sample1
Normal file
@ -0,0 +1,5 @@
|
||||
30373
|
||||
25512
|
||||
65332
|
||||
33549
|
||||
35390
|
5
2022/cpp/08/sample2
Normal file
5
2022/cpp/08/sample2
Normal file
@ -0,0 +1,5 @@
|
||||
30373
|
||||
25512
|
||||
65332
|
||||
33549
|
||||
35390
|
BIN
2022/cpp/08/test
Executable file
BIN
2022/cpp/08/test
Executable file
Binary file not shown.
58
2022/cpp/08/test.cpp
Normal file
58
2022/cpp/08/test.cpp
Normal file
@ -0,0 +1,58 @@
|
||||
#define DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
|
||||
#include "../doctest/doctest/doctest.h"
|
||||
#include "answer.hpp"
|
||||
|
||||
#if PART == 1
|
||||
TEST_CASE("Part 1") {
|
||||
Input actual_input = get_input("sample1");
|
||||
|
||||
Input expected_input;
|
||||
expected_input.width = 5;
|
||||
for (auto t : {
|
||||
'3',
|
||||
'0',
|
||||
'3',
|
||||
'7',
|
||||
'3',
|
||||
'2',
|
||||
'5',
|
||||
'5',
|
||||
'1',
|
||||
'2',
|
||||
'6',
|
||||
'5',
|
||||
'3',
|
||||
'3',
|
||||
'2',
|
||||
'3',
|
||||
'3',
|
||||
'5',
|
||||
'4',
|
||||
'9',
|
||||
'3',
|
||||
'5',
|
||||
'3',
|
||||
'9',
|
||||
'0',
|
||||
}) {
|
||||
expected_input.trees.push_back(t);
|
||||
};
|
||||
SUBCASE("Testing input is parsed correctly") {
|
||||
CHECK(actual_input == expected_input);
|
||||
}
|
||||
|
||||
SUBCASE("Testing output is the one expected from AOC") {
|
||||
CHECK(get_result(actual_input) == "21");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if PART == 2
|
||||
TEST_CASE("Part 2") {
|
||||
Input actual_input = get_input("sample2");
|
||||
|
||||
SUBCASE("Testing output is the one expected from AOC") {
|
||||
CHECK(get_result(actual_input) == "8");
|
||||
}
|
||||
}
|
||||
#endif
|
16
2022/cpp/Makefile
Normal file
16
2022/cpp/Makefile
Normal file
@ -0,0 +1,16 @@
|
||||
COOKIE = 53616c7465645f5f49dff2a6091a00e67a9678384d5d9867c24d2c2024c8524adb2391b31b45118c978505c7ea27ddecf0cc047ce8d51dc32203dffde652c690
|
||||
|
||||
.PHONY = new
|
||||
NUMBER := $$(($(shell ls -D | grep "^[0-2][0-9]$$" | wc -l) + 1))
|
||||
NUMBER_DIR := $(shell printf "%02d" $(NUMBER))
|
||||
# NUMBER := $(shell ls -D | wc -l)
|
||||
|
||||
# https://adventofcode.com/2022/day/1/input
|
||||
|
||||
new:
|
||||
@echo "Creating $(NUMBER)..."
|
||||
cp -r template/ $(NUMBER_DIR)/
|
||||
@echo "Getting input"
|
||||
@wget -q -O $(NUMBER_DIR)/input --header "Cookie: session=$(COOKIE)" https://adventofcode.com/2022/day/$(NUMBER)/input
|
||||
sed -i "s/DATE/$(NUMBER_DIR)/" $(NUMBER_DIR)/answer.cpp
|
||||
xclip -o > $(NUMBER_DIR)/sample1
|
1
2022/cpp/doctest
Submodule
1
2022/cpp/doctest
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 86892fc480f80fb57d9a3926cb506c0e974489d8
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user