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

#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