Advertisement
autid

AoC 2019 Day3 FORTRAN

Dec 3rd, 2019
1,544
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. PROGRAM DAY3
  2.   INTEGER :: N,L,I,J,K,IERR,X,Y,MAXX=0,MAXY=0,MINX=0,MINY=0,T,STEP
  3.   INTEGER :: X1,X2,Y1,Y2
  4.   CHARACTER(LEN=9),ALLOCATABLE :: INPUTA(:),INPUTB(:)
  5.   CHARACTER(LEN=:), ALLOCATABLE :: INLINE
  6.   CHARACTER(LEN=1) :: CHAR
  7.   INTEGER, ALLOCATABLE :: WIREA(:,:),WIREB(:,:),DIST(:,:)
  8.   OPEN(1,FILE="input.txt")
  9.   L=0
  10.   N=1
  11.   DO
  12.      READ(1,'(A)',ADVANCE="NO",IOSTAT=IERR)CHAR
  13.      IF(IERR.NE.0)EXIT
  14.      L=L+1
  15.      IF(CHAR.EQ.',')N=N+1
  16.   END DO
  17.   ALLOCATE(INPUTA(N))
  18.   ALLOCATE(CHARACTER(LEN=L) :: INLINE)
  19.  
  20.   REWIND(1)
  21.   READ(1,'(A)')INLINE
  22.   I=1
  23.   DO J=1,N-1
  24.      INPUTA(J)=INLINE(I:I+SCAN(INLINE(I:),",")-2)
  25.      I=I+SCAN(INLINE(I:),",")
  26.   END DO
  27.   INPUTA(N)=INLINE(I:)
  28.   DEALLOCATE(INLINE)
  29.  
  30.   REWIND(1)
  31.   L=0
  32.   N=1
  33.   READ(1,*)
  34.   DO
  35.      READ(1,'(A)',ADVANCE="NO",IOSTAT=IERR)CHAR
  36.      IF(IERR.NE.0)EXIT
  37.      L=L+1
  38.      IF(CHAR.EQ.',')N=N+1
  39.   END DO
  40.   ALLOCATE(INPUTB(N))
  41.   ALLOCATE(CHARACTER(LEN=L) :: INLINE)
  42.  
  43.   REWIND(1)
  44.   READ(1,*)
  45.   READ(1,'(A)')INLINE
  46.   I=1
  47.   DO J=1,N-1
  48.      INPUTB(J)=INLINE(I:I+SCAN(INLINE(I:),",")-2)
  49.      I=I+SCAN(INLINE(I:),",")
  50.   END DO
  51.   INPUTB(N)=INLINE(I:)
  52.   CLOSE(1)
  53.  
  54.   X=0
  55.   Y=0
  56.   DO I=1,SIZE(INPUTA)
  57.      READ(INPUTA(I)(2:),*)J
  58.      SELECT CASE (INPUTA(I)(1:1))
  59.      CASE ("U")
  60.         Y=Y+J
  61.         MAXY=MAX(MAXY,Y)
  62.      CASE ("D")
  63.         Y=Y-J
  64.         MINY=MIN(MINY,Y)
  65.      CASE ("R")
  66.         X=X+J
  67.         MAXX=MAX(MAXX,X)
  68.      CASE ("L")
  69.         X=X-J
  70.         MINX=MIN(X,MINX)
  71.      END SELECT
  72.   END DO
  73.   X=0
  74.   Y=0
  75.   DO I=1,SIZE(INPUTB)
  76.      READ(INPUTB(I)(2:),*)J
  77.      SELECT CASE (INPUTB(I)(1:1))
  78.      CASE ("U")
  79.         Y=Y+J
  80.         MAXY=MAX(MAXY,Y)
  81.      CASE ("D")
  82.         Y=Y-J
  83.         MINY=MIN(MINY,Y)
  84.      CASE ("R")
  85.         X=X+J
  86.         MAXX=MAX(MAXX,X)
  87.      CASE ("L")
  88.         X=X-J
  89.         MINX=MIN(X,MINX)
  90.      END SELECT
  91.  
  92.   END DO
  93.   ALLOCATE(WIREA(MINX:MAXX,MINY:MAXY),WIREB(MINX:MAXX,MINY:MAXY),DIST(MINX:MAXX,MINY:MAXY))
  94.   WIREA=0
  95.   WIREB=0
  96.   DO Y=MINY,MAXY
  97.      DO X=MINX,MAXX
  98.         DIST(X,Y)=ABS(X)+ABS(Y)
  99.      END DO
  100.   END DO
  101.  
  102.   T=0
  103.   X=0
  104.   Y=0
  105.   DO I=1,SIZE(INPUTA)
  106.      READ(INPUTA(I)(2:),*)K
  107.      DO J=1,K
  108.         T=T+1
  109.         SELECT CASE (INPUTA(I)(1:1))
  110.         CASE ("U")
  111.            Y=Y+1
  112.         CASE ("D")
  113.            Y=Y-1
  114.         CASE ("L")
  115.            X=X-1
  116.         CASE ("R")
  117.            X=X+1
  118.         END SELECT
  119.         WIREA(X,Y)=T
  120.      END DO
  121.   END DO
  122.  
  123.   T=0
  124.   X=0
  125.   Y=0
  126.   DO I=1,SIZE(INPUTB)
  127.      READ(INPUTB(I)(2:),*)K
  128.      DO J=1,K
  129.         T=T+1
  130.         SELECT CASE (INPUTB(I)(1:1))
  131.         CASE ("U")
  132.            Y=Y+1
  133.         CASE ("D")
  134.            Y=Y-1
  135.         CASE ("L")
  136.            X=X-1
  137.         CASE ("R")
  138.            X=X+1
  139.         END SELECT
  140.         WIREB(X,Y)=T
  141.      END DO
  142.   END DO
  143.  
  144.   WRITE(*,'("Part 1: ",I0)') MINVAL(DIST,MASK=(WIREA>0.AND.WIREB>0.AND.DIST>0))
  145.   WRITE(*,'("Part 2: ",I0)') MINVAL(WIREA+WIREB,MASK=(WIREA>0.AND.WIREB>0))
  146.  
  147. END PROGRAM DAY3
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement