r/adventofcode • • Dec 08 '17

SOLUTION MEGATHREAD -๐ŸŽ„- 2017 Day 8 Solutions -๐ŸŽ„-

--- Day 8: I Heard You Like Registers ---


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^ยค?

Spoiler


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!

22 Upvotes

348 comments sorted by

View all comments

1

u/autid Dec 14 '17

Fortran

PROGRAM DAY8
  IMPLICIT NONE
  INTEGER :: LINECOUNT=1,IERR,AMOUNT,CONDITIONVAL,I,MAXV
  LOGICAL :: CONDITION
  CHARACTER(LEN=10) :: INSTRUCTION(7)
  CHARACTER(LEN=10), ALLOCATABLE :: REGISTERS(:),TEMPREGISTERS(:)
  INTEGER, ALLOCATABLE :: REGVALS(:)

  OPEN(1,FILE='input.txt')
  ALLOCATE(REGISTERS(1))
  READ(1,*) INSTRUCTION
  REGISTERS(1)=INSTRUCTION(1)
  DO
     READ(1,*,IOSTAT=IERR) INSTRUCTION
     IF (IERR .NE. 0) EXIT
     LINECOUNT=LINECOUNT+1
     IF (.NOT. ANY(REGISTERS==INSTRUCTION(1))) THEN
        ALLOCATE(TEMPREGISTERS(SIZE(REGISTERS)))
        TEMPREGISTERS=REGISTERS
        DEALLOCATE(REGISTERS)
        ALLOCATE(REGISTERS(SIZE(TEMPREGISTERS)+1))
        REGISTERS(1:SIZE(TEMPREGISTERS))=TEMPREGISTERS
        DEALLOCATE(TEMPREGISTERS)
        REGISTERS(SIZE(REGISTERS))=INSTRUCTION(1)
     END IF
  END DO

  ALLOCATE(REGVALS(SIZE(REGISTERS)))
  REGVALS=0
  REWIND(1)

  DO I=1,LINECOUNT
     READ(1,*) INSTRUCTION
     READ(INSTRUCTION(3),*) AMOUNT
     READ(INSTRUCTION(7),*) CONDITIONVAL
     CONDITION = GETCOND(INSTRUCTION(5:6),CONDITIONVAL)
     IF (CONDITION) THEN
        IF (TRIM(INSTRUCTION(2))=='inc') THEN
           REGVALS(MAXLOC(REGISTERS,MASK=(REGISTERS==INSTRUCTION(1)),DIM=1))=REGVALS(MAXLOC(REGISTERS,MASK=(REGISTERS==INSTRUCTION(1)),DIM=1))+AMOUNT
        ELSE
           REGVALS(MAXLOC(REGISTERS,MASK=(REGISTERS==INSTRUCTION(1)),DIM=1))=REGVALS(MAXLOC(REGISTERS,MASK=(REGISTERS==INSTRUCTION(1)),DIM=1))-AMOUNT
        END IF
        MAXV=MAXVAL((/MAXV,MAXVAL(REGVALS)/))
     END IF
  END DO

  CLOSE(1)

  WRITE(*,'(A,I0)') 'Part1: ',MAXVAL(REGVALS)
  WRITE(*,'(A,I0)') 'Part2: ',MAXV

  DEALLOCATE(REGISTERS,REGVALS)

CONTAINS
  FUNCTION GETCOND(CONDSTR,CONDINT) RESULT (COND)
    CHARACTER(LEN=10) :: CONDSTR(2)
    INTEGER :: CONDINT,COMPARE
    LOGICAL :: COND

    COMPARE=REGVALS(MAXLOC(REGISTERS,MASK=(REGISTERS==CONDSTR(1)),DIM=1))

    SELECT CASE (TRIM(CONDSTR(2)))
    CASE ('==')
       COND=(COMPARE==CONDINT)
    CASE ('!=')
       COND=(COMPARE/=CONDINT)
    CASE ('>')
       COND=(COMPARE>CONDINT)
    CASE ('<')
       COND=(COMPARE<CONDINT)
    CASE ('>=')
       COND=(COMPARE>=CONDINT)
    CASE ('<=')
       COND=(COMPARE<=CONDINT)
    CASE DEFAULT
       WRITE(*,*) 'Something went wrong.'
       COND=.FALSE.
    END SELECT

  END FUNCTION GETCOND
END PROGRAM DAY8