Skip to content

Instantly share code, notes, and snippets.

@DeepFriedTwinkie
Last active December 14, 2016 22:11
Show Gist options
  • Save DeepFriedTwinkie/56f8e474cb306a3ac68548deafab8a08 to your computer and use it in GitHub Desktop.
Save DeepFriedTwinkie/56f8e474cb306a3ac68548deafab8a08 to your computer and use it in GitHub Desktop.
AdventOfCode.com 2016 Day 2 Solution (http://adventofcode.com/2016/day/2) (Part 2)
import Foundation
enum Instruction:String {
case up = "U"
case down = "D"
case left = "L"
case right = "R"
}
extension Int {
func nextDigit(withInstruction instruction:Instruction, keypad:[[Int?]]) -> Int {
var rowIdx = -1
var colIdx = -1
// Determine location of digit on keypad
rowLoop: for row in keypad {
rowIdx+=1
colIdx = -1
for digit in row {
colIdx+=1
if digit == self { break rowLoop }
}
}
// Move in the correct direction on the keypad
switch instruction {
case .up:
rowIdx -= 1
case .down:
rowIdx += 1
case .left:
colIdx -= 1
case .right:
colIdx += 1
}
// Moved off the edge of the keypad, or self is not on the keypad
guard rowIdx < keypad.count, rowIdx >= 0,
colIdx < keypad.first!.count, colIdx >= 0 else {
return self
}
return keypad[rowIdx][colIdx] ?? self
}
}
// Day 2:
let testInput = "ULL\nRRDDD\nLURDL\nUUUUD"
let inputString = "LURLLLLLDUULRDDDRLRDDDUDDUULLRLULRURLRRDULUUURDUURLRDRRURUURUDDRDLRRLDDDDLLDURLDUUUDRDDDLULLDDLRLRRRLDLDDDDDLUUUDLUULRDUDLDRRRUDUDDRULURULDRUDLDUUUDLUDURUURRUUDRLDURRULURRURUUDDLRLDDDDRDRLDDLURLRDDLUDRLLRURRURRRURURRLLRLDRDLULLUDLUDRURDLRDUUDDUUDRLUDDLRLUDLLURDRUDDLRURDULLLUDDURULDRLUDLUDLULRRUUDDLDRLLUULDDURLURRRRUUDRUDLLDRUDLRRDUDUUURRULLDLDDRLUURLDUDDRLDRLDULDDURDLUUDRRLDRLLLRRRDLLLLURDLLLUDRUULUULLRLRDLULRLURLURRRDRLLDLDRLLRLULRDDDLUDDLLLRRLLLUURLDRULLDURDLULUDLRLDLUDURLLLURUUUDRRRULRDURLLURRLDLRLDLDRRUUDRDDDDDRDUUDULUL\nRRURLURRULLUDUULUUURURULLDLRLRRULRUDUDDLLLRRRRLRUDUUUUDULUDRULDDUDLURLRRLLDLURLRDLDUULRDLLLDLLULLURLLURURULUDLDUDLUULDDLDRLRRUURRRLLRRLRULRRLDLDLRDULDLLDRRULRDRDUDUUUDUUDDRUUUDDLRDULLULDULUUUDDUULRLDLRLUUUUURDLULDLUUUULLLLRRRLDLLDLUDDULRULLRDURDRDRRRDDDLRDDULDLURLDLUDRRLDDDLULLRULDRULRURDURRUDUUULDRLRRUDDLULDLUULULRDRDULLLDULULDUDLDRLLLRLRURUDLUDDDURDUDDDULDRLUDRDRDRLRDDDDRLDRULLURUDRLLUDRLDDDLRLRDLDDUULRUDRLUULRULRLDLRLLULLUDULRLDRURDD\nUUUUUURRDLLRUDUDURLRDDDURRRRULRLRUURLLLUULRUDLLRUUDURURUDRDLDLDRDUDUDRLUUDUUUDDURRRDRUDDUURDLRDRLDRRULULLLUDRDLLUULURULRULDRDRRLURULLDURUURDDRDLLDDDDULDULUULLRULRLDURLDDLULRLRRRLLURRLDLLULLDULRULLDLRULDDLUDDDLDDURUUUURDLLRURDURDUUDRULDUULLUUULLULLURLRDRLLRULLLLRRRRULDRULLUURLDRLRRDLDDRLRDURDRRDDDRRUDRLUULLLULRDDLDRRLRUDLRRLDULULRRDDURULLRULDUDRLRUUUULURLRLRDDDUUDDULLULLDDUDRLRDDRDRLDUURLRUULUULDUDDURDDLLLURUULLRDLRRDRDDDUDDRDLRRDDUURDUULUDDDDUUDDLULLDRDDLULLUDLDDURRULDUDRRUURRDLRLLDDRRLUUUDDUUDUDDDDDDDLULURRUULURLLUURUDUDDULURDDLRDDRRULLLDRRDLURURLRRRDDLDUUDR\nURLLRULULULULDUULDLLRDUDDRRLRLLLULUDDUDLLLRURLLLLURRLRRDLULRUDDRLRRLLRDLRRULDLULRRRRUUDDRURLRUUDLRRULDDDLRULDURLDURLRLDDULURDDDDULDRLLUDRULRDDLUUUDUDUDDRRUDUURUURLUUULRLULUURURRLRUUULDDLURULRRRRDULUDLDRLLUURRRLLURDLDLLDUDRDRLLUDLDDLRLDLRUDUULDRRLLULDRRULLULURRLDLUUDLUDDRLURDDUDRDUDDDULLDRUDLRDLRDURUULRRDRUUULRUURDURLDUDRDLLRUULUULRDDUDLRDUUUUULDDDDDRRULRURLLRLLUUDLUDDUULDRULDLDUURUDUDLRULULUULLLLRLULUDDDRRLLDRUUDRLDDDRDDURRDDDULURDLDLUDDUULUUURDULDLLULRRUURDDUDRUULDLRLURUDLRDLLLDRLDUURUDUDRLLLDDDULLUDUUULLUUUDLRRRURRRRRDUULLUURRDUU\nUDULUUDLDURRUDDUDRDDRRUULRRULULURRDDRUULDRLDUDDRRRRDLRURLLLRLRRLLLULDURRDLLDUDDULDLURLURUURLLLDUURRUUDLLLUDRUDLDDRLRRDLRLDDDULLRUURUUUDRRDLLLRRULDRURLRDLLUDRLLULRDLDDLLRRUDURULRLRLDRUDDLUUDRLDDRUDULLLURLRDLRUUDRRUUDUDRDDRDRDDLRULULURLRULDRURLURLRDRDUUDUDUULDDRLUUURULRDUDRUDRULUDDULLRDDRRUULRLDDLUUUUDUDLLLDULRRLRDDDLULRDUDRLDLURRUUDULUDRURUDDLUUUDDRLRLRLURDLDDRLRURRLLLRDRLRUUDRRRLUDLDLDDDLDULDRLURDURULURUDDDUDUULRLLDRLDDDDRULRDRLUUURD"
// Process Input
let digitStrings = inputString.components(separatedBy: "\n")
let digitInstructions = digitStrings.map { (keypath) -> [Instruction] in
return keypath.characters.flatMap({ (instruction) -> Instruction? in
return Instruction(rawValue: String(instruction))
})
}
// Do the work
var currentDigit = 0x5
let simpleKeyPad:[[Int?]] = [[1,2,3],
[4,5,6],
[7,8,9]]
let complexKeyPad:[[Int?]] = [[nil, nil, 0x1, nil, nil],
[nil, 0x2, 0x3, 0x4, nil],
[0x5, 0x6, 0x7, 0x8, 0x9],
[nil, 0xA, 0xB, 0xC, nil],
[nil, nil, 0xD, nil, nil]]
loopThroughDigits: for digit in digitInstructions {
for instruction in digit {
currentDigit = currentDigit.nextDigit(withInstruction: instruction, keypad: complexKeyPad)
}
print("\(String(format:"%X", currentDigit))")
}
@DeepFriedTwinkie
Copy link
Author

A straightforward solution using optionals in the keypad.

@DeepFriedTwinkie
Copy link
Author

DeepFriedTwinkie commented Dec 14, 2016

Generalized the keypad code. There could definitely send to be some error checking.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment