You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.1 KiB
95 lines
2.1 KiB
#include <fmt/format.h>
|
|
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
#include <climits>
|
|
|
|
#include <raw_input.hh>
|
|
|
|
typedef uint8_t ipack_t;
|
|
|
|
struct input_info {
|
|
const static constexpr inline auto width = input::COLS;
|
|
const static constexpr inline auto height = input::ROWS;
|
|
bool data[width][height];
|
|
|
|
constexpr bool operator()(size_t col, size_t row) const
|
|
{
|
|
return data[col][row];
|
|
}
|
|
};
|
|
|
|
struct input_packed {
|
|
const static constexpr inline auto width = input::COLS;
|
|
const static constexpr inline auto height = input::ROWS / sizeof(ipack_t);
|
|
ipack_t data[width][height];
|
|
|
|
constexpr ipack_t operator()(size_t w, size_t h) const
|
|
{
|
|
return data[w][h];
|
|
}
|
|
};
|
|
|
|
static_assert(input::ROWS % sizeof(ipack_t)==0, "Cannot pack rows into ipack_t losslessly");
|
|
|
|
|
|
|
|
consteval input_info gen_input_bits()
|
|
{
|
|
input_info o;
|
|
for(size_t i=0;i<input::ROWS;i++)
|
|
for(size_t j=0;j<input::COLS;j++)
|
|
{
|
|
o.data[j][i] = input::DATA[i][j] == '0' ? false : true;
|
|
}
|
|
return o;
|
|
}
|
|
|
|
template<typename T>
|
|
constexpr void set_bit(T& data, size_t bit, bool value = true)
|
|
{
|
|
//constexpr const auto BITS = CHAR_BIT * sizeof(T);
|
|
T mask = T(1) << bit;
|
|
|
|
if(!value && (data & mask)) // bit is set, unset it
|
|
data ^= mask;
|
|
else if(value) data |= mask; // set the bit
|
|
}
|
|
|
|
consteval input_packed pack_input(const input_info& in)
|
|
{
|
|
input_packed o;
|
|
//size_t k=0;
|
|
constexpr const auto PACKED_BITS = CHAR_BIT * sizeof(ipack_t);
|
|
for(size_t j=0;j<input::COLS;j++)
|
|
for(size_t i=0;i<input::ROWS;i+=PACKED_BITS)
|
|
{
|
|
ipack_t bit = 0;
|
|
size_t nbits = PACKED_BITS;
|
|
|
|
while(nbits --> 0)
|
|
{
|
|
// XXX: This sets the bits in reverse order, but that doesn't matter for this exersize
|
|
if(in(j, i)) set_bit(bit, nbits);
|
|
}
|
|
o.data[j][i / sizeof(ipack_t)] = bit;
|
|
}
|
|
return o;
|
|
}
|
|
|
|
consteval input_packed gen_input_packed()
|
|
{
|
|
return pack_input(gen_input_bits());
|
|
}
|
|
|
|
int main()
|
|
{
|
|
auto p = gen_input_packed();
|
|
for(int i=0;i<input_packed::width;i++) {
|
|
for(int j=0;j<input_packed::height;j++)
|
|
fmt::print("{:8b}", p(i, j));
|
|
fmt::print("\n");
|
|
}
|
|
}
|
|
TODO: this is literaly just popcnt. use simp popcnt over the packed integers i guess
|