Finish day 3 2019
parent
c95fc40a31
commit
b3961f52db
|
@ -0,0 +1,2 @@
|
||||||
|
R8,U5,L5,D3
|
||||||
|
U7,R6,D4,L4
|
|
@ -0,0 +1,2 @@
|
||||||
|
R75,D30,R83,U83,L12,D49,R71,U7,L72
|
||||||
|
U62,R66,U55,R34,D71,R55,D58,R83
|
|
@ -0,0 +1,2 @@
|
||||||
|
R98,U47,R26,D63,R33,U87,L62,D20,R33,U53,R51
|
||||||
|
U98,R91,D20,R16,D67,R40,U7,R15,U6,R7
|
|
@ -6,7 +6,11 @@ program day3
|
||||||
character(path_length) :: fname
|
character(path_length) :: fname
|
||||||
integer :: n_arguments
|
integer :: n_arguments
|
||||||
character(max_chars), allocatable :: data_strs(:)
|
character(max_chars), allocatable :: data_strs(:)
|
||||||
!integer :: i
|
integer, allocatable :: line1(:,:)
|
||||||
|
integer, allocatable :: line2(:,:)
|
||||||
|
integer :: l1, l2, line1_len, line2_len
|
||||||
|
integer :: manhattan, min_manhattan
|
||||||
|
integer :: siglen, min_siglen
|
||||||
|
|
||||||
n_arguments = command_argument_count()
|
n_arguments = command_argument_count()
|
||||||
if (n_arguments .eq. 1) then
|
if (n_arguments .eq. 1) then
|
||||||
|
@ -17,10 +21,50 @@ program day3
|
||||||
stop
|
stop
|
||||||
end if
|
end if
|
||||||
data_strs = read_instruction_strings(fname)
|
data_strs = read_instruction_strings(fname)
|
||||||
print *, data_strs
|
|
||||||
print *, data_strs(1)
|
|
||||||
print *, data_strs(1)(5:)
|
|
||||||
|
|
||||||
|
line1 = all_occupied_points(data_strs(1))
|
||||||
|
line2 = all_occupied_points(data_strs(2))
|
||||||
|
|
||||||
|
line1_len = size(line1, 2)
|
||||||
|
line2_len = size(line2, 2)
|
||||||
|
min_manhattan = huge(min_manhattan)
|
||||||
|
min_siglen = huge(min_siglen)
|
||||||
|
|
||||||
|
print *, "Lengths: ", line1_len, line2_len
|
||||||
|
|
||||||
|
do l1 = 1, line1_len
|
||||||
|
do l2 = 1, line2_len
|
||||||
|
if ((line1(1, l1) .eq. line2(1, l2)) .and. (line1(2, l1) .eq. line2(2, l2))) then
|
||||||
|
manhattan = abs(line1(1, l1)) + abs(line1(2, l1))
|
||||||
|
siglen = l1 + l2
|
||||||
|
if ((manhattan .lt. min_manhattan) .and. (siglen .lt. min_siglen)) then
|
||||||
|
write (*, 23) l1, l2, line1(1, l1), line1(2, l1), manhattan, siglen
|
||||||
|
min_manhattan = manhattan
|
||||||
|
min_siglen = siglen
|
||||||
|
else if (siglen .lt. min_siglen) then
|
||||||
|
write (*, 22) l1, l2, line1(1, l1), line1(2, l1), manhattan, siglen
|
||||||
|
min_siglen = siglen
|
||||||
|
else if (manhattan .lt. min_manhattan) then
|
||||||
|
write (*, 21) l1, l2, line1(1, l1), line1(2, l1), manhattan, siglen
|
||||||
|
min_manhattan = manhattan
|
||||||
|
else
|
||||||
|
write (*, 20) l1, l2, line1(1, l1), line1(2, l1), manhattan, siglen
|
||||||
|
end if
|
||||||
|
end if
|
||||||
|
end do
|
||||||
|
end do
|
||||||
|
|
||||||
|
20 format(' ', i7, ',', i7, ' (', i5, ',', i5, '): ', i8, i8)
|
||||||
|
21 format('* ', i7, ',', i7, ' (', i5, ',', i5, '): ', i8, i8)
|
||||||
|
22 format('> ', i7, ',', i7, ' (', i5, ',', i5, '): ', i8, i8)
|
||||||
|
23 format('+ ', i7, ',', i7, ' (', i5, ',', i5, '): ', i8, i8)
|
||||||
|
|
||||||
|
print *
|
||||||
|
print *, "Minimum manhattan: ", min_manhattan
|
||||||
|
print *, "Minimum signal length: ", min_siglen
|
||||||
|
|
||||||
|
deallocate(line1)
|
||||||
|
deallocate(line2)
|
||||||
deallocate(data_strs)
|
deallocate(data_strs)
|
||||||
|
|
||||||
contains
|
contains
|
||||||
|
@ -41,8 +85,8 @@ program day3
|
||||||
function all_occupied_points(istring) result(occupied)
|
function all_occupied_points(istring) result(occupied)
|
||||||
implicit none
|
implicit none
|
||||||
integer, parameter :: imax = 6
|
integer, parameter :: imax = 6
|
||||||
character(max_chars), allocatable :: istring
|
character(max_chars) :: istring
|
||||||
integer :: n_cmds = 1
|
integer :: n_cmds
|
||||||
integer :: i_chars, i1, i2, i_s
|
integer :: i_chars, i1, i2, i_s
|
||||||
integer :: t_strlen
|
integer :: t_strlen
|
||||||
integer :: t_mvmnt, s_mvmnt
|
integer :: t_mvmnt, s_mvmnt
|
||||||
|
@ -50,8 +94,10 @@ program day3
|
||||||
character(imax), allocatable :: tcmds(:)
|
character(imax), allocatable :: tcmds(:)
|
||||||
character(1), allocatable :: dirs(:)
|
character(1), allocatable :: dirs(:)
|
||||||
integer, allocatable :: mvmnts(:)
|
integer, allocatable :: mvmnts(:)
|
||||||
logical, allocatable :: occupied(:,:)
|
integer, allocatable :: occupied(:,:)
|
||||||
|
integer :: c_tot
|
||||||
|
|
||||||
|
n_cmds = 1
|
||||||
t_strlen = len_trim(istring)
|
t_strlen = len_trim(istring)
|
||||||
do i_chars=1,t_strlen
|
do i_chars=1,t_strlen
|
||||||
if (istring(i_chars:i_chars) .eq. ',') then
|
if (istring(i_chars:i_chars) .eq. ',') then
|
||||||
|
@ -77,6 +123,7 @@ program day3
|
||||||
c_x = 0
|
c_x = 0
|
||||||
c_y = 0
|
c_y = 0
|
||||||
i_s = 1
|
i_s = 1
|
||||||
|
c_tot = 0
|
||||||
do i1=1,n_cmds
|
do i1=1,n_cmds
|
||||||
if (dirs(i1) .eq. 'U') then
|
if (dirs(i1) .eq. 'U') then
|
||||||
d_y = 1
|
d_y = 1
|
||||||
|
@ -92,12 +139,13 @@ program day3
|
||||||
d_x = 1
|
d_x = 1
|
||||||
end if
|
end if
|
||||||
t_mvmnt = mvmnts(i1)
|
t_mvmnt = mvmnts(i1)
|
||||||
do i2 = i, t_mvmnt
|
do i2 = 1, t_mvmnt
|
||||||
c_x = c_x + d_x
|
c_x = c_x + d_x
|
||||||
c_y = c_y + d_y
|
c_y = c_y + d_y
|
||||||
occupied(1, i_s) = c_x
|
occupied(1, i_s) = c_x
|
||||||
occupied(2, i_s) = c_y
|
occupied(2, i_s) = c_y
|
||||||
i_s = i_s + 1
|
i_s = i_s + 1
|
||||||
|
c_tot = c_tot + 1
|
||||||
end do
|
end do
|
||||||
end do
|
end do
|
||||||
deallocate(tcmds)
|
deallocate(tcmds)
|
||||||
|
|
Loading…
Reference in New Issue