Skip to content

Instantly share code, notes, and snippets.

@frostburn
Last active August 29, 2015 14:22
Show Gist options
  • Save frostburn/ba6f08b6d2a7126cd20e to your computer and use it in GitHub Desktop.
Save frostburn/ba6f08b6d2a7126cd20e to your computer and use it in GitHub Desktop.
The diagonal mirror routine for the 11x10 board in my go toolkit
void mirror_d() pure nothrow @nogc @safe
in
{
assert(valid);
assert(can_rotate);
}
out
{
assert(valid);
assert(can_rotate);
}
body
{
enum D_SHIFT = V_SHIFT - H_SHIFT;
enum Z_SHIFT = V_SHIFT + H_SHIFT;
enum WEST_BLOCK = 0x1F01F01F01F01FUL;
enum EAST_BLOCK = 0x3E03E03E03E03E0UL;
north_bits = (
(north_bits & 0x210UL) << (4 * D_SHIFT) |
(north_bits & 0x210108UL) << (3 * D_SHIFT) |
(north_bits & 0x210108084UL) << (2 * D_SHIFT) |
(north_bits & 0x210108084042UL) << D_SHIFT |
(north_bits & 0x210108084042021UL) |
(north_bits & 0x108084042021000UL) >> D_SHIFT |
(north_bits & 0x84042021000000UL) >> (2 * D_SHIFT) |
(north_bits & 0x42021000000000UL) >> (3 * D_SHIFT) |
(north_bits & 0x21000000000000UL) >> (4 * D_SHIFT)
);
auto temp = north_bits & EAST_BLOCK;
south_bits = (
(south_bits & 0x21UL) << (4 * Z_SHIFT) |
(south_bits & 0x21042UL) << (3 * Z_SHIFT) |
(south_bits & 0x21042084UL) << (2 * Z_SHIFT) |
(south_bits & 0x21042084108UL) << Z_SHIFT |
(south_bits & 0x21042084108210UL) |
(south_bits & 0x42084108210000UL) >> Z_SHIFT |
(south_bits & 0x84108210000000UL) >> (2 * Z_SHIFT) |
(south_bits & 0x108210000000000UL) >> (3 * Z_SHIFT) |
(south_bits & 0x210000000000000UL) >> (4 * Z_SHIFT)
);
temp |= south_bits & WEST_BLOCK;
temp = (
(temp & (H_WALL << (0 * V_SHIFT))) << (4 * V_SHIFT) |
(temp & (H_WALL << (1 * V_SHIFT))) << (2 * V_SHIFT) |
(temp & (H_WALL << (2 * V_SHIFT))) |
(temp & (H_WALL << (3 * V_SHIFT))) >> (2 * V_SHIFT) |
(temp & (H_WALL << (4 * V_SHIFT))) >> (4 * V_SHIFT)
);
north_bits = (north_bits & WEST_BLOCK) | (temp & WEST_BLOCK) << (5 * H_SHIFT);
south_bits = (south_bits & EAST_BLOCK) | (temp & EAST_BLOCK) >> (5 * H_SHIFT);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment