Day 4: Printing Department ## Megathread guidelines - Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever) - You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL ## FAQ - What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268 - Where do I participate?: https://adventofcode.com/ - Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
You must log in or register to comment.
C
For loops!
Code
#include <stdio.h> #define GZ 144 static char g[GZ][GZ]; int main() { int p1=0,p2=0, nc=0, x,y; for (y=1; fgets(g[y]+1, GZ-2, stdin); y++) ; for (y=1; y<GZ-1; y++) for (x=1; x<GZ-1; x++) p1 += g[y][x] == '@' && (g[y-1][x-1] == '@') + (g[y-1][x ] == '@') + (g[y-1][x+1] == '@') + (g[y ][x-1] == '@') + (g[y ][x+1] == '@') + (g[y+1][x-1] == '@') + (g[y+1][x ] == '@') + (g[y+1][x+1] == '@') < 4; do { nc = 0; for (y=1; y<GZ-1; y++) for (x=1; x<GZ-1; x++) if (g[y][x] == '@' && (g[y-1][x-1] == '@') + (g[y-1][x ] == '@') + (g[y-1][x+1] == '@') + (g[y ][x-1] == '@') + (g[y ][x+1] == '@') + (g[y+1][x-1] == '@') + (g[y+1][x ] == '@') + (g[y+1][x+1] == '@') < 4) { nc++; p2++; g[y][x] = '.'; } } while (nc); printf("04: %d %d\n", p1, p2); return 0; }For my x86-16 version, the 20K input is pushing it over the 64K .COM limit, so I’ll need to implement some better compression first.
Nim
type AOCSolution[T,U] = tuple[part1: T, part2: U] Vec2 = tuple[x,y: int] proc removePaper(rolls: var seq[string]): int = var toRemove: seq[Vec2] for y, line in rolls: for x, c in line: if c != '@': continue var adjacent = 0 for (dx, dy) in [(-1,-1),(0,-1),(1,-1), (-1, 0), (1, 0), (-1, 1),(0, 1),(1, 1)]: let pos: Vec2 = (x+dx, y+dy) if pos.x < 0 or pos.x >= rolls[0].len or pos.y < 0 or pos.y >= rolls.len: continue if rolls[pos.y][pos.x] == '@': inc adjacent if adjacent < 4: inc result toRemove.add (x, y) for (x, y) in toRemove: rolls[y][x] = '.' proc solve(input: string): AOCSolution[int, int] = var rolls = input.splitLines() result.part1 = rolls.removePaper() result.part2 = result.part1 while (let cnt = rolls.removePaper(); result.part2 += cnt; cnt) > 0: discardToday was so easy, that I decided to solve it twice, just for fun. First is a 2D traversal (see above). And then I did a node graph solution in a few minutes (in repo below). Both run in ~27 ms.
It’s a bit concerning, because a simple puzzle can only mean that tomorrow will be a nightmare. Good Luck everyone, we will need it.
Full solution is at Codeberg: solution.nim

