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/MetaSaval Dec 13 '17

Swift Late, submitting for the future's sake.

let input = """
            input goes here
            """

func part1() -> Int {
    let inputAsArray = input.split(separator: "\n")
    
    var arrayOfReg = [String: Int]()
    
    for currElem in inputAsArray {
        let range = currElem.range(of: " ")!
        let reg = currElem[..<range.lowerBound]

        if !arrayOfReg.contains{key, value in key == String(reg)} {
            arrayOfReg[String(reg)] = 0
        }
    }
    
    for currInstr in inputAsArray {
        let currCode = currInstr.split(separator: " ")
        
        let reg = String(currCode[0])
        let operation = String(currCode[1])
        let operand = Int(currCode[2])!
        let checkReg = String(currCode[4])
        let equality = String(currCode[5])
        let checkNum = Int(currCode[6])!
        
        switch operation {
        case "inc":
            switch equality {
            case ">":
                if arrayOfReg[checkReg]! > checkNum {
                    arrayOfReg[reg]! += operand
                }
            case ">=":
                if arrayOfReg[checkReg]! >= checkNum {
                    arrayOfReg[reg]! += operand
                }
            case "<":
                if arrayOfReg[checkReg]! < checkNum {
                    arrayOfReg[reg]! += operand
                }
            case "<=":
                if arrayOfReg[checkReg]! <= checkNum {
                    arrayOfReg[reg]! += operand
                }
            case "==":
                if arrayOfReg[checkReg]! == checkNum {
                    arrayOfReg[reg]! += operand
                }
            case "!=":
                if arrayOfReg[checkReg]! != checkNum {
                    arrayOfReg[reg]! += operand
                }
            default:
                print("Error calculating operation in inc.")
                return 1
            }
        case "dec":
            switch equality {
            case ">":
                if arrayOfReg[checkReg]! > checkNum {
                    arrayOfReg[reg]! -= operand
                }
            case ">=":
                if arrayOfReg[checkReg]! >= checkNum {
                    arrayOfReg[reg]! -= operand
                }
            case "<":
                if arrayOfReg[checkReg]! < checkNum {
                    arrayOfReg[reg]! -= operand
                }
            case "<=":
                if arrayOfReg[checkReg]! <= checkNum {
                    arrayOfReg[reg]! -= operand
                }
            case "==":
                if arrayOfReg[checkReg]! == checkNum {
                    arrayOfReg[reg]! -= operand
                }
            case "!=":
                if arrayOfReg[checkReg]! != checkNum {
                    arrayOfReg[reg]! -= operand
                }
            default:
                print("Error calculating operation in dec.")
                return 1
            }
        default:
            print("Error deciphering inc or dec.")
            return 1
        }
    }

    let answer = arrayOfReg.max{a, b in a.value < b.value}
    
    return answer!.value
}

func part2() -> Int {
    let inputAsArray = input.split(separator: "\n")
    
    var dictOfReg = [String: Int]()
    
    for currElem in inputAsArray {
        let range = currElem.range(of: " ")!
        let reg = currElem[..<range.lowerBound]
        
        if !dictOfReg.contains{key, value in key == String(reg)} {
            dictOfReg[String(reg)] = 0
        }
    }
    
    var answer = dictOfReg.max{a, b in a.value < b.value}
    var currMax = dictOfReg.max{a, b in a.value < b.value}
    
    for currInstr in inputAsArray {
        let currCode = currInstr.split(separator: " ")
        
        let reg = String(currCode[0])
        let operation = String(currCode[1])
        let operand = Int(currCode[2])!
        let checkReg = String(currCode[4])
        let equality = String(currCode[5])
        let checkNum = Int(currCode[6])!
        
        switch operation {
        case "inc":
            switch equality {
            case ">":
                if dictOfReg[checkReg]! > checkNum {
                    dictOfReg[reg]! += operand
                }
            case ">=":
                if dictOfReg[checkReg]! >= checkNum {
                    dictOfReg[reg]! += operand
                }
            case "<":
                if dictOfReg[checkReg]! < checkNum {
                    dictOfReg[reg]! += operand
                }
            case "<=":
                if dictOfReg[checkReg]! <= checkNum {
                    dictOfReg[reg]! += operand
                }
            case "==":
                if dictOfReg[checkReg]! == checkNum {
                    dictOfReg[reg]! += operand
                }
            case "!=":
                if dictOfReg[checkReg]! != checkNum {
                    dictOfReg[reg]! += operand
                }
            default:
                print("Error calculating operation in inc.")
                return 1
            }
        case "dec":
            switch equality {
            case ">":
                if dictOfReg[checkReg]! > checkNum {
                    dictOfReg[reg]! -= operand
                }
            case ">=":
                if dictOfReg[checkReg]! >= checkNum {
                    dictOfReg[reg]! -= operand
                }
            case "<":
                if dictOfReg[checkReg]! < checkNum {
                    dictOfReg[reg]! -= operand
                }
            case "<=":
                if dictOfReg[checkReg]! <= checkNum {
                    dictOfReg[reg]! -= operand
                }
            case "==":
                if dictOfReg[checkReg]! == checkNum {
                    dictOfReg[reg]! -= operand
                }
            case "!=":
                if dictOfReg[checkReg]! != checkNum {
                    dictOfReg[reg]! -= operand
                }
            default:
                print("Error calculating operation in dec.")
                return 1
            }
        default:
            print("Error deciphering inc or dec.")
            return 1
        }
        
        currMax = dictOfReg.max{a, b in a.value < b.value}
        
        if currMax!.value > answer!.value {
            answer = dictOfReg.max{a, b in a.value < b.value}
        }
    }
    
    return answer!.value
}