mirror of
https://github.com/plasmaofthedawn/2023adventofcode.git
synced 2024-10-18 10:26:24 -05:00
day 10 part 2
This commit is contained in:
parent
3f75bcc5b9
commit
d17fcb67c5
9
resources/day10sample.txt
Normal file
9
resources/day10sample.txt
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
...........
|
||||||
|
.S-------7.
|
||||||
|
.|F-----7|.
|
||||||
|
.||.....||.
|
||||||
|
.||.....||.
|
||||||
|
.|L-7.F-J|.
|
||||||
|
.|..|.|..|.
|
||||||
|
.L--J.L--J.
|
||||||
|
...........
|
276
src/day10/part2.pas
Normal file
276
src/day10/part2.pas
Normal file
@ -0,0 +1,276 @@
|
|||||||
|
program day10part1;
|
||||||
|
uses sysutils;
|
||||||
|
|
||||||
|
type
|
||||||
|
direction = (Left, Up, Right, Down, NA);
|
||||||
|
blocktype = (Empty, Pipe, Red, Blue);
|
||||||
|
|
||||||
|
var
|
||||||
|
blocks: array[1..1000, 1..1000] of blocktype;
|
||||||
|
|
||||||
|
|
||||||
|
procedure replace_if_not_pipe(y: int32; x: int32; new_type: blocktype);
|
||||||
|
begin
|
||||||
|
if blocks[y, x] <> Pipe then
|
||||||
|
blocks[y, x] := new_type
|
||||||
|
end;
|
||||||
|
|
||||||
|
function step_path(var curr: array of int32; last_direction: direction; c: char): direction;
|
||||||
|
begin
|
||||||
|
|
||||||
|
// step_path := curr;
|
||||||
|
|
||||||
|
step_path := NA;
|
||||||
|
|
||||||
|
{ mark lefthand side as blue, righthand side as red }
|
||||||
|
case last_direction of
|
||||||
|
Left:
|
||||||
|
begin
|
||||||
|
replace_if_not_pipe(curr[0] - 1, curr[1], Red);
|
||||||
|
replace_if_not_pipe(curr[0] + 1, curr[1], Blue);
|
||||||
|
end;
|
||||||
|
Right:
|
||||||
|
begin
|
||||||
|
replace_if_not_pipe(curr[0] - 1, curr[1], Blue);
|
||||||
|
replace_if_not_pipe(curr[0] + 1, curr[1], Red);
|
||||||
|
end;
|
||||||
|
Down:
|
||||||
|
begin
|
||||||
|
replace_if_not_pipe(curr[0], curr[1] - 1, Red);
|
||||||
|
replace_if_not_pipe(curr[0], curr[1] + 1, Blue);
|
||||||
|
end;
|
||||||
|
Up:
|
||||||
|
begin
|
||||||
|
replace_if_not_pipe(curr[0], curr[1] - 1, Blue);
|
||||||
|
replace_if_not_pipe(curr[0], curr[1] + 1, Red);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
case last_direction of
|
||||||
|
Left:
|
||||||
|
begin
|
||||||
|
case c of
|
||||||
|
'-': step_path := Left;
|
||||||
|
'L': step_path := Up;
|
||||||
|
'F': step_path := Down;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
Up:
|
||||||
|
begin
|
||||||
|
case c of
|
||||||
|
'|': step_path := Up;
|
||||||
|
'7': step_path := Left;
|
||||||
|
'F': step_path := Right;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
Right:
|
||||||
|
begin
|
||||||
|
case c of
|
||||||
|
'-': step_path := Right;
|
||||||
|
'7': step_path := Down;
|
||||||
|
'J': step_path := Up;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
Down:
|
||||||
|
begin
|
||||||
|
case c of
|
||||||
|
'|': step_path := Down;
|
||||||
|
'J': step_path := Left;
|
||||||
|
'L': step_path := Right;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ mark lefthand side as blue, righthand side as red }
|
||||||
|
case step_path of
|
||||||
|
Left:
|
||||||
|
begin
|
||||||
|
replace_if_not_pipe(curr[0] - 1, curr[1], Red);
|
||||||
|
replace_if_not_pipe(curr[0] + 1, curr[1], Blue);
|
||||||
|
end;
|
||||||
|
Right:
|
||||||
|
begin
|
||||||
|
replace_if_not_pipe(curr[0] - 1, curr[1], Blue);
|
||||||
|
replace_if_not_pipe(curr[0] + 1, curr[1], Red);
|
||||||
|
end;
|
||||||
|
Down:
|
||||||
|
begin
|
||||||
|
replace_if_not_pipe(curr[0], curr[1] - 1, Red);
|
||||||
|
replace_if_not_pipe(curr[0], curr[1] + 1, Blue);
|
||||||
|
end;
|
||||||
|
Up:
|
||||||
|
begin
|
||||||
|
replace_if_not_pipe(curr[0], curr[1] - 1, Blue);
|
||||||
|
replace_if_not_pipe(curr[0], curr[1] + 1, Red);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ move to the next pipe }
|
||||||
|
case step_path of
|
||||||
|
Up: curr[0] := curr[0] - 1;
|
||||||
|
Down: curr[0] := curr[0] + 1;
|
||||||
|
Left: curr[1] := curr[1] - 1;
|
||||||
|
Right: curr[1] := curr[1] + 1;
|
||||||
|
end;
|
||||||
|
|
||||||
|
if (last_direction = NA) then
|
||||||
|
writeln('bruh');
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
file_: text;
|
||||||
|
|
||||||
|
map: array[1..1000] of string;
|
||||||
|
str: string;
|
||||||
|
|
||||||
|
count: int32;
|
||||||
|
|
||||||
|
width: int32;
|
||||||
|
|
||||||
|
steps: int32;
|
||||||
|
step: char;
|
||||||
|
|
||||||
|
s_loc, loc: array[0..1] of int32;
|
||||||
|
ld: direction;
|
||||||
|
|
||||||
|
i, j: int32;
|
||||||
|
|
||||||
|
{ node, left, right }
|
||||||
|
nodes: array[0..1000, 0..2] of string;
|
||||||
|
|
||||||
|
current: blocktype;
|
||||||
|
invalid: blocktype;
|
||||||
|
|
||||||
|
red_count, blue_count: int32;
|
||||||
|
|
||||||
|
begin
|
||||||
|
{ open inp.txt for reading }
|
||||||
|
assign(file_, 'resources/day10.txt');
|
||||||
|
reset(file_);
|
||||||
|
|
||||||
|
count := 1;
|
||||||
|
while not EOF(file_) do
|
||||||
|
begin
|
||||||
|
|
||||||
|
readln(file_, map[count]);
|
||||||
|
|
||||||
|
i := pos('S', map[count]);
|
||||||
|
|
||||||
|
if i <> 0 then
|
||||||
|
begin
|
||||||
|
s_loc[0] := count;
|
||||||
|
s_loc[1] := i;
|
||||||
|
end;
|
||||||
|
|
||||||
|
count := count + 1;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
width := length(map[1]);
|
||||||
|
|
||||||
|
loc := s_loc;
|
||||||
|
|
||||||
|
{ get possible initial directions }
|
||||||
|
if (map[s_loc[0], s_loc[1] - 1] = '-') or (map[s_loc[0], s_loc[1] - 1] = 'F') or (map[s_loc[0], s_loc[1] - 1] = 'L') then
|
||||||
|
begin
|
||||||
|
loc[1] := loc[1] - 1;
|
||||||
|
ld := Left;
|
||||||
|
end
|
||||||
|
else if (map[s_loc[0] - 1, s_loc[1]] = '|') or (map[s_loc[0] - 1, s_loc[1]] = '7') or (map[s_loc[0] - 1, s_loc[1]] = 'F') then
|
||||||
|
begin
|
||||||
|
loc[0] := loc[0] - 1;
|
||||||
|
ld := Up;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
{ if it's neither up nor left, then both right and down must be valid. }
|
||||||
|
{ pick right arbitrarily }
|
||||||
|
ld := Right;
|
||||||
|
loc[1] := loc[1] + 1;
|
||||||
|
end;
|
||||||
|
|
||||||
|
// shitty memset
|
||||||
|
for i := 1 to count do
|
||||||
|
begin
|
||||||
|
for j := 1 to width do
|
||||||
|
begin
|
||||||
|
blocks[i, j] := Empty;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
blocks[s_loc[0], s_loc[1]] := Pipe;
|
||||||
|
|
||||||
|
|
||||||
|
{ mark array of pipes, and set some red and blue squares }
|
||||||
|
while (loc[0] <> s_loc[0]) or (loc[1] <> s_loc[1]) do
|
||||||
|
begin
|
||||||
|
|
||||||
|
{ mark pipe }
|
||||||
|
blocks[loc[0], loc[1]] := Pipe;
|
||||||
|
|
||||||
|
ld := step_path(loc, ld, map[loc[0], loc[1]]);
|
||||||
|
end;
|
||||||
|
{ step one additional time }
|
||||||
|
ld := step_path(loc, ld, map[loc[0], loc[1]]);
|
||||||
|
|
||||||
|
{ fill in the map and count}
|
||||||
|
{ techincally filling in the map is uneccessary but it looks cool }
|
||||||
|
|
||||||
|
red_count := 0;
|
||||||
|
blue_count := 0;
|
||||||
|
|
||||||
|
for i := 1 to count - 1 do
|
||||||
|
begin
|
||||||
|
current := Empty;
|
||||||
|
for j := 1 to width do
|
||||||
|
begin
|
||||||
|
case blocks[i, j] of
|
||||||
|
Empty:
|
||||||
|
begin
|
||||||
|
blocks[i, j] := current;
|
||||||
|
case current of
|
||||||
|
Red: red_count := red_count + 1;
|
||||||
|
Blue: blue_count := blue_count + 1;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
// Pipe you do nothing
|
||||||
|
Red:
|
||||||
|
begin
|
||||||
|
current := Red;
|
||||||
|
red_count := red_count + 1;
|
||||||
|
end;
|
||||||
|
Blue:
|
||||||
|
begin
|
||||||
|
current := Blue;
|
||||||
|
blue_count := blue_count + 1;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ if we're holding onto this at the end, then this is the color outside of the square}
|
||||||
|
if current <> Empty then
|
||||||
|
invalid := current
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ print out the map }
|
||||||
|
for i := 1 to count - 1 do
|
||||||
|
begin
|
||||||
|
for j := 1 to width do
|
||||||
|
begin
|
||||||
|
case blocks[i, j] of
|
||||||
|
Empty: write(' ');
|
||||||
|
Pipe: write('█');
|
||||||
|
Red: write('▒');
|
||||||
|
Blue: write('░');
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
writeln();
|
||||||
|
end;
|
||||||
|
|
||||||
|
writeln(invalid, ' is bad color.');
|
||||||
|
writeln('Red count is ', red_count);
|
||||||
|
writeln('Blue count is ', blue_count);
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user