Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- PROGRAM DAY24
- IMPLICIT NONE
- TYPE GROUP
- INTEGER :: INITIATIVE,HEALTH,NUMBER,DAMAGE
- CHARACTER(LEN=20) :: DAMAGETYPE
- LOGICAL :: WEAK(5)=.FALSE.,IMMUNE(5)=.FALSE.
- END TYPE GROUP
- TYPE(GROUP), ALLOCATABLE :: IMMUNE(:),INFECTION(:)
- INTEGER, ALLOCATABLE :: IMTARGETS(:),IMEFFECTIVE(:),INTARGETS(:),INEFFECTIVE(:),ORDER(:),IMDAMAGE(:),INDAMAGE(:)
- INTEGER, ALLOCATABLE :: IMNUMBERS(:),INNUMBERS(:),BIMNUMBERS(:),BINNUMBERS(:)
- LOGICAL,ALLOCATABLE :: ORDERTYPE(:),IMCHOSEN(:),INCHOSEN(:)
- INTEGER :: I,J,K,L,M,N,O,IERR,BOOST
- CHARACTER(LEN=500) :: INLINE,THING
- CHARACTER(LEN=20) :: TYPES(5)=(/'bludgeoning','slashing','radiation','cold','fire'/)
- OPEN(1,FILE='input.txt')
- M=0
- READ(1,'(A)')INLINE
- DO
- READ(1,'(A)')INLINE
- IF(TRIM(INLINE).EQ.'')EXIT
- M=M+1
- END DO
- N=0
- READ(1,'(A)')INLINE
- DO
- READ(1,'(A)',IOSTAT=IERR)INLINE
- IF(IERR.NE.0)EXIT
- N=N+1
- END DO
- ALLOCATE(IMMUNE(M),INFECTION(N))
- ALLOCATE(IMTARGETS(M),IMEFFECTIVE(M),INTARGETS(N),INEFFECTIVE(N),ORDER(M+N),ORDERTYPE(M+N),IMDAMAGE(N),INDAMAGE(M))
- ALLOCATE(IMCHOSEN(M),INCHOSEN(N),IMNUMBERS(M),INNUMBERS(N),BIMNUMBERS(M),BINNUMBERS(N))
- REWIND(1)
- READ(1,'(A)')INLINE
- DO I=1,M
- READ(1,'(A)')INLINE
- J=SCAN(INLINE,' ')
- READ(INLINE(1:J-1),*)IMMUNE(I)%NUMBER
- IMNUMBERS(I)=IMMUNE(I)%NUMBER
- DO L=1,3
- J=J+SCAN(INLINE(J+1:LEN_TRIM(INLINE)),' ')
- END DO
- K=J+SCAN(INLINE(J+1:LEN_TRIM(INLINE)),' ')
- READ(INLINE(J+1:K-1),*)IMMUNE(I)%HEALTH
- IF(SCAN(INLINE,'(').NE.0)THEN
- J=SCAN(INLINE,'(')
- DO
- K=J+SCAN(INLINE(J+1:LEN_TRIM(INLINE)),' ')
- THING=INLINE(J+1:K-1)
- IF(TRIM(THING).EQ.'immune')THEN
- J=K+SCAN(INLINE(K+1:LEN_TRIM(INLINE)),' ')
- DO
- K=J+SCAN(INLINE(J+1:LEN_TRIM(INLINE)),' ')
- THING=INLINE(J+1:K-2)
- IMMUNE(I)%IMMUNE=IMMUNE(I)%IMMUNE.OR.((/(TRIM(TYPES(I)).EQ.THING,I=1,5)/))
- J=K
- IF(SCAN(INLINE(K-1:K-1),';)').NE.0)EXIT
- END DO
- ELSE
- J=K+SCAN(INLINE(K+1:LEN_TRIM(INLINE)),' ')
- DO
- K=J+SCAN(INLINE(J+1:LEN_TRIM(INLINE)),' ')
- THING=INLINE(J+1:K-2)
- IMMUNE(I)%WEAK=IMMUNE(I)%WEAK.OR.((/(TRIM(TYPES(I)).EQ.THING,I=1,5)/))
- J=K
- IF(SCAN(INLINE(K-1:K-1),';)').NE.0)EXIT
- END DO
- END IF
- IF(INLINE(J-1:J-1).EQ.')')EXIT
- END DO
- END IF
- J=SCAN(TRIM(INLINE),' ',.TRUE.)
- READ(INLINE(J+1:LEN_TRIM(INLINE)),*)IMMUNE(I)%INITIATIVE
- DO L=1,4
- J=SCAN(INLINE(1:J-1),' ',.TRUE.)
- END DO
- K=J+SCAN(INLINE(J+1:LEN_TRIM(INLINE)),' ')
- READ(INLINE(J+1:K-1),'(A)')IMMUNE(I)%DAMAGETYPE
- K=SCAN(INLINE(1:J-1),' ',.TRUE.)
- READ(INLINE(K+1:J-1),*)IMMUNE(I)%DAMAGE
- END DO
- READ(1,'(A)')INLINE
- READ(1,'(A)')INLINE
- DO I=1,N
- READ(1,'(A)')INLINE
- J=SCAN(INLINE,' ')
- READ(INLINE(1:J-1),*)INFECTION(I)%NUMBER
- INNUMBERS(I)=INFECTION(I)%NUMBER
- DO L=1,3
- J=J+SCAN(INLINE(J+1:LEN_TRIM(INLINE)),' ')
- END DO
- K=J+SCAN(INLINE(J+1:LEN_TRIM(INLINE)),' ')
- READ(INLINE(J+1:K-1),*)INFECTION(I)%HEALTH
- IF(SCAN(INLINE,'(').NE.0)THEN
- J=SCAN(INLINE,'(')
- DO
- K=J+SCAN(INLINE(J+1:LEN_TRIM(INLINE)),' ')
- THING=INLINE(J+1:K-1)
- IF(TRIM(THING).EQ.'immune')THEN
- J=K+SCAN(INLINE(K+1:LEN_TRIM(INLINE)),' ')
- DO
- K=J+SCAN(INLINE(J+1:LEN_TRIM(INLINE)),' ')
- THING=INLINE(J+1:K-2)
- INFECTION(I)%IMMUNE=INFECTION(I)%IMMUNE.OR.((/(TRIM(TYPES(I)).EQ.THING,I=1,5)/))
- J=K
- IF(SCAN(INLINE(K-1:K-1),';)').NE.0)EXIT
- END DO
- ELSE
- J=K+SCAN(INLINE(K+1:LEN_TRIM(INLINE)),' ')
- DO
- K=J+SCAN(INLINE(J+1:LEN_TRIM(INLINE)),' ')
- THING=INLINE(J+1:K-2)
- INFECTION(I)%WEAK=INFECTION(I)%WEAK.OR.((/(TRIM(TYPES(I)).EQ.THING,I=1,5)/))
- J=K
- IF(SCAN(INLINE(K-1:K-1),';)').NE.0)EXIT
- END DO
- END IF
- IF(INLINE(J-1:J-1).EQ.')')EXIT
- END DO
- END IF
- J=SCAN(TRIM(INLINE),' ',.TRUE.)
- READ(INLINE(J+1:LEN_TRIM(INLINE)),*)INFECTION(I)%INITIATIVE
- DO L=1,4
- J=SCAN(INLINE(1:J-1),' ',.TRUE.)
- END DO
- K=J+SCAN(INLINE(J+1:LEN_TRIM(INLINE)),' ')
- READ(INLINE(J+1:K-1),'(A)')INFECTION(I)%DAMAGETYPE
- K=SCAN(INLINE(1:J-1),' ',.TRUE.)
- READ(INLINE(K+1:J-1),*)INFECTION(I)%DAMAGE
- END DO
- CLOSE(1)
- J=1
- IMEFFECTIVE=IMMUNE%INITIATIVE
- INEFFECTIVE=INFECTION%INITIATIVE
- IMCHOSEN=.TRUE.
- INCHOSEN=.TRUE.
- ORDER=0
- DO
- K=MAXVAL((/IMEFFECTIVE,INEFFECTIVE/),MASK=(/IMCHOSEN,INCHOSEN/))
- IF(ANY(IMEFFECTIVE.EQ.K))THEN
- ORDERTYPE(J)=.TRUE.
- ORDER(J)=MAXLOC(IMEFFECTIVE,MASK=IMEFFECTIVE.EQ.K,DIM=1)
- IMCHOSEN(ORDER(J))=.FALSE.
- ELSE
- ORDERTYPE(J)=.FALSE.
- ORDER(J)=MAXLOC(INEFFECTIVE,MASK=INEFFECTIVE.EQ.K,DIM=1)
- INCHOSEN(ORDER(J))=.FALSE.
- END IF
- J=J+1
- IF(J.GT.M+N)EXIT
- END DO
- BOOST=-1
- OUTER:DO
- BOOST=BOOST+1
- IMMUNE%NUMBER=IMNUMBERS
- INFECTION%NUMBER=INNUMBERS
- DO
- BIMNUMBERS=IMMUNE%NUMBER
- BINNUMBERS=INFECTION%NUMBER
- IF(ALL(IMMUNE%NUMBER.EQ.0).OR.ALL(INFECTION%NUMBER.EQ.0))EXIT
- IMEFFECTIVE=IMMUNE%NUMBER*(IMMUNE%DAMAGE+BOOST)*1000+IMMUNE%INITIATIVE
- INEFFECTIVE=INFECTION%NUMBER*INFECTION%DAMAGE*1000+INFECTION%INITIATIVE
- IMCHOSEN=.FALSE.
- INCHOSEN=.FALSE.
- IMTARGETS=0
- K=MAXVAL(IMEFFECTIVE)+1
- DO
- IF(K.EQ.MINVAL(IMEFFECTIVE))EXIT
- IF(MAXVAL(IMEFFECTIVE,MASK=IMEFFECTIVE<K).LT.1000)EXIT
- J=MAXLOC(IMEFFECTIVE,MASK=IMEFFECTIVE<K,DIM=1)
- K=IMEFFECTIVE(J)
- IMDAMAGE=0
- DO I=1,N
- IF(INCHOSEN(I))CYCLE
- IF(INFECTION(I)%NUMBER.EQ.0)CYCLE
- IF(ANY(INFECTION(I)%IMMUNE.AND.((/(TRIM(TYPES(L)).EQ.TRIM(IMMUNE(J)%DAMAGETYPE),L=1,5)/))))CYCLE
- IMDAMAGE(I)=IMMUNE(J)%NUMBER*(IMMUNE(J)%DAMAGE+BOOST)
- IF(COUNT(INFECTION(I)%WEAK.AND.(/(TRIM(TYPES(L)).EQ.TRIM(IMMUNE(J)%DAMAGETYPE),L=1,5)/)).GT.0)THEN
- IMDAMAGE(I)=IMDAMAGE(I)*2
- END IF
- END DO
- IF(MAXVAL(IMDAMAGE).EQ.0)CYCLE
- IMTARGETS(J)=MAXLOC(INEFFECTIVE,MASK=IMDAMAGE.EQ.MAXVAL(IMDAMAGE),DIM=1)
- INCHOSEN(IMTARGETS(J))=.TRUE.
- END DO
- INTARGETS=0
- K=MAXVAL(INEFFECTIVE)+1
- DO
- IF(K.EQ.MINVAL(INEFFECTIVE))EXIT
- IF(MAXVAL(INEFFECTIVE,MASK=INEFFECTIVE<K).LT.1000)EXIT
- J=MAXLOC(INEFFECTIVE,MASK=INEFFECTIVE<K,DIM=1)
- K=INEFFECTIVE(J)
- INDAMAGE=0
- DO I=1,M
- IF(IMCHOSEN(I))CYCLE
- IF(IMMUNE(I)%NUMBER.EQ.0)CYCLE
- IF(ANY(IMMUNE(I)%IMMUNE.AND.((/(TRIM(TYPES(L)).EQ.TRIM(INFECTION(J)%DAMAGETYPE),L=1,5)/))))CYCLE
- INDAMAGE(I)=INFECTION(J)%NUMBER*INFECTION(J)%DAMAGE
- IF(COUNT(IMMUNE(I)%WEAK.AND.(/(TRIM(TYPES(L)).EQ.TRIM(INFECTION(J)%DAMAGETYPE),L=1,5)/)).GT.0)THEN
- INDAMAGE(I)=INDAMAGE(I)*2
- END IF
- END DO
- IF(MAXVAL(INDAMAGE).EQ.0)CYCLE
- INTARGETS(J)=MAXLOC(IMEFFECTIVE,MASK=INDAMAGE.EQ.MAXVAL(INDAMAGE),DIM=1)
- IMCHOSEN(INTARGETS(J))=.TRUE.
- END DO
- DO I=1,M+N
- IF(ORDERTYPE(I))THEN
- IF(IMTARGETS(ORDER(I)).EQ.0)CYCLE
- J=ORDER(I)
- IF(IMMUNE(J)%NUMBER.EQ.0)CYCLE
- L=IMMUNE(J)%NUMBER*(IMMUNE(J)%DAMAGE+BOOST)
- K=IMTARGETS(J)
- IF(ANY(INFECTION(K)%WEAK.AND.(/(TRIM(TYPES(O)).EQ.TRIM(IMMUNE(J)%DAMAGETYPE),O=1,5)/)))THEN
- L=L*2
- END IF
- INFECTION(K)%NUMBER=MAX(0,INFECTION(K)%NUMBER-L/INFECTION(K)%HEALTH)
- ELSE
- IF(INTARGETS(ORDER(I)).EQ.0)CYCLE
- J=ORDER(I)
- IF(INFECTION(J)%NUMBER.EQ.0)EXIT
- L=INFECTION(J)%NUMBER*INFECTION(J)%DAMAGE
- K=INTARGETS(J)
- IF(ANY(IMMUNE(K)%WEAK.AND.(/(TRIM(TYPES(O)).EQ.TRIM(INFECTION(J)%DAMAGETYPE),O=1,5)/)))THEN
- L=L*2
- END IF
- IMMUNE(K)%NUMBER=MAX(0,IMMUNE(K)%NUMBER-L/IMMUNE(K)%HEALTH)
- END IF
- END DO
- IF(ALL(BIMNUMBERS.EQ.IMMUNE%NUMBER).AND.ALL(BINNUMBERS.EQ.INFECTION%NUMBER))CYCLE OUTER
- END DO
- IF(BOOST.EQ.0)WRITE(*,'("Part 1: ",I0)')MAX(SUM(INFECTION%NUMBER),SUM(IMMUNE%NUMBER))
- IF(SUM(IMMUNE%NUMBER).GT.0)EXIT OUTER
- END DO OUTER
- WRITE(*,'("Part 2: ",I0)')SUM(IMMUNE%NUMBER)
- END PROGRAM DAY24
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement