diff options
-rw-r--r-- | 2018/day22.c | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/2018/day22.c b/2018/day22.c new file mode 100644 index 0000000..459f8cb --- /dev/null +++ b/2018/day22.c @@ -0,0 +1,49 @@ +#include <stdio.h> +#include <stdlib.h> + +typedef unsigned uint; + +enum Type { + Rocky, + Wet, + Narrow, +}; + +static uint depth; +static uint targetX, targetY; + +static uint erosionLevel(uint x, uint y); + +static uint geologicIndex(uint x, uint y) { + if (x == 0 && y == 0) return 0; + if (x == targetX && y == targetY) return 0; + if (y == 0) return x * 16807; + if (x == 0) return y * 48271; + return erosionLevel(x - 1, y) * erosionLevel(x, y - 1); +} + +static uint erosionLevels[1000][1000]; + +static uint erosionLevel(uint x, uint y) { + if (!erosionLevels[x][y]) { + erosionLevels[x][y] = (geologicIndex(x, y) + depth) % 20183; + } + return erosionLevels[x][y]; +} + +static enum Type type(uint x, uint y) { + return erosionLevel(x, y) % 3; +} + +int main(void) { + scanf("depth: %u\n", &depth); + scanf("target: %u,%u\n", &targetX, &targetY); + + uint riskLevel = 0; + for (uint x = 0; x <= targetX; ++x) { + for (uint y = 0; y <= targetY; ++y) { + riskLevel += type(x, y); + } + } + printf("%u\n", riskLevel); +} |