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

  • @sjmulder
    link
    11 year 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-