AdventOfFortran/2023/src/day05.f90

110 lines
3.3 KiB
Fortran

program day5
implicit none
integer, parameter :: i_kind = selected_int_kind(20)
integer, parameter :: max_chars = 300
integer, parameter :: max_iter = 20
character(200) :: fname
character(max_chars) :: fline
integer :: n_arguments
integer :: istat
integer(kind=i_kind), allocatable :: seedvals(:)
integer(kind=i_kind), allocatable :: dat_source(:), dat_dest(:)
integer(kind=i_kind) :: ldat(1:3)
logical, allocatable :: dat_point_found(:)
integer :: pos_col, num_seeds, num_chars, i, sec
integer(kind=i_kind) :: s_min, d_min, r_len, source_val
integer(kind=i_kind) :: min_val
integer :: min_index
print *, "Number of bits: ", i_kind * 8
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)
read(10, "(A)", iostat = istat) fline
pos_col = scan(fline, ":")
num_seeds = 0
num_chars = len_trim(fline)
do i=pos_col + 1,num_chars
if (fline(i:i) .eq. ' ') then
num_seeds = num_seeds + 1
end if
end do
print *, "Number of seeds: ", num_seeds
allocate(seedvals(1:num_seeds))
allocate(dat_source(1:num_seeds))
allocate(dat_dest(1:num_seeds))
allocate(dat_point_found(1:num_seeds))
read(fline((pos_col + 1):(num_chars)), *) seedvals
read(10, "(A)", iostat = istat) fline
dat_dest = seedvals
do sec=1, max_iter
dat_source = dat_dest
dat_dest = 0
dat_point_found = .false.
read(10, "(A)", iostat = istat) fline
if (is_iostat_end(istat)) then
exit
end if
do
read(10, "(A)", iostat = istat) fline
num_chars = len_trim(fline)
if (is_iostat_end(istat) .or. (num_chars .eq. 0)) then
exit
end if
read(fline, *) ldat
s_min = ldat(2)
d_min = ldat(1)
r_len = ldat(3)
do i=1,num_seeds
source_val = dat_source(i)
if ((source_val .ge. s_min) .and. (source_val .lt. (s_min + r_len))) then
dat_point_found(i) = .true.
dat_dest(i) = source_val - s_min + d_min
!write(*, 20) ldat(1), ldat(2), ldat(3), source_val, dat_dest(i)
end if
end do
end do
do i=1,num_seeds
if (.not. dat_point_found(i)) then
dat_dest(i) = dat_source(i)
!write(*, 21) i, dat_dest(i), dat_dest(i)
end if
end do
!print *
if (is_iostat_end(istat)) then
exit
end if
end do
close(10)
min_val = huge(min_val)
min_index = -1
do i=1,num_seeds
if (dat_dest(i) .lt. min_val) then
min_index = 1
min_val = dat_dest(i)
end if
end do
print "(a, i11)", "Minimum location number: ", min_val
deallocate(seedvals)
deallocate(dat_source)
deallocate(dat_dest)
deallocate(dat_point_found)
!20 format(i4, i4, i4, ': ', i4, ' -> ', i4)
!21 format(i4, ': ', i4, ' -> ', i4)
end program day5