Last active
December 3, 2016 01:06
-
-
Save keithn/67af23879a6af8f522b50b8e6ece232f to your computer and use it in GitHub Desktop.
AdventOfCode 2016 Day2
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
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