diff options
| author | Trey Bastian <2991824+TreyBastian@users.noreply.github.com> | 2024-12-06 09:27:43 +0000 |
|---|---|---|
| committer | Trey Bastian <2991824+TreyBastian@users.noreply.github.com> | 2024-12-06 09:27:43 +0000 |
| commit | b3ea9384b0dc206a41beeb11c04a585c7835b0e8 (patch) | |
| tree | 3d12fe5f71a6c7769ba0e0879bfeace76f297344 /2024 | |
| parent | a0a6eca1ee2041d1264ca37e0e236208c8cb3aa2 (diff) | |
day 6 part 2 fortran done
Diffstat (limited to '2024')
| -rw-r--r-- | 2024/day_06_part_2.f90 | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/2024/day_06_part_2.f90 b/2024/day_06_part_2.f90 new file mode 100644 index 0000000..0120836 --- /dev/null +++ b/2024/day_06_part_2.f90 @@ -0,0 +1,97 @@ +program day_06_part_2 + implicit none + character(len=130) :: line, lines(130), temp_lines(130) + integer:: io, x,y, xd,yd, i, j, ct, o_ct, init_x, init_y, init_xd, init_yd + + open(newunit=io, file='./day_06_input.txt', status='old', action='read') + read(io, '(a)') lines + + ct = 0 + ! find starting position + do i = 1, size(lines) + if (index(lines(i), '^') > 0) then + y = i + x = index(lines(i), '^') + lines(i)(x:x) = '.' ! replace with a dot to not confuse this part + xd = 0 + yd = -1 + init_x = x + init_y = y + init_xd = xd + init_yd = yd + exit + end if + end do + + do i = 1, size(lines) + do j = 1, len(lines(i)) + o_ct = 0 + ! reset positions + x = init_x + y = init_y + xd = init_xd + yd = init_yd + temp_lines = lines ! fresh board every run + if(temp_lines(i)(j:j) == '.') then + temp_lines(i)(j:j) = 'O' ! place obstacle to test + ! move until we leave the bounds when we hit a valid spot mark it with an X and increase count + do + ! are we going out of bounds? + if (x+xd < 1 .or. x+xd > len(temp_lines(y)) .or. y+yd < 1 .or. y+yd > size(temp_lines)) then + exit + end if + + ! try to move + select case(temp_lines(y+yd)(x+xd:x+xd)) + case('.') + ! valid move + x = x + xd + y = y + yd + case('O') + ! we are blocked lets rotate 90 degrees and count obstacle + o_ct = o_ct + 1 + if(xd == 0 .and. yd == -1) then + xd = 1 + yd = 0 + else if (xd == 1 .and. yd == 0) then + xd = 0 + yd = 1 + else if (xd == 0 .and. yd == 1) then + xd = -1 + yd = 0 + else if (xd == -1 .and. yd == 0) then + xd = 0 + yd = -1 + end if + case('#') + ! we are blocked lets rotate 90 degrees + ! change this to an O to try and detect when stuck + temp_lines(y+yd)(x+xd:x+xd) = 'O' + if(xd == 0 .and. yd == -1) then + xd = 1 + yd = 0 + else if (xd == 1 .and. yd == 0) then + xd = 0 + yd = 1 + else if (xd == 0 .and. yd == 1) then + xd = -1 + yd = 0 + else if (xd == -1 .and. yd == 0) then + xd = 0 + yd = -1 + end if + case default + exit + end select + if(o_ct > 100) then + exit ! probably stuck + end if + end do + end if + if(o_ct > 100) then ! we got stuck probably 100 is so arbitrary + ct = ct + 1 + end if + end do + end do + print*, "block points: ", ct +end program day_06_part_2 |
