diff --git a/Makefile b/Makefile index 057cf6b..b8b2f06 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,17 @@ +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) DAYS= $(wildcard day*) diff --git a/day3/Makefile b/day3/Makefile new file mode 100644 index 0000000..e37a3a7 --- /dev/null +++ b/day3/Makefile @@ -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} diff --git a/day3/day3.cpp b/day3/day3.cpp new file mode 100644 index 0000000..2d1ceaf --- /dev/null +++ b/day3/day3.cpp @@ -0,0 +1,79 @@ +#include +#include +#include +#include +#include + +using mod_table = std::vector >; + +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 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 +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(1, 1), + std::tuple(3, 1), + std::tuple(5, 1), + std::tuple(7, 1), + std::tuple(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; +}