Advertisement
autid

AoC 2019 Day12 FORTRAN

Dec 12th, 2019
2,542
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. PROGRAM DAY12  
  2.   INTEGER(8) :: I,J,K,N,IERR,ENERGY,PART2,STEPS
  3.   CHARACTER(LEN=30) :: INLINE
  4.   INTEGER(8) :: CHANGE(3),P2(3)
  5.   INTEGER(8),ALLOCATABLE :: POS(:,:),VEL(:,:),POS2(:,:),VEL2(:,:)
  6.   LOGICAL :: DONE(3)
  7.  
  8.   OPEN(1,FILE="input.txt")
  9.   N=0
  10.   DO
  11.      READ(1,*,IOSTAT=IERR)
  12.      IF(IERR.NE.0)EXIT
  13.      N=N+1
  14.   END DO
  15.   ALLOCATE(POS(3,N),VEL(3,N),POS2(3,N),VEL2(3,N))
  16.   REWIND(1)
  17.   DO I=1,N
  18.      READ(1,'(A)') INLINE
  19.      K=0
  20.      DO J=1,3
  21.         K=K+SCAN(INLINE(K+1:),"=")+1
  22.         READ(INLINE(K:K+SCAN(INLINE(K+1:),",>")-1),*) POS(J,I)
  23.      END DO
  24.   END DO
  25.   CLOSE(1)
  26.   VEL=0
  27.   POS2=POS
  28.   VEL2=VEL
  29.   STEPS=0
  30.   DONE=.FALSE.
  31.  
  32.   DO
  33.      STEPS=STEPS+1
  34.      DO I=1,N-1
  35.         DO J=I+1,N
  36.            CHANGE=(POS(:,J)-POS(:,I))
  37.            WHERE(CHANGE.NE.0)
  38.               CHANGE=CHANGE/ABS(CHANGE)
  39.            END WHERE
  40.            VEL(:,I)=VEL(:,I)+CHANGE
  41.            VEL(:,J)=VEL(:,J)-CHANGE
  42.         END DO
  43.      END DO
  44.      POS=POS+VEL
  45.      DO I=1,3
  46.         IF(DONE(I))CYCLE
  47.         IF(ALL(POS(I,:).EQ.POS2(I,:)).AND.ALL(VEL(I,:).EQ.VEL2(I,:)))THEN
  48.            P2(I)=STEPS
  49.            DONE(I)=.TRUE.
  50.         END IF
  51.      END DO
  52.      IF(STEPS.EQ.1000)THEN
  53.         WRITE(*,'("Part 1: ",I0)') SUM((/(SUM(ABS(POS(:,I)))*SUM(ABS(VEL(:,I))),I=1,3)/))
  54.      END IF
  55.      IF(STEPS.GE.1000.AND.ALL(DONE))EXIT
  56.   END DO
  57.  
  58.   PART2=P2(1)
  59.   DO I=2,3
  60.      PART2=PART2*(P2(I)/GCD(PART2,P2(I)))
  61.   END DO
  62.   WRITE(*,'("Part 2: ",I0)') PART2
  63.  
  64. CONTAINS
  65.   FUNCTION GCD(A,B) RESULT(C)
  66.     INTEGER(8) A,B,C,D
  67.     C=A
  68.     D=B
  69.     DO
  70.        IF(C.EQ.D)EXIT
  71.        IF(C>D)THEN
  72.           C=C-D
  73.        ELSE
  74.           D=D-C
  75.        END IF
  76.     END DO
  77.   END FUNCTION GCD
  78.  
  79. END PROGRAM DAY12
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement