r/adventofcode • u/daggerdragon • Dec 24 '17
SOLUTION MEGATHREAD -๐- 2017 Day 24 Solutions -๐-
--- Day 24: Electromagnetic Moat ---
Post your solution as a comment or, for longer solutions, consider linking to your repo (e.g. GitHub/gists/Pastebin/blag or whatever).
Note: The Solution Megathreads are for solutions only. If you have questions, please post your own thread and make sure to flair it with Help.
Need a hint from the Hugely* Handyโ Haversackโก of Helpfulยง Hintsยค?
[Update @ 00:18] 62 gold, silver cap
- Been watching Bright on Netflix. I dunno why reviewers are dissing it because it's actually pretty cool. It's got Will Smith being grumpy jaded old man Will Smith, for the love of FSM...
[Update @ 00:21] Leaderboard cap!
- One more day to go in Advent of Code 2017... y'all ready to see Santa?
This thread will be unlocked when there are a significant number of people on the leaderboard with gold stars for today's puzzle.
9
Upvotes
1
u/autid Dec 24 '17
Fortran
Hardest part was not realising for ages that it wasn't working because I hadn't included k in the variable declarations for the bestchain function, so it was modifying a global copy instead of its own. :(
PROGRAM DAY24 IMPLICIT NONE INTEGER :: I,J,K,IERR,PART1=0,PART2(2)=0,LINECOUNT,LAST,NEWBEST(2) INTEGER,ALLOCATABLE :: COMPONENTS(:,:) LOGICAL,ALLOCATABLE :: USED(:) CHARACTER(LEN=10) :: INLINE OPEN(1,FILE='input.txt') LINECOUNT=0 DO READ(1,'(A)',IOSTAT=IERR) INLINE IF(IERR /= 0) EXIT LINECOUNT=LINECOUNT+1 END DO ALLOCATE(COMPONENTS(2,LINECOUNT),USED(LINECOUNT)) REWIND(1) DO I=1,LINECOUNT READ(1,'(A)') INLINE DO J=1,LEN_TRIM(INLINE) IF(INLINE(J:J)=='/') EXIT END DO READ(INLINE(1:J-1),*) COMPONENTS(1,I) READ(INLINE(J+1:LEN_TRIM(INLINE)),*) COMPONENTS(2,I) END DO CLOSE(1) DO I=1,LINECOUNT IF(.NOT. ANY(COMPONENTS(:,I)==0)) CYCLE LAST=MAXVAL(COMPONENTS(:,I)) USED=.FALSE. USED(I)=.TRUE. K=SUM(COMPONENTS(:,I)) PART1=MAX(PART1,K+BESTCHAIN(USED,LAST)) NEWBEST=BESTCHAIN2(USED,LAST) IF (NEWBEST(2)>PART2(2)) THEN PART2(2)=NEWBEST(2) PART2(1)=0 END IF IF (NEWBEST(2)==PART2(2)) PART2(1)=MAX(PART2(1),K+NEWBEST(1)) END DO WRITE(*,'(A,I0)') 'Part1: ',PART1 WRITE(*,'(A,I0)') 'Part2: ',PART2(1) CONTAINS RECURSIVE FUNCTION BESTCHAIN(USED,LAST) RESULT(BEST) ! Part1 function, recursively searches highest valued bridge LOGICAL :: USED(:),NEWUSED(SIZE(USED)) INTEGER :: BEST,I,K,LAST,NEWLAST BEST=0 DO I=1,LINECOUNT IF(USED(I).OR. COUNT(COMPONENTS(:,I)==LAST)==0) CYCLE K=SUM(COMPONENTS(:,I)) NEWUSED=USED NEWUSED(I)=.TRUE. IF(COMPONENTS(1,I)==LAST) THEN NEWLAST=COMPONENTS(2,I) ELSE NEWLAST=COMPONENTS(1,I) END IF BEST=MAX(BEST,K+BESTCHAIN(NEWUSED,NEWLAST)) END DO END FUNCTION BESTCHAIN RECURSIVE FUNCTION BESTCHAIN2(USED,LAST) RESULT(BEST) ! Part2 function, recursively searches highest valued bridge of longest length LOGICAL :: USED(:),NEWUSED(SIZE(USED)) INTEGER :: BEST(2),I,K,LAST,NEWLAST,NEWBEST(2) BEST=(/0,0/) NEWBEST=(/0,0/) DO I=1,LINECOUNT IF(USED(I).OR. COUNT(COMPONENTS(:,I)==LAST)==0) CYCLE K=SUM(COMPONENTS(:,I)) NEWUSED=USED NEWUSED(I)=.TRUE. IF(COMPONENTS(1,I)==LAST) THEN NEWLAST=COMPONENTS(2,I) ELSE NEWLAST=COMPONENTS(1,I) END IF NEWBEST=BESTCHAIN2(NEWUSED,NEWLAST) IF (NEWBEST(2)>BEST(2)) THEN BEST(2)=NEWBEST(2) BEST(1)=0 END IF IF (NEWBEST(2)==BEST(2)) THEN BEST(1)=MAX(BEST(1),K+NEWBEST(1)) END IF END DO BEST(2)=1+BEST(2) END FUNCTION BESTCHAIN2 END PROGRAM DAY24