diff --git a/main.cpp b/main.cpp index 2bd2fb4..a1e349d 100644 --- a/main.cpp +++ b/main.cpp @@ -1,7 +1,6 @@ #include #include -#define B_empty 0x6 // undefined case #define B_space 0x0 #define B_fill 0x7 #define B_1x2 0x1 @@ -125,11 +124,48 @@ uint64_t compact_code(uint64_t code) { return ret | range << (16 - block_num) * 2; } +inline void binary_reverse(uint32_t &range) { // reverse binary every 2 bits + range = ((range << 16) & 0xFFFF0000) | ((range >> 16) & 0x0000FFFF); + range = ((range << 8) & 0xFF00FF00) | ((range >> 8) & 0x00FF00FF); + range = ((range << 4) & 0xF0F0F0F0) | ((range >> 4) & 0x0F0F0F0F); + range = ((range << 2) & 0xCCCCCCCC) | ((range >> 2) & 0x33333333); +} + +uint64_t extract_code(uint64_t code) { + uint64_t ret = C_2x2 << (code >> 32) * 3; + auto range = uint32_t(code); + binary_reverse(range); + for (int addr = 0; range; range >>= 2) { + while (0x7 & ret >> addr) { + addr += 3; + } + switch (range & 0x3) { + case 0x1: + ret |= C_1x2 << addr; + break; + case 0x2: + ret |= C_2x1 << addr; + break; + case 0x3: + ret |= C_1x1 << addr; + break; + case 0x0: + addr += 3; + } + } + return ret; +} + int main() { printf("Klotski engine\n"); - printf("%lx\n", compact_code(0x0E58FC85FFEBC4DB)); - printf("%lx\n", compact_code(0x0603EDF5CAFFF5E2)); +// printf("%lx\n", compact_code(0x0E58FC85FFEBC4DB)); +// printf("%lx\n", compact_code(0x0603EDF5CAFFF5E2)); + + graph_output(extract_code(0x4FEA13400)); + printf("\n"); + graph_output(extract_code(0x1A9BF0C00)); + printf("\n"); return 0;