Skip to content

Instantly share code, notes, and snippets.

@keithn
Last active December 3, 2016 01:06
Show Gist options
  • Save keithn/67af23879a6af8f522b50b8e6ece232f to your computer and use it in GitHub Desktop.
Save keithn/67af23879a6af8f522b50b8e6ece232f to your computer and use it in GitHub Desktop.
AdventOfCode 2016 Day2
module Day2
open System
let code = @"
LRRLLLRDRURUDLRDDURULRULLDLRRLRLDULUDDDDLLRRLDUUDULDRURRLDULRRULDLRDUDLRLLLULDUURRRRURURULURRULRURDLULURDRDURDRLRRUUDRULLLLLDRULDDLLRDLURRLDUURDLRLUDLDUDLURLRLDRLUDUULRRRUUULLRDURUDRUDRDRLLDLDDDLDLRRULDUUDULRUDDRLLURDDRLDDUDLLLLULRDDUDDUUULRULUULRLLDULUDLLLLURRLDLUDLDDLDRLRRDRDUDDDLLLLLRRLLRLUDLULLDLDDRRUDDRLRDDURRDULLLURLRDLRRLRDLDURLDDULLLDRRURDULUDUDLLLDDDLLRLDDDLLRRLLURUULULDDDUDULUUURRUUDLDULULDRDDLURURDLDLULDUDUDDDDD
RUURUDRDUULRDDLRLLLULLDDUDRDURDLRUULLLLUDUDRRUDUULRRUUDDURDDDLLLLRRUURULULLUDDLRDUDULRURRDRDLDLDUULUULUDDLUDRLULRUDRDDDLRRUUDRRLULUULDULDDLRLURDRLURRRRULDDRLDLLLRULLDURRLUDULDRDUDRLRLULRURDDRLUDLRURDDRDULUDLDLLLDRLRUDLLLLLDUDRDUURUDDUDLDLDUDLLDLRRDLULLURLDDUDDRDUDLDDUULDRLURRDLDLLUUDLDLURRLDRDDLLDLRLULUDRDLLLDRLRLLLDRUULUDLLURDLLUURUDURDDRDRDDUDDRRLLUULRRDRULRURRULLDDDUDULDDRULRLDURLUDULDLDDDLRULLULULUDLDDRDLRDRDLDULRRLRLRLLLLLDDDRDDULRDULRRLDLUDDDDLUDRLLDLURDLRDLDRDRDURRDUDULLLDLUDLDRLRRDDDRRLRLLULDRLRLLLLDUUURDLLULLUDDRLULRDLDLDURRRUURDUDRDLLLLLLDDDURLDULDRLLDUDRULRRDLDUDRLLUUUDULURRUR
URRRLRLLDDDRRLDLDLUDRDRDLDUDDDLDRRDRLDULRRDRRDUDRRUUDUUUDLLUURLRDRRURRRRUDRLLLLRRDULRDDRUDLRLUDURRLRLDDRRLUULURLURURUDRULDUUDLULUURRRDDLRDLUDRDLDDDLRUDURRLLRDDRDRLRLLRLRUUDRRLDLUDRURUULDUURDRUULDLLDRDLRDUUDLRLRRLUDRRUULRDDRDLDDULRRRURLRDDRLLLRDRLURDLDRUULDRRRLURURUUUULULRURULRLDDDDLULRLRULDUDDULRUULRRRRRLRLRUDDURLDRRDDULLUULLDLUDDDUURLRRLDULUUDDULDDUULLLRUDLLLRDDDLUUURLDUDRLLLDRRLDDLUDLLDLRRRLDDRUULULUURDDLUR
UULDRLUULURDRLDULURLUDULDRRDULULUDLLDURRRURDRLRLLRLDDLURRDLUUDLULRDULDRDLULULULDDLURULLULUDDRRULULULRDULRUURRRUDLRLURDRURDRRUDLDDUURDUUDLULDUDDLUUURURLRRDLULURDURRRURURDUURDRRURRDDULRULRRDRRDRUUUUULRLUUUDUUULLRRDRDULRDDULDRRULRLDLLULUUULUUDRDUUUDLLULDDRRDULUURRDUULLUUDRLLDUDLLLURURLUDDLRURRDRLDDURLDLLUURLDUURULLLRURURLULLLUURUUULLDLRDLUDDRRDDUUDLRURDDDRURUURURRRDLUDRLUULDUDLRUUDRLDRRDLDLDLRUDDDDRRDLDDDLLDLULLRUDDUDDDLDDUURLDUDLRDRURULDULULUDRRDLLRURDULDDRRDLUURUUULULRURDUUDLULLURUDDRLDDUDURRDURRUURLDLLDDUUDLLUURDRULLRRUUURRLLDRRDLURRURDULDDDDRDD
LLRUDRUUDUDLRDRDRRLRDRRUDRDURURRLDDDDLRDURDLRRUDRLLRDDUULRULURRRLRULDUURLRURLRLDUDLLDULULDUUURLRURUDDDDRDDLLURDLDRRUDRLDULLRULULLRURRLLURDLLLRRRRDRULRUDUDUDULUURUUURDDLDRDRUUURLDRULDUDULRLRLULLDURRRRURRRDRULULUDLULDDRLRRULLDURUDDUULRUUURDRRLULRRDLDUDURUUUUUURRUUULURDUUDLLUURDLULUDDLUUULLDURLDRRDDLRRRDRLLDRRLUDRLLLDRUULDUDRDDRDRRRLUDUDRRRLDRLRURDLRULRDUUDRRLLRLUUUUURRURLURDRRUURDRRLULUDULRLLURDLLULDDDLRDULLLUDRLURDDLRURLLRDRDULULDDRDDLDDRUUURDUUUDURRLRDUDLRRLRRRDUULDRDUDRLDLRULDL
"
type Position = { x: int; y: int }
let keypad1 = Array2D.init 3 3 (fun x y -> (x * 3 + y + 1).ToString())
let clamp min max o n =
if n < min then min
elif n > max then max
else n
let clamp1 o n = clamp 0 2 o n
let keypad2 = array2D [|
[|" "; " "; "1"; " "; " "|]
[|" "; "2"; "3"; "4"; " "|]
[|"5"; "6"; "7"; "8"; "9"|]
[|" "; "A"; "B"; "C"; " "|]
[|" "; " "; "D"; " "; " "|]
|]
let extent o = abs (o - 2)
let clamp2 o n = clamp (extent o) (4 - (extent o)) o n
let keypadDecoder clamp (keypad: string [,]) =
let changeY n (l:Position) = {l with y = clamp l.x (l.y + n) }
let changeX n (l:Position) = {l with x = clamp l.y (l.x + n) }
let U (p:Position) = changeY -1 p
let D (p:Position) = changeY 1 p
let L (p:Position) = changeX -1 p
let R (p:Position) = changeX 1 p
let I (p:Position) = p
let key p = keypad.[p.y,p.x]
let interpretDirection letter =
match letter with
| 'U' -> U
| 'D' -> D
| 'L' -> L
| 'R' -> R
| _ -> I
let keyForLine startKey line =
let chars = List.ofSeq line
let ops = List.map interpretDirection chars
List.fold (fun position op -> op position) startKey ops
let last l = List.rev l |> List.head
let decode (s:string) (startKey:Position) : string =
let seperators = [|"\n";"\r"|]
let lines = s.Split( seperators, StringSplitOptions.RemoveEmptyEntries )
let digits = Seq.fold (fun keys line -> keys @ [keyForLine (last keys) line ] )[startKey] lines
let chars = Seq.map key digits.Tail // the first key is the start key, which isn't part of the code, so just take the tail
String.Concat( Array.ofSeq chars)
decode
let day2 =
printfn "\n\nDay 2\n"
let startKey = {x=1; y=1}
let example1 = "ULL\nRRDDD\nLURDL\nUUUUD"
let decode1 = keypadDecoder clamp1 keypad1
printfn "Example: %s" (decode1 example1 startKey)
printfn "Part 1: %s" (decode1 code startKey)
let startKey = {x=0; y=2}
let decode2 = keypadDecoder clamp2 keypad2
printfn "Example: %s" (decode2 example1 startKey)
printfn "Part 2: %s" (decode2 code startKey)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment