Skip to content

Commit

Permalink
day 4 part 1
Browse files Browse the repository at this point in the history
  • Loading branch information
K20shores committed Dec 4, 2024
1 parent 6353c7e commit d0f160a
Show file tree
Hide file tree
Showing 3 changed files with 289 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/2024/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ add_subdirectory(lib)
create_standard_test(NAME 2024_day1 SOURCES day1.cpp LIBRARIES aoc2024 YEAR 2024)
create_standard_test(NAME 2024_day2 SOURCES day2.cpp LIBRARIES aoc2024 YEAR 2024)
create_standard_test(NAME 2024_day3 SOURCES day3.cpp LIBRARIES aoc2024 YEAR 2024)
create_standard_test(NAME 2024_day4 SOURCES day4.cpp LIBRARIES aoc2024 YEAR 2024)

################################################################################
# Copy input data
Expand Down
148 changes: 148 additions & 0 deletions src/2024/day4.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
#include <iostream>
#include <filesystem>
#include <fstream>
#include <string>
#include <vector>
#include <benchmark/benchmark.h>

struct Data {
std::vector<std::string> grid;
};

int check(const std::string& s) {
if (s.size() == 4 && s == "XMAS") {
return 1;
}
return 0;
}

int part1(const Data &data)
{
size_t width = data.grid[0].size();
size_t height = data.grid.size();
int count = 0;

for(size_t y = 0; y < data.grid.size(); ++y) {
for(size_t x = 0; x < data.grid[0].size(); ++x) {
// look forward
if (width - x >= 4) {
count += check(data.grid[y].substr(x, 4));
}
// look backward
if (x >= 3) {
std::string s = {data.grid[y][x], data.grid[y][x-1], data.grid[y][x-2], data.grid[y][x-3]};
count += check(s);
}
// look along negative x diagonal forward
if (height-y >= 4 && width-x >= 4) {
std::string s = {data.grid[y][x], data.grid[y+1][x+1], data.grid[y+2][x+2], data.grid[y+3][x+3]};
count += check(s);
}
// look along negative x diagonal backward
if (y >= 3 && x >= 3) {
std::string s = {data.grid[y][x], data.grid[y-1][x-1], data.grid[y-2][x-2], data.grid[y-3][x-3]};
count += check(s);
}
// look along positive x diagonal forward
if (y >= 3 && width - x >= 4) {
std::string s = {data.grid[y][x], data.grid[y-1][x+1], data.grid[y-2][x+2], data.grid[y-3][x+3]};
count += check(s);
}
// look along positive x diagonal backward
if (height - y >= 4 && x >= 3) {
std::string s = {data.grid[y][x], data.grid[y+1][x-1], data.grid[y+2][x-2], data.grid[y+3][x-3]};
count += check(s);
}
// look up
if (y >= 3) {
std::string s = {data.grid[y][x], data.grid[y-1][x], data.grid[y-2][x], data.grid[y-3][x]};
count += check(s);
}
// look down
if (height - y >= 4) {
std::string s = {data.grid[y][x], data.grid[y+1][x], data.grid[y+2][x], data.grid[y+3][x]};
count += check(s);
}
}
}
return count;
}

int part2(const Data &data)
{
return 0;
}

Data parse()
{
std::ifstream file(std::filesystem::path("inputs/day4.txt"));
if (!file.is_open())
{
throw std::runtime_error("file not found");
}
std::string line;
Data data;

while (std::getline(file, line))
{
data.grid.push_back(line);
}

return data;
}

class BenchmarkFixture : public benchmark::Fixture
{
public:
static Data data;
};

Data BenchmarkFixture::data = parse();

BENCHMARK_DEFINE_F(BenchmarkFixture, Part1Benchmark)
(benchmark::State &state)
{
for (auto _ : state)
{
int s = part1(data);
benchmark::DoNotOptimize(s);
}
}

BENCHMARK_DEFINE_F(BenchmarkFixture, Part2Benchmark)
(benchmark::State &state)
{
for (auto _ : state)
{
int s = part2(data);
benchmark::DoNotOptimize(s);
}
}

BENCHMARK_REGISTER_F(BenchmarkFixture, Part1Benchmark);
BENCHMARK_REGISTER_F(BenchmarkFixture, Part2Benchmark);

int main(int argc, char **argv)
{
Data data = parse();

int answer1 = 0;
int answer2 = 0;

auto first = part1(data);
auto second = part2(data);

std::cout << "Part 1: " << first << std::endl;
std::cout << "Part 2: " << second << std::endl;

first != answer1 ? throw std::runtime_error("Part 1 incorrect") : nullptr;
second != answer2 ? throw std::runtime_error("Part 2 incorrect") : nullptr;

for (int i = 1; i < argc; ++i) {
if (std::string(argv[i]) == "--benchmark") {
benchmark::Initialize(&argc, argv);
benchmark::RunSpecifiedBenchmarks();
return 0;
}
}
}
Loading

0 comments on commit d0f160a

Please sign in to comment.