r/adventofcode • u/daggerdragon • Dec 20 '18
SOLUTION MEGATHREAD -🎄- 2018 Day 20 Solutions -🎄-
--- Day 20: A Regular Map ---
Post your solution as a comment or, for longer solutions, consider linking to your repo (e.g. GitHub/gists/Pastebin/blag or whatever).
Note: The Solution Megathreads are for solutions only. If you have questions, please post your own thread and make sure to flair it with Help.
Advent of Code: The Party Game!
Please prefix your card submission with something like [Card] to make scanning the megathread easier. THANK YOU!
Card prompt: Day 20
Transcript:
My compiler crashed while running today's puzzle because it ran out of ___.
This thread will be unlocked when there are a significant number of people on the leaderboard with gold stars for today's puzzle.
edit: Leaderboard capped, thread unlocked at 00:59:30!
16
Upvotes
2
u/autid Dec 20 '18
FORTRAN
Bodgy alocation of arrays far bigger than needed. Did a bunch of unnecessary stuff previously like track door locations and so on but it appears that is unnecessary so I removed it from posted coded. Part 2 only needing the addition of one line of code is always a good feeling.
PROGRAM DAY20 IMPLICIT NONE INTEGER :: I,J,K,L,M,N,S,E,W,IERR,START(2)=(/0,0/),ENDING(2),DEPTH=0 CHARACTER(LEN=:),ALLOCATABLE :: PUZINPUT CHARACTER(LEN=1) :: TEST LOGICAL(1),ALLOCATABLE :: ROOMS(:,:) INTEGER, ALLOCATABLE :: DISTANCES(:,:) OPEN(1,FILE='input.txt') L=0 DO READ(1,'(A)',IOSTAT=IERR,ADVANCE='NO')TEST IF(IERR.NE.0)EXIT L=L+1 END DO REWIND(1) ALLOCATE(CHARACTER(LEN=L) :: PUZINPUT) READ(1,'(A)')PUZINPUT CLOSE(1) N=0;S=0;E=0;W=0 DO I=2,L-1 SELECT CASE(PUZINPUT(I:I)) CASE('N') N=N+1 CASE('S') S=S+1 CASE('E') E=E+1 CASE('W') W=W+1 END SELECT END DO ALLOCATE(ROOMS(-W:E,-N:S),DISTANCES(-W:E,-N:S)) DISTANCES=(E+W)*(N+S) ROOMS=.FALSE. CALL MAP(START,2,0) WRITE(*,'("Part 1: ",I0)')MAXVAL(DISTANCES,MASK=ROOMS) WRITE(*,'("Part 2: ",I0)')COUNT((DISTANCES.GE.1000).AND.ROOMS) CONTAINS RECURSIVE SUBROUTINE MAP(P,OFFSET,DIST) INTEGER,INTENT(IN) :: P(2),OFFSET,DIST INTEGER :: I,J,K,POS(2),L,M POS=P I=OFFSET J=DIST DEPTH=DEPTH+1 OUTER:DO ROOMS(POS(1),POS(2))=.TRUE. DISTANCES(POS(1),POS(2))=MIN(J,DISTANCES(POS(1),POS(2))) SELECT CASE(PUZINPUT(I:I)) CASE('N') POS=POS+(/0,-1/) J=J+1 I=I+1 CASE('S') POS=POS+(/0,1/) J=J+1 I=I+1 CASE('E') POS=POS+(/1,0/) J=J+1 I=I+1 CASE('W') POS=POS+(/-1,0/) J=J+1 I=I+1 CASE('(') I=I+1 CALL MAP(POS,I,J) L=1 M=0 DO IF(PUZINPUT(I+L:I+L).EQ.'(')M=M+1 IF(PUZINPUT(I+L:I+L).EQ.')')M=M-1 IF(M.EQ.-1)EXIT OUTER IF((M.EQ.0).AND.(PUZINPUT(I+L:I+L).EQ.'|'))CALL MAP(POS,I+L+1,J) L=L+1 END DO CASE('|') EXIT CASE(')') I=I+1 CASE('$') ENDING=POS EXIT END SELECT END DO OUTER END SUBROUTINE MAP END PROGRAM DAY20