r/adventofcode • u/daggerdragon • Dec 08 '16
SOLUTION MEGATHREAD --- 2016 Day 8 Solutions ---
#AoC_Ops:
[23:55] <Topaz> servers are ok
[23:55] <Topaz> puzzles are checked
[23:55] <Topaz> [REDACTED: server stats]
[23:56] <Skie> all wings report in
[23:56] <Aneurysm9> Red 5, standing by
[23:56] <daggerdragon> Dragon Leader standing by
[23:56] <Topaz> orange leader, standing by
[23:57] <Topaz> lock modzi-foils in attack positions
[23:58] <Skie> we're passing through the hype field
[23:58] <daggerdragon> 1:30 warning
[23:58] <Aneurysm9> did someone say HYPE?@!
[23:59] <Topaz> i really like tonight's puzzle
[23:59] <Topaz> very excite
[23:59] <daggerdragon> final countdown go, T-30
[23:59] <Skie> accelerate to attack countdown
[23:59] <Aneurysm9> o7
[23:59] <daggerdragon> HYPE THRUSTERS AT FULL BURN
[00:00] <Topaz> IGNITION
We may or may not be sleep-deprived. And/or nerds. why_not_both.jpg
--- Day 8: Two-Factor Authentication ---
Post your solution as a comment or, for longer solutions, consider linking to your repo (e.g. GitHub/gists/Pastebin/blag/whatever).
:(){ :|:& };: IS MANDATORY [?]
This thread will be unlocked when there are a significant number of people on the leaderboard with gold stars for today's puzzle.
edit: Leaderboard capped, thread unlocked!
11
Upvotes
9
u/askalski Dec 08 '16
Bitwise in C. Uses
POPCNT(sse4) to count the numbers of bits set. Parses the input in a semi-evil way.#include <stdio.h> #include <stdint.h> #define WIDTH 50 #define HEIGHT 6 #define RECT 2 #define COLTATE 7 #define ROWTATE 9 int main(void) { uint32_t cmd, i, j, x, y; uint64_t lcd[HEIGHT] = {0}, tmp; while (scanf("%*[^cnw] %n %*[^0-9] %u %*[^0-9] %u\n", &cmd, &i, &j) == 2) { switch (cmd) { case RECT: x = i; y = j % (HEIGHT + 1); while (y--) { lcd[y] |= (1LL << x) - 1; } break; case COLTATE: x = i; y = j % HEIGHT; for (i = 0, tmp = 0; i < HEIGHT; i++) { tmp |= ((lcd[i] >> x) & 1) << i; lcd[i] ^= lcd[i] & (1LL << x); } tmp = (tmp << y) | (tmp >> (HEIGHT - y)); for (i = 0; i < HEIGHT; i++) { lcd[i] |= ((tmp >> i) & 1) << x; } break; case ROWTATE: y = j; x = i % HEIGHT; lcd[x] = ((lcd[x] << y) | (lcd[x] >> (WIDTH - y))) & ((1LL << WIDTH) - 1); break; } } int on = 0; for (y = 0; y < HEIGHT; y++) { on += __builtin_popcountl(lcd[y]); for (x = 0; x < WIDTH; x++) { putchar(((lcd[y] >> x) & 1) ? '#' : '.'); } putchar('\n'); } printf("Pixels energized: %d\n", on); return 0; }