this post was submitted on 16 Dec 2023
18 points (100.0% liked)

Advent Of Code

770 readers
1 users here now

An unofficial home for the advent of code community on programming.dev!

Advent of Code is an annual Advent calendar of small programming puzzles for a variety of skill sets and skill levels that can be solved in any programming language you like.

AoC 2023

Solution Threads

M T W T F S S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25

Rules/Guidelines

Relevant Communities

Relevant Links

Credits

Icon base by Lorc under CC BY 3.0 with modifications to add a gradient

console.log('Hello World')

founded 1 year ago
MODERATORS
 

Day 16: The Floor Will Be Lava

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

you are viewing a single comment's thread
view the rest of the comments
[โ€“] [email protected] 1 points 11 months ago

C

Just tracing the ray. When it splits, recurse one way and continue the other. Didn't bother with a direction lookup table this time, just a few ifs. The ray ends when it goes out of bounds or a ray in that direction has been previously traced on a given cell (this is tracked with a separate table).

It would've been straightforward if I hadn't gotten the 'previously visited' check wrong ๐Ÿ˜ž. I was checking against the direction coming in of the tile but marking the direction going out.

Ray function:

static void
ray(int x, int y, int dir)
{
	int c;

	while (x>=0 && y>=0 && x<w && y<h) {
		if (beams[y][x] & (1 << dir))
			break;

		beams[y][x] |= 1 << dir;
		c = map[y][x];

		if (dir==NN && c=='/')  dir = EE; else
		if (dir==EE && c=='/')  dir = NN; else
		if (dir==SS && c=='/')  dir = WW; else
		if (dir==WW && c=='/')  dir = SS; else
		if (dir==NN && c=='\\') dir = WW; else
		if (dir==EE && c=='\\') dir = SS; else
		if (dir==SS && c=='\\') dir = EE; else
		if (dir==WW && c=='\\') dir = NN; else
		if (dir==NN && c=='-') { ray(x,y,WW); dir = EE; } else
		if (dir==SS && c=='-') { ray(x,y,WW); dir = EE; } else
		if (dir==EE && c=='|') { ray(x,y,NN); dir = SS; } else
		if (dir==WW && c=='|') { ray(x,y,NN); dir = SS; } 

		x += dir==EE ? 1 : dir==WW ? -1 : 0;
		y += dir==SS ? 1 : dir==NN ? -1 : 0;
	}
}

https://github.com/sjmulder/aoc/blob/master/2023/c/day16.c-