diff options
Diffstat (limited to 'aoc')
-rw-r--r-- | aoc/2022/06/part-one.d | 24 | ||||
-rw-r--r-- | aoc/2022/06/part-two.d | 26 |
2 files changed, 50 insertions, 0 deletions
diff --git a/aoc/2022/06/part-one.d b/aoc/2022/06/part-one.d new file mode 100644 index 0000000..c914704 --- /dev/null +++ b/aoc/2022/06/part-one.d @@ -0,0 +1,24 @@ +import core.stdc.stdio : getchar, printf; + +extern(C) void main() +{ + slide: for (auto q = 0u, i = 1u; q & 0xffu ^ '\n'; ++i) + { + q <<= 8u; + q |= getchar(); + if (i < 4) + continue; + + auto p = cast(ubyte*) &q; + for (auto s = 0u, j = 0u; j < 4u; ++j) + { + auto b = 1u << (p[j] & 0x1fu); + if (s & b) + continue slide; + s |= b; + } + + printf("%d\n", i); + break; + } +} diff --git a/aoc/2022/06/part-two.d b/aoc/2022/06/part-two.d new file mode 100644 index 0000000..4465e38 --- /dev/null +++ b/aoc/2022/06/part-two.d @@ -0,0 +1,26 @@ +import core.int128 : Cent, and, or, shl, tst, xor; +import core.stdc.stdio : getchar, printf; + +extern(C) void main() +{ + slide: for (auto q = cast(Cent) 0u, i = 1u; + tst(xor(and(q, cast(Cent) 0xff), cast(Cent) '\n')); + ++i) + { + q = or(shl(q, 8u), cast(Cent) getchar()); + if (i < 14) + continue; + + auto p = cast(ubyte*) &q; + for (auto s = 0u, j = 0u; j < 14u; ++j) + { + auto b = 1u << (p[j] & 0x1fu); + if (s & b) + continue slide; + s |= b; + } + + printf("%d\n", i); + break; + } +} |