program problem_2 use iso_fortran_env use aoc_utilities implicit none integer :: iunit logical :: status_ok, game_possible character(len=:),allocatable :: line, color integer :: n_lines, id, j, k, ipossible, inum, min_red, min_green, min_blue, power type(string),dimension(:),allocatable :: vals, trys, cubes, num_color integer,parameter :: n_red = 12 integer,parameter :: n_green = 13 integer,parameter :: n_blue = 14 call clk%tic() !example: Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green open(newunit=iunit, file='inputs/day2.txt', status='OLD') n_lines = number_of_lines_in_file(iunit) ! will parse the line with successive splits ipossible = 0 power = 0 main: do id = 1, n_lines game_possible = .true. min_red = 0; min_green = 0; min_blue = 0 line = read_line(iunit,status_ok) vals = split(line,': ') trys = split(vals(2), '; ') do j = 1, size(trys) cubes = split(trys(j), ', ') do k = 1, size(cubes) num_color = split(cubes(k), ' ') inum = int(num_color(1)%str) color = num_color(2)%str select case (color) case('red') if (inum>n_red) game_possible = .false. if (inum>min_red) min_red = inum case('green') if (inum>n_green) game_possible = .false. if (inum>min_green) min_green = inum case('blue') if (inum>n_blue) game_possible = .false. if (inum>min_blue) min_blue = inum end select end do end do power = power + (min_red * min_green * min_blue) if (game_possible) ipossible = ipossible + id end do main write(*,*) '2a: result :', ipossible write(*,*) '2b: power sum:', power close(iunit) call clk%toc('2') end program problem_2