2023 Day 16
parent
a0efdb9cce
commit
b0e4b21c73
|
@ -2,7 +2,7 @@ FC:=gfortran
|
||||||
FFLAGS:=-Wall -Wno-maybe-uninitialized -O2
|
FFLAGS:=-Wall -Wno-maybe-uninitialized -O2
|
||||||
BIN:=./bin
|
BIN:=./bin
|
||||||
SRC:=./src
|
SRC:=./src
|
||||||
BINS:=./bin/day01.bin ./bin/day01b.bin ./bin/day02.bin ./bin/day03.bin ./bin/day04.bin ./bin/day05.bin ./bin/day05b.bin ./bin/day06.bin ./bin/day07.bin ./bin/day07b.bin ./bin/day08.bin ./bin/day08b.bin ./bin/day09.bin ./bin/day10.bin ./bin/day11.bin ./bin/day12.bin ./bin/day13.bin ./bin/day14.bin ./bin/day14b.bin ./bin/day15.bin
|
BINS:=./bin/day01.bin ./bin/day01b.bin ./bin/day02.bin ./bin/day03.bin ./bin/day04.bin ./bin/day05.bin ./bin/day05b.bin ./bin/day06.bin ./bin/day07.bin ./bin/day07b.bin ./bin/day08.bin ./bin/day08b.bin ./bin/day09.bin ./bin/day10.bin ./bin/day11.bin ./bin/day12.bin ./bin/day13.bin ./bin/day14.bin ./bin/day14b.bin ./bin/day15.bin ./bin/day16.bin
|
||||||
|
|
||||||
all: aoc19
|
all: aoc19
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,111 @@
|
||||||
|
\../....|.-........|.................|...\....../...............\...............|..................\........|.
|
||||||
|
.-...../.......-.......|./.........-.....-.......\...|.-...........-.......\.................-....-...........
|
||||||
|
.\....-\..|...\.....\...................................................................../................-..
|
||||||
|
.....|.............-.\....../......|.....\......................|...-.....-.........|.-......\................
|
||||||
|
........./............................-.|..|.........|.....|..................................................
|
||||||
|
................./.................|.................\...............\..................|.../.....././........
|
||||||
|
...-..|.........-.............\..|..-......./............\.-....|..|........\...-......\....../...\\..........
|
||||||
|
..............\..|............/..............|..........................................|............\........
|
||||||
|
.|...........................-.-.........-..\|...|.......|\............\|.....................................
|
||||||
|
..........-./.\.....|...................|./............./.-..............|........../.....-/..................
|
||||||
|
....../.....\/..........\.........|\...........|....--................/................../......-..........-..
|
||||||
|
-.|.......|...................../................\..................-\........-.....\.........................
|
||||||
|
...-|................................................\...........-.........\/.-......-.............|..........
|
||||||
|
.......\../....\..............|..........|.....\............|.............|......./................./....../\.
|
||||||
|
.....|..................|...|......-.....|..-....|\\.........\\........|....................|............-....
|
||||||
|
......./........./...-..-|................../...|....................|-.......\-............................./
|
||||||
|
................../......-...........|...|........./.....\..|......../..../.......|...|.................-.....
|
||||||
|
.................................../.|..........|...............\..........|...............-.............|/...
|
||||||
|
.......\.-......-................................/......|..\...\.........../........|......\.........-..-....\
|
||||||
|
....................|./.....-..../.............|...............-.../.\........-..-............/....|.......-..
|
||||||
|
...........\...........................\.|.................-...............|........-....................|..|.
|
||||||
|
..|.-.....\.......|................-.........../.............................................|....//.\........
|
||||||
|
..-...............\......../..||.....|.....\.|.........................\.....|....-.........../..../..........
|
||||||
|
..|......../.../.............|..........-...................-................\...\..\......-..................
|
||||||
|
...../...........-..../...|..\...././..\.|............\....................-|......../........................
|
||||||
|
/..|............-\..|.................../.../..................../...-........|...............-../......|-....
|
||||||
|
................/..............................................|.|......-...................|.................
|
||||||
|
....\..../.../.................\\............................................\........\................../..|.
|
||||||
|
../.-.............|......|.........\.........-\........../..........|.\.......................................
|
||||||
|
................./................./\......./........-.........................../........-..........|....\.\.
|
||||||
|
..\...../............/.............................................-.......--...|.................|...../...-.
|
||||||
|
..\......................-.......................-......-.\.-/../......./...........................-../......
|
||||||
|
...............-.................../................../.................-.........................|....\....|.
|
||||||
|
..../.\|..............-...../...|...../................\-....\..\........|....................-...............
|
||||||
|
.........................\...-...-|...................\....../........|...............-....../.../......./....
|
||||||
|
....\......../.-....-........-...../.....-.......-.\...............\.........\............./.....\-...|-..-|..
|
||||||
|
.../\................-....\.......|..-............-.\.............\..\........-............/......./......../.
|
||||||
|
..\.....|...............|..\......|..................................|......./.....\...|..|....\../......./...
|
||||||
|
......|.....././.....-..\..........................-\.............|..../.................................-/...
|
||||||
|
................|\.......|...|.|....................\..............\........................\.-...||..........
|
||||||
|
.-.......\...........-...../............/--....-..\-......................./...-.....|..........\/.....-......
|
||||||
|
...-............-.........\.....................|.........../.........../............|.-.|.....\.../...\-.....
|
||||||
|
.......................|...........\................./...................\............................|.......
|
||||||
|
......................|..|.\...............-.../................/.../.../...........................-.|.......
|
||||||
|
.\.|..........-.|................................../................................/.........-.\....\../.....
|
||||||
|
./............\..\............................|....../........\.........................\.......\..../.\.....-
|
||||||
|
....................../.....................|......./....../............................\....................|
|
||||||
|
..............................||....\........-..............................\..........\\........./.../.......
|
||||||
|
....\....../....................................-..-........................-................-....|.........\.
|
||||||
|
.......-......\.-\.|............................................/......-......../.......\.....................
|
||||||
|
....../...................|........-....-........./...........-.-........./....\..............................
|
||||||
|
..-/..............\............|........../....................\........-.\...................................
|
||||||
|
...-......\............/\...........\.........................-.......\.-./...................................
|
||||||
|
..........-.\.//......................--............\....../.........../-./...................................
|
||||||
|
.......\-.-..-.....\.............|............\....../........\......../...............-..............|....-..
|
||||||
|
........./.-.............\.........................-....|\..........|..../...-.........................\.\...\
|
||||||
|
.........|..\.|.........-...-........-./............|......|....................|.........../...|.............
|
||||||
|
................./....-..../\..............|../-................|.../..............-./|..-........||..........
|
||||||
|
...../.......-.............|.........-.....|.............................\........\.........\.................
|
||||||
|
.............|...../...................../.................\\.....................|\..........-....././......-
|
||||||
|
.............../..../..../....................../...\.......-..........................\\...-|.........../....
|
||||||
|
...........|........|........../..-........../......\...........-.......-.......-.......................-..|..
|
||||||
|
........................\...../.........-.........\.....|...|.........-.....-................-|.../...........
|
||||||
|
..-...............|...-...........\|.\.......\..............................\./......./..........-............
|
||||||
|
........................../....../....................................|................................../....
|
||||||
|
/.......\.................................\./............................|...\..............|...-............|
|
||||||
|
.....-.....................|.........|................-.\.....-..../..../...............-.........|...........
|
||||||
|
...|................\../..|.................|............/.....-......../.........-...\-.-.......\............
|
||||||
|
........................\....-..........|..-....../..............-..........-..|.........\.-...........\......
|
||||||
|
................................\\......./...................-...........|..................\....|...|../.....
|
||||||
|
......-.-.|...\.........|.........|....\......................................................................
|
||||||
|
...................-/....\......../...........|................/......|.-........\|./..|......../.....|..\....
|
||||||
|
....../........-...\../../..........|...\.....\.............................../......-........-...............
|
||||||
|
............\...-....|...................\............-.............|..-......|..../-.........................
|
||||||
|
...........././.-......./............../.....\...-..-.-|.....\../............-..|..|..................--..././
|
||||||
|
...................-......-...././............./.......\\...../|.................\..............\..|..........
|
||||||
|
.|.|.../..\|..-../........................................................-...................................
|
||||||
|
...............-...../.....|...|....\........|......|.............\..........................-...\............
|
||||||
|
..\.......................-..............\..-...........-...............\.\-....-.............................
|
||||||
|
..............-............/..-.......|....-/............../........|............../......|..................-
|
||||||
|
.......|..........|..-..../...................................|-......-..\......./........................\...
|
||||||
|
.........................................-......./..........|.....\../.../......|./.........................\\
|
||||||
|
...-.-.........../......./.-........//..|...................|.........-..........|........................-...
|
||||||
|
........./...../.........\.......\..............-........../-./..|.\...............|....................../...
|
||||||
|
........-.......\\.........-...\..//...-.........\\....../.-................\.......\...\............/...\....
|
||||||
|
................-...|......-.....-..|...../....../...-./.............-...........................-|...........
|
||||||
|
....-..-...........|.................../..\.....|......|...............-.-.|.........../.........../..|....../
|
||||||
|
....\......................................\................../..|...........-.\.....\.........||...........|.
|
||||||
|
.........................\.................-...............\.....\.-......................\.......-\.-........
|
||||||
|
...............-..\................\.................../.............-...................................../..
|
||||||
|
..-|../.-..|....\............-.......\.../....../...-...../|.........\..\..-..../.-..\....|........\..........
|
||||||
|
.........................../............|....................-......................................|.........
|
||||||
|
...../...........|.../........./............./......../.........-.............|..............-.......-|..-...|
|
||||||
|
..\/......./.\................/.......-............\..\............................................\..........
|
||||||
|
.......\.\.\......../|......\....................|..\..........-............./.........-...\....|../\......|..
|
||||||
|
...........\......././.........\......../...............................|........./...|.......................
|
||||||
|
............|.......|......./.............-..-.........\.....\....................../................./.......
|
||||||
|
...................................................../...../...............\........-.........................
|
||||||
|
.|...............-.............-........................|...............................-..|................/.
|
||||||
|
..............\....../../...........-.-..\........../...........-.....-......................|..../..|.|......
|
||||||
|
...................../...-.-........................../.........................|.....\.......................
|
||||||
|
.........\............\..............|.....//........-..\.../..................-.......//..........|......|..\
|
||||||
|
...../\.........\.......|....|....\...|..........\..............//........-..-.......-............-.-./.......
|
||||||
|
.........|.........................\...............................|/..........\..\...-..|..................\.
|
||||||
|
........................\..........|........./..-......\..../..|............\......./......................./|
|
||||||
|
................\.-...................|.......|/.-|....-.-.../......-.-...-.......-.........../.....-..|......
|
||||||
|
..........-.\......-.-....-............\..-.......\....-.../\..................|............/...|..../.....-..
|
||||||
|
|.....................|..\...................||............\...\......./........................-.....|..../..
|
||||||
|
.|..../.......|..........................................................|....../.....|.....|.....-...........
|
||||||
|
.......................|..-..\../.....|.........\.................-...........................................
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
.|...\....
|
||||||
|
|.-.\.....
|
||||||
|
.....|-...
|
||||||
|
........|.
|
||||||
|
..........
|
||||||
|
.........\
|
||||||
|
..../.\\..
|
||||||
|
.-.-/..|..
|
||||||
|
.|....-|.\
|
||||||
|
..//.|....
|
|
@ -0,0 +1,204 @@
|
||||||
|
program day16
|
||||||
|
implicit none
|
||||||
|
integer, parameter :: max_chars = 300
|
||||||
|
integer, parameter :: max_rows = 300
|
||||||
|
character(200) :: fname
|
||||||
|
character(max_chars) :: fline
|
||||||
|
character(max_chars) :: map(1:max_rows)
|
||||||
|
integer :: n_arguments
|
||||||
|
integer :: istat
|
||||||
|
integer :: rows, cols, strlen
|
||||||
|
logical :: energised(1:max_rows, 1:max_chars, 0:4)
|
||||||
|
integer :: i
|
||||||
|
integer :: n_en, sum_en
|
||||||
|
|
||||||
|
n_arguments = command_argument_count()
|
||||||
|
if (n_arguments .eq. 1) then
|
||||||
|
call get_command_argument(1, fname)
|
||||||
|
print *, "File: ", trim(fname)
|
||||||
|
print *
|
||||||
|
else
|
||||||
|
print *, "Wrong number of arguments: ", n_arguments
|
||||||
|
stop
|
||||||
|
end if
|
||||||
|
open(10, file=fname)
|
||||||
|
rows = 0
|
||||||
|
do i=1,max_rows
|
||||||
|
read(10, "(a)", iostat=istat) fline
|
||||||
|
strlen = len_trim(fline)
|
||||||
|
if ((strlen .eq. 0) .or. (is_iostat_end(istat))) then
|
||||||
|
exit
|
||||||
|
end if
|
||||||
|
rows = rows + 1
|
||||||
|
map(rows) = fline
|
||||||
|
end do
|
||||||
|
close(10)
|
||||||
|
cols = len_trim(map(1))
|
||||||
|
do i=1,rows
|
||||||
|
print *, map(i)(1:cols)
|
||||||
|
end do
|
||||||
|
energised = .false.
|
||||||
|
call beam(1, 1, 0, 1, map, rows, cols)
|
||||||
|
n_en = n_energised(energised, rows, cols)
|
||||||
|
print *, "Number energised: ", n_en
|
||||||
|
sum_en = 0
|
||||||
|
do i=1,rows
|
||||||
|
energised = .false.
|
||||||
|
call beam(i, 1, 0, 1, map, rows, cols)
|
||||||
|
n_en = n_energised(energised, rows, cols)
|
||||||
|
if (n_en .gt. sum_en) then
|
||||||
|
sum_en = n_en
|
||||||
|
end if
|
||||||
|
energised = .false.
|
||||||
|
call beam(i, cols, 0, -1, map, rows, cols)
|
||||||
|
n_en = n_energised(energised, rows, cols)
|
||||||
|
if (n_en .gt. sum_en) then
|
||||||
|
sum_en = n_en
|
||||||
|
end if
|
||||||
|
end do
|
||||||
|
do i=1,cols
|
||||||
|
energised = .false.
|
||||||
|
call beam(1, i, 1, 0, map, rows, cols)
|
||||||
|
n_en = n_energised(energised, rows, cols)
|
||||||
|
if (n_en .gt. sum_en) then
|
||||||
|
sum_en = n_en
|
||||||
|
end if
|
||||||
|
energised = .false.
|
||||||
|
call beam(rows, i, -1, 0, map, rows, cols)
|
||||||
|
n_en = n_energised(energised, rows, cols)
|
||||||
|
if (n_en .gt. sum_en) then
|
||||||
|
sum_en = n_en
|
||||||
|
end if
|
||||||
|
end do
|
||||||
|
print *, "Max energised: ", sum_en
|
||||||
|
|
||||||
|
contains
|
||||||
|
recursive subroutine beam(s_y, s_x, s_yd, s_xd, map, rows, cols)
|
||||||
|
integer, intent(in) :: s_y, s_x, s_yd, s_xd
|
||||||
|
integer, intent(in) :: rows, cols
|
||||||
|
character(*), intent(in) :: map(:)
|
||||||
|
character(len=1) :: cell
|
||||||
|
integer, parameter :: max_iter = 500000
|
||||||
|
integer :: y, x, yd, xd
|
||||||
|
integer :: i
|
||||||
|
logical :: split
|
||||||
|
y = s_y
|
||||||
|
x = s_x
|
||||||
|
yd = s_yd
|
||||||
|
xd = s_xd
|
||||||
|
do i=1,max_iter
|
||||||
|
if ((x .lt. 1) .or. (x .gt. cols) .or. (y .lt. 1) .or. (y .gt. rows)) then
|
||||||
|
! Out of bounds
|
||||||
|
return
|
||||||
|
end if
|
||||||
|
if (energised(y, x, dir_i(yd, xd))) then
|
||||||
|
! In a loop
|
||||||
|
return
|
||||||
|
end if
|
||||||
|
! Mark where we've been
|
||||||
|
energised(y, x, 0) = .true.
|
||||||
|
energised(y, x, dir_i(yd, xd)) = .true.
|
||||||
|
! Work out where to go
|
||||||
|
cell = map(y)(x:x)
|
||||||
|
split = is_split(cell, yd, xd)
|
||||||
|
call cell_dir(cell, yd, xd)
|
||||||
|
if (split) then
|
||||||
|
! New beam in other direction
|
||||||
|
call beam(y-yd, x-xd, -yd, -xd, map, rows, cols)
|
||||||
|
end if
|
||||||
|
y = y + yd
|
||||||
|
x = x + xd
|
||||||
|
end do
|
||||||
|
print *, "Hit max iter"
|
||||||
|
stop
|
||||||
|
end subroutine beam
|
||||||
|
|
||||||
|
function is_split(cell, yd, xd)
|
||||||
|
character(len=1), intent(in) :: cell
|
||||||
|
integer, intent(in) :: yd, xd
|
||||||
|
logical :: is_split
|
||||||
|
if ((cell .eq. '-') .and. (yd .ne. 0)) then
|
||||||
|
is_split = .true.
|
||||||
|
else if ((cell .eq. '|') .and. (xd .ne. 0)) then
|
||||||
|
is_split = .true.
|
||||||
|
else
|
||||||
|
is_split = .false.
|
||||||
|
end if
|
||||||
|
end function is_split
|
||||||
|
|
||||||
|
subroutine cell_dir(cell, yd, xd)
|
||||||
|
character(len=1), intent(in) :: cell
|
||||||
|
integer, intent(inout) :: yd, xd
|
||||||
|
if (yd .eq. -1) then
|
||||||
|
if (cell .eq. '\' .or. cell .eq. '-') then
|
||||||
|
yd = 0
|
||||||
|
xd = -1
|
||||||
|
else if (cell .eq. '/') then
|
||||||
|
yd = 0
|
||||||
|
xd = 1
|
||||||
|
end if
|
||||||
|
else if (yd .eq. 1) then
|
||||||
|
if (cell .eq. '\' .or. cell .eq. '-') then
|
||||||
|
yd = 0
|
||||||
|
xd = 1
|
||||||
|
else if (cell .eq. '/') then
|
||||||
|
yd = 0
|
||||||
|
xd = -1
|
||||||
|
end if
|
||||||
|
else if (xd .eq. -1) then
|
||||||
|
if (cell .eq. '\' .or. cell .eq. '|') then
|
||||||
|
yd = -1
|
||||||
|
xd = 0
|
||||||
|
else if (cell .eq. '/') then
|
||||||
|
yd = 1
|
||||||
|
xd = 0
|
||||||
|
end if
|
||||||
|
else if (xd .eq. 1) then
|
||||||
|
if (cell .eq. '\' .or. cell .eq. '|') then
|
||||||
|
yd = 1
|
||||||
|
xd = 0
|
||||||
|
else if (cell .eq. '/') then
|
||||||
|
yd = -1
|
||||||
|
xd = 0
|
||||||
|
end if
|
||||||
|
else
|
||||||
|
print *, "Direction ????", yd, xd
|
||||||
|
stop
|
||||||
|
end if
|
||||||
|
end subroutine cell_dir
|
||||||
|
|
||||||
|
function dir_i(yd, xd)
|
||||||
|
implicit none
|
||||||
|
integer, intent(in) :: yd, xd
|
||||||
|
integer :: dir_i
|
||||||
|
if (yd .eq. -1) then
|
||||||
|
dir_i = 1
|
||||||
|
else if (xd .eq. 1) then
|
||||||
|
dir_i = 2
|
||||||
|
else if (yd .eq. 1) then
|
||||||
|
dir_i = 3
|
||||||
|
else if (xd .eq. -1) then
|
||||||
|
dir_i = 4
|
||||||
|
else
|
||||||
|
print *, "Direction ????", yd, xd
|
||||||
|
stop
|
||||||
|
end if
|
||||||
|
end function dir_i
|
||||||
|
|
||||||
|
function n_energised(en_map, rows, cols) result(n_en)
|
||||||
|
integer, intent(in) :: rows, cols
|
||||||
|
logical, intent(in) :: en_map(1:max_rows, 1:max_chars, 0:4)
|
||||||
|
integer :: n_en
|
||||||
|
integer :: i, i2
|
||||||
|
n_en = 0
|
||||||
|
do i=1,rows
|
||||||
|
do i2=1,cols
|
||||||
|
if (en_map(i, i2, 0)) then
|
||||||
|
n_en = n_en + 1
|
||||||
|
end if
|
||||||
|
end do
|
||||||
|
end do
|
||||||
|
end function n_energised
|
||||||
|
|
||||||
|
end program day16
|
||||||
|
|
Loading…
Reference in New Issue