Advertisement
autid

AoC 2021 Day 12 Fortran

Dec 12th, 2021
2,694
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. PROGRAM DAY12
  2.     IMPLICIT NONE
  3.     INTEGER :: I,J,K,N,M,IERR,START,END
  4.     CHARACTER(LEN=5) :: NAME,A,B
  5.     CHARACTER(LEN=5), ALLOCATABLE :: CAVENAMES(:)
  6.     CHARACTER(LEN=8), ALLOCATABLE :: CONNECTIONS(:)
  7.     LOGICAL, ALLOCATABLE :: VISITED(:)
  8.     INTEGER, ALLOCATABLE :: CONN(:,:)
  9.  
  10.     OPEN(1,FILE="input.txt")
  11.     N=0
  12.     DO
  13.         READ(1,*,IOSTAT=IERR)
  14.         IF(IERR.NE.0) EXIT
  15.         N=N+1
  16.     END DO
  17.     REWIND(1)
  18.     ALLOCATE(CONNECTIONS(N),CAVENAMES(2*N),CONN(2*N,2*N),VISITED(2*N))
  19.     READ (1,*) CONNECTIONS
  20.     CLOSE(1)
  21.  
  22.     CAVENAMES=""
  23.     CAVENAMES(1) = "start"
  24.     CONN=0
  25.     M=2
  26.     DO I=1,N
  27.         NAME = CONNECTIONS(I)(1:SCAN(CONNECTIONS(I),"-")-1)
  28.         IF((.NOT.ANY(CAVENAMES.EQ.NAME)).AND.(TRIM(NAME).NE."end")) THEN
  29.             CAVENAMES(M) = NAME
  30.             M=M+1
  31.         END IF
  32.         NAME = CONNECTIONS(I)(SCAN(CONNECTIONS(I),"-")+1:LEN_TRIM(CONNECTIONS(I)))
  33.         IF((.NOT.ANY(CAVENAMES.EQ.NAME)).AND.(TRIM(NAME).NE."end")) THEN
  34.             CAVENAMES(M) = NAME
  35.             M=M+1
  36.         END IF
  37.     END DO
  38.     CAVENAMES(M)="end"
  39.     DO I=1,N
  40.         A = CONNECTIONS(I)(1:SCAN(CONNECTIONS(I),"-")-1)
  41.         B = CONNECTIONS(I)(SCAN(CONNECTIONS(I),"-")+1:LEN_TRIM(CONNECTIONS(I)))
  42.         J=MAXLOC(CAVENAMES,MASK=CAVENAMES.EQ.A,DIM=1)
  43.         K=MAXLOC(CAVENAMES,MASK=CAVENAMES.EQ.B,DIM=1)
  44.         CONN(MINLOC(CONN(:,J)),J) = K
  45.         CONN(MINLOC(CONN(:,K)),K) = J
  46.     END DO
  47.     VISITED = .FALSE.
  48.     WRITE(*,'(A,I0)') "Part 1: ", NPATHS(CONN,VISITED,1,M,1,.FALSE.)
  49.     WRITE(*,'(A,I0)') "Part 2: ", NPATHS(CONN,VISITED,1,M,2,.FALSE.)
  50. CONTAINS
  51.     RECURSIVE FUNCTION NPATHS(CONN,V,A,END,PART,DOUBLE) RESULT(P1)
  52.         INTEGER :: CONN(:,:),I,J,A,END,P1,PART
  53.         LOGICAL :: V(:),VISITED(SIZE(VISITED)),DOUBLE
  54.  
  55.         VISITED = V
  56.         VISITED(A)=.TRUE.
  57.         P1=0
  58.         DO I=1,SIZE(CONN,DIM=1)
  59.             IF(CONN(I,A).EQ.1)CYCLE
  60.             IF(CONN(I,A).EQ.0)EXIT
  61.             IF(CONN(I,A).EQ.END) THEN
  62.                 P1=P1+1
  63.                 CYCLE
  64.             ELSE
  65.                 J=IACHAR(CAVENAMES(CONN(I,A))(1:1))
  66.                 IF(J.GE.97 .AND. J.LE.122) THEN
  67.                     IF(VISITED(CONN(I,A))) THEN
  68.                         IF(DOUBLE .OR. PART.EQ.1) CYCLE
  69.                         P1=P1+NPATHS(CONN,VISITED,CONN(I,A),END,PART,.TRUE.)
  70.                         CYCLE
  71.                     ENDIF
  72.                 END IF
  73.                 P1=P1+NPATHS(CONN,VISITED,CONN(I,A),END,PART,DOUBLE)
  74.             END IF
  75.         END DO
  76.     END FUNCTION NPATHS
  77. END PROGRAM DAY12
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement