Last active
December 14, 2016 22:11
-
-
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)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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))") | |
} |
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
A straightforward solution using optionals in the keypad.