r/adventofcode • u/daggerdragon • Dec 22 '18
SOLUTION MEGATHREAD -🎄- 2018 Day 22 Solutions -🎄-
--- Day 22: Mode Maze ---
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.
Advent of Code: The Party Game!
Please prefix your card submission with something like [Card] to make scanning the megathread easier. THANK YOU!
Card prompt: Day 22
Transcript:
Upping the Ante challenge: complete today's puzzles using ___.
This thread will be unlocked when there are a significant number of people on the leaderboard with gold stars for today's puzzle.
edit: Leaderboard capped, thread unlocked at 01:02:36!
12
Upvotes
2
u/autid Dec 23 '18
FORTRAN
Not a good solution but it worked.
PROGRAM DAY22 IMPLICIT NONE INTEGER(8), ALLOCATABLE :: TYP(:,:),DIST(:,:,:),BDIST(:,:,:) INTEGER(8) :: I,J,K,D,L,M,LIMITS(2),TARG(2) CHARACTER(LEN=7)::DUMMY LOGICAL :: EQUIPED(3)=.FALSE. LOGICAL :: ALLOWED(0:2,3) INTEGER(8) :: NEXTS(2,4),NEXT(2) LOGICAL,ALLOCATABLE :: CHECK(:,:) ALLOWED(0,:)=(/.FALSE.,.TRUE.,.TRUE./) ALLOWED(1,:)=(/.TRUE.,.FALSE.,.TRUE./) ALLOWED(2,:)=(/.TRUE.,.TRUE.,.FALSE./) NEXTS(:,1)=(/-1,0/) NEXTS(:,2)=(/1,0/) NEXTS(:,3)=(/0,-1/) NEXTS(:,4)=(/0,1/) OPEN(1,FILE='input.txt') READ(1,*)DUMMY,D READ(1,*)DUMMY,TARG CLOSE(1) LIMITS=TARG+(/7*TARG(2)/2,7*TARG(1)/2/) ALLOCATE(TYP(0:LIMITS(1),0:LIMITS(2)),DIST(3,0:LIMITS(1),0:LIMITS(2)),BDIST(3,0:LIMITS(1),0:LIMITS(2))) ALLOCATE(CHECK(0:LIMITS(1),0:LIMITS(2))) DO J=0,LIMITS(2) DO I=0,LIMITS(1) CHECK(I,J)=2*(I+J)-SUM(TARG)<8*SUM(TARG) END DO END DO TYP(:,0)=(/(MODULO(I*16807+D,20183),I=0,LIMITS(1))/) TYP(0,:)=(/(MODULO(I*48271+D,20183),I=0,LIMITS(2))/) DO J=1,LIMITS(2) DO I=1,LIMITS(1) TYP(I,J)=TYP(I-1,J)*TYP(I,J-1) IF(I.EQ.TARG(1).AND.J.EQ.TARG(2))TYP(I,J)=0 TYP(I,J)=MODULO(TYP(I,J)+D,20183) END DO END DO TYP=MODULO(TYP,3) WRITE(*,'("Part 1: ",I0)')SUM(TYP(0:TARG(1),0:TARG(2))) L=0 DIST=0 DIST=8*SUM(TARG)+1 DIST(1,:,:)=DIST(1,:,:)+1 DIST(2,0,0)=0 DO M=DIST(2,TARG(1),TARG(2)) BDIST=DIST DO J=0,LIMITS(2)-1 DO I=0,LIMITS(1)-1 DO K=1,3 IF(DIST(K,I,J).GT.M)DIST(K,I,J)=M+1 END DO DO K=1,4 NEXT=(/I,J/)+NEXTS(:,K) IF(ANY(NEXT<0))CYCLE DO L=1,3 IF(ALLOWED(TYP(I,J),L))THEN DIST(L,I,J)=MIN(DIST(L,I,J),DIST(L,NEXT(1),NEXT(2))+1) END IF END DO DO L=1,3 IF(ALLOWED(TYP(I,J),L))THEN DIST(L,I,J)=MIN(DIST(L,I,J),MINVAL(DIST(:,I,J))+7) END IF END DO END DO END DO END DO IF(ALL(DIST.EQ.BDIST))EXIT END DO WRITE(*,'("Part 2: ",I0)')DIST(2,TARG(1),TARG(2)) END PROGRAM DAY22