Advent-of-Code/2024/4/main.cpp
2024-12-04 11:16:51 -05:00

170 lines
3.0 KiB
C++

#include <fstream>
#include <iostream>
#include <set>
#include <sstream>
#include <string>
#include <vector>
int main()
{
const std::string filename = "data.txt";
std::ifstream ifs(filename);
if(!ifs.is_open())
{
std::cerr << "Missing " << filename << "." << std::endl;
return -1;
}
unsigned long total = 0;
unsigned long total_pt2 = 0;
std::vector<std::vector<char>> game;
for(std::string line; std::getline(ifs, line); )
{
if(line == "")
continue;
// Add new row to fill out:
game.push_back({});
// for each value in the line:
for(const char &c : line)
{
// Fill out the row:
game.back().push_back(c);
}
}
// DEBUG:
// for(auto row : game)
// {
// for(auto c : row)
// std::cout << c;
// std::cout << std::endl;
// }
for(int y = 0; y < game.size(); ++y)
{
for(int x = 0; x < game[y].size(); ++x)
{
// right:
if(x + 3 < game[y].size())
{
if(game[y][x] == 'X' &&
game[y][x+1] == 'M' &&
game[y][x+2] == 'A' &&
game[y][x+3] == 'S')
++total;
}
// down right:
if(x + 3 < game[y].size() &&
y + 3 < game.size())
{
if(game[y][x] == 'X' &&
game[y+1][x+1] == 'M' &&
game[y+2][x+2] == 'A' &&
game[y+3][x+3] == 'S')
++total;
}
// down:
if(y + 3 < game.size())
{
if(game[y][x] == 'X' &&
game[y+1][x] == 'M' &&
game[y+2][x] == 'A' &&
game[y+3][x] == 'S')
++total;
}
// down left:
if(x - 3 >= 0 &&
y + 3 < game.size())
{
if(game[y][x] == 'X' &&
game[y+1][x-1] == 'M' &&
game[y+2][x-2] == 'A' &&
game[y+3][x-3] == 'S')
++total;
}
// left:
if(x - 3 >= 0)
{
if(game[y][x] == 'X' &&
game[y][x-1] == 'M' &&
game[y][x-2] == 'A' &&
game[y][x-3] == 'S')
++total;
}
// up left:
if(x - 3 >= 0 &&
y - 3 >= 0)
{
if(game[y][x] == 'X' &&
game[y-1][x-1] == 'M' &&
game[y-2][x-2] == 'A' &&
game[y-3][x-3] == 'S')
++total;
}
// up:
if(y - 3 >= 0)
{
if(game[y][x] == 'X' &&
game[y-1][x] == 'M' &&
game[y-2][x] == 'A' &&
game[y-3][x] == 'S')
++total;
}
// up right:
if(x + 3 < game[y].size() &&
y - 3 >= 0)
{
if(game[y][x] == 'X' &&
game[y-1][x+1] == 'M' &&
game[y-2][x+2] == 'A' &&
game[y-3][x+3] == 'S')
++total;
}
}
}
for(int y = 1; y < game.size() - 1; ++y)
{
for(int x = 1; x < game[y].size() - 1; ++x)
{
if(game[y][x] != 'A')
continue;
int good = 0;
// top left to bottom right
if((game[y-1][x-1] == 'M' &&
game[y+1][x+1] == 'S')
||
(game[y-1][x-1] == 'S' &&
game[y+1][x+1] == 'M'))
++good;
// top right to bottom left
if((game[y-1][x+1] == 'M' &&
game[y+1][x-1] == 'S')
||
(game[y-1][x+1] == 'S' &&
game[y+1][x-1] == 'M'))
++good;
if(good == 2)
++total_pt2;
}
}
std::cout << " Total: " << total << std::endl;
std::cout << "PT2 Total: " << total_pt2 << std::endl;
return 0;
}