Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- PROGRAM DAY8
- IMPLICIT NONE
- INTEGER :: IERR,P1=0,P2=0
- CHARACTER(LEN=9) :: A(15)
- OPEN(1,FILE="input.txt")
- DO
- READ(1,*,IOSTAT=IERR) A
- IF(IERR.NE.0) EXIT
- P1=P1+COUNT(LEN_TRIM(A(12:15)).EQ.2)
- P1=P1+COUNT(LEN_TRIM(A(12:15)).EQ.4)
- P1=P1+COUNT(LEN_TRIM(A(12:15)).EQ.3)
- P1=P1+COUNT(LEN_TRIM(A(12:15)).EQ.7)
- P2=P2+DECODE((/ A(1:10), A(12:15) /))
- END DO
- CLOSE(1)
- WRITE(*,'(A,I0)') "Part 1: ", P1
- WRITE(*,'(A,I0)') "Part 2: ", P2
- CONTAINS
- FUNCTION DECODE(IN) RESULT(TOTAL)
- CHARACTER(LEN=9) :: IN(14)
- LOGICAL :: MAPS(IACHAR("a"):IACHAR("g"),7),SAV(7),DGT(7)
- INTEGER :: I,J,K, TOTAL
- INTEGER :: TENS(4) = (/1000,100,10,1/), DIGITS(11:14)
- MAPS = .TRUE.
- DO I=1,14
- IF(LEN_TRIM(IN(I)).EQ.2) THEN
- DO J=1,2
- K=IACHAR(IN(I)(J:J))
- SAV=MAPS(K,:)
- MAPS(K,:) = .FALSE.
- MAPS(K,3) = SAV(3)
- MAPS(K,6) = SAV(6)
- END DO
- ELSE IF(LEN_TRIM(IN(I)).EQ.3) THEN
- DO J=1,3
- K=IACHAR(IN(I)(J:J))
- SAV=MAPS(K,:)
- MAPS(K,:) = .FALSE.
- MAPS(K,1) = SAV(1)
- MAPS(K,3) = SAV(3)
- MAPS(K,6) = SAV(6)
- END DO
- ELSE IF(LEN_TRIM(IN(I)).EQ.4) THEN
- DO J=1,4
- K=IACHAR(IN(I)(J:J))
- SAV=MAPS(K,:)
- MAPS(K,:) = .FALSE.
- MAPS(K,2) = SAV(2)
- MAPS(K,3) = SAV(3)
- MAPS(K,4) = SAV(4)
- MAPS(K,6) = SAV(6)
- END DO
- ELSE IF(LEN_TRIM(IN(I)).EQ.5) THEN
- DO K=IACHAR("a"),IACHAR("g")
- IF(SCAN(IN(I),ACHAR(K)).EQ.0) THEN
- SAV=MAPS(K,:)
- MAPS(K,:) = .FALSE.
- MAPS(K,2) = SAV(2)
- MAPS(K,3) = SAV(3)
- MAPS(K,5) = SAV(5)
- MAPS(K,6) = SAV(6)
- END IF
- END DO
- ELSE IF(LEN_TRIM(IN(I)).EQ.6) THEN
- DO K=IACHAR("a"),IACHAR("g")
- IF(SCAN(IN(I),ACHAR(K)).EQ.0) THEN
- SAV=MAPS(K,:)
- MAPS(K,:) = .FALSE.
- MAPS(K,3) = SAV(3)
- MAPS(K,4) = SAV(4)
- MAPS(K,5) = SAV(5)
- END IF
- END DO
- END IF
- DO J=IACHAR("a"),IACHAR("g")
- DO K=1,7
- IF(MAPS(J,K)) THEN
- IF(COUNT(MAPS(J,:)).EQ.1 .OR. COUNT(MAPS(:,K)).EQ.1) THEN
- MAPS(J,:) = .FALSE.
- MAPS(:,K) = .FALSE.
- MAPS(J,K) = .TRUE.
- END IF
- END IF
- END DO
- END DO
- IF(COUNT(MAPS).EQ.7) EXIT
- END DO
- DO I=11,14
- DGT=.FALSE.
- K=8
- DO J=1,LEN_TRIM(IN(I))
- DGT=DGT.OR.MAPS(IACHAR(IN(I)(J:J)),:)
- END DO
- SELECT CASE (COUNT(DGT))
- CASE (2)
- K=1
- CASE (3)
- K=7
- CASE (4)
- K=4
- CASE (5)
- IF(DGT(3).AND.DGT(6))K=3
- IF(DGT(2)) K=5
- IF(DGT(5)) K=2
- CASE(6)
- IF(.NOT.DGT(4)) K=0
- IF(.NOT.DGT(3)) K=6
- IF(.NOT.DGT(5)) K=9
- END SELECT
- DIGITS(I) = K
- END DO
- TOTAL=SUM(TENS*DIGITS)
- END FUNCTION DECODE
- END PROGRAM DAY8
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement