parent
5997e898b1
commit
b107f62c09
@ -0,0 +1,30 @@
|
||||
COMMON_OPT_FLAGS?= -O3 -march=native -pipe -flto \
|
||||
-march=native -fgraphite -fopenmp -floop-parallelize-all -ftree-parallelize-loops=4 \
|
||||
-floop-interchange -ftree-loop-distribution -floop-strip-mine -floop-block \
|
||||
-fno-stack-check -fno-strict-aliasing
|
||||
|
||||
C_OPT_FLAGS?=
|
||||
CXX_OPT_FLAGS?= -felide-constructors
|
||||
LD_OPT_FLAGS?=-O3 -flto
|
||||
|
||||
COMMON_FLAGS=-Wall -pedantic $(COMMON_OPT_FLAGS)
|
||||
|
||||
CFLAGS?=$(COMMMON_FLAGS) --std=gnu11 $(C_OPT_FLAGS)
|
||||
CXXFLAGS?=$(COMMON_FLAGS) --std=gnu++20 $(CXX_OPT_FLAGS)
|
||||
LDFLAGS?=$(LD_OPT_FLAGS)
|
||||
|
||||
CXXFLAGS+= -fno-exceptions
|
||||
|
||||
.PHONY: all
|
||||
all: part1 part2
|
||||
|
||||
part1: day3.cpp
|
||||
$(CXX) $< $(CXXFLAGS) -o $@ $(LDFLAGS)
|
||||
strip $@
|
||||
|
||||
part2: day3.cpp
|
||||
$(CXX) $< -DPART2 $(CXXFLAGS) -o $@ $(LDFLAGS)
|
||||
strip $@
|
||||
|
||||
clean:
|
||||
rm -f part{1,2}
|
@ -0,0 +1,79 @@
|
||||
#include <vector>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
#include <tuple>
|
||||
|
||||
using mod_table = std::vector<std::vector<bool> >;
|
||||
|
||||
mod_table read_input(const char* _input)
|
||||
{
|
||||
std::ifstream input(_input);
|
||||
if(!input) {
|
||||
std::cerr << "Failed to open file: " << _input << std::endl;
|
||||
std::terminate();
|
||||
}
|
||||
mod_table output;
|
||||
|
||||
std::string str;
|
||||
while(input)
|
||||
{
|
||||
if(!std::getline(input, str)) break;
|
||||
std::vector<bool> ln(str.size());
|
||||
int i=0;
|
||||
for(const auto& chr : str)
|
||||
{
|
||||
switch(chr)
|
||||
{
|
||||
case '#': ln[i] = true;
|
||||
default: i++; break;
|
||||
}
|
||||
}
|
||||
output.push_back(std::move(ln));
|
||||
str.clear();
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
template<typename V>
|
||||
inline std::size_t wrapping_index(const V& vec, std::size_t i)
|
||||
{
|
||||
return (i % vec.size());
|
||||
}
|
||||
|
||||
std::size_t count_slope(const mod_table& table, std::size_t stepx, std::size_t stepy)
|
||||
{
|
||||
std::size_t x=0;
|
||||
std::size_t r=0;
|
||||
for(std::size_t y=0;y<table.size();y+=stepy, x+=stepx)
|
||||
{
|
||||
r += table[y][wrapping_index(table[y], x)] ? 1 : 0;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
|
||||
const mod_table table = read_input("input");
|
||||
#ifdef PART2
|
||||
const auto paths = {
|
||||
std::tuple<std::size_t, std::size_t>(1, 1),
|
||||
std::tuple<std::size_t, std::size_t>(3, 1),
|
||||
std::tuple<std::size_t, std::size_t>(5, 1),
|
||||
std::tuple<std::size_t, std::size_t>(7, 1),
|
||||
std::tuple<std::size_t, std::size_t>(1, 2),
|
||||
};
|
||||
|
||||
std::size_t r=1;
|
||||
for(const auto& [x, y] : paths)
|
||||
{
|
||||
r*= count_slope(table, x, y);
|
||||
}
|
||||
#else
|
||||
auto r = count_slope(table, 3, 1);
|
||||
#endif
|
||||
|
||||
std::cout << r << std::endl;
|
||||
return 0;
|
||||
}
|
Loading…
Reference in new issue