From 08859f51872603918e56b61d4175e46878dd081f Mon Sep 17 00:00:00 2001 From: June McEnroe Date: Sat, 22 Dec 2018 16:35:07 -0500 Subject: Solve day 22 part 1 --- 2018/day22.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 2018/day22.c (limited to '2018') 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 +#include + +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); +} -- cgit 1.4.1