Created
December 4, 2016 11:07
-
-
Save keithn/4d60d2600ac05588a0ba4aebf9ac2faa to your computer and use it in GitHub Desktop.
Advent of Code 2016 Day 3
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
let isTriangle (x,y,z) = | |
x + y > z && | |
x + z > y && | |
y + z > x | |
let lineTo3Ints (line: string) = | |
let chunks = line.Split( [|" "|], StringSplitOptions.RemoveEmptyEntries ) | |
if (Seq.length chunks) <> 3 then None | |
else | |
let values = chunks |> Seq.map System.Int32.Parse | |
Some values | |
let tuple3 values = | |
let a = Seq.toArray values | |
(a.[0],a.[1],a.[2]) | |
let lineToNumbers line = | |
let numbers = lineTo3Ints line | |
match numbers with | |
| Some values -> Seq.toList values | |
| None -> [] | |
let leftToRightSequence lines = | |
Seq.fold (fun values line -> values @ (lineToNumbers line)) [] lines | |
let every start skip numbers = | |
numbers |> List.mapi (fun i el -> el, i) | |
|> List.filter (fun (_, i) -> ((i - start) % skip) = 0) | |
|> List.map fst | |
let topTopBottom lines = | |
let numbers = leftToRightSequence lines | |
(every 0 3 numbers) @ (every 1 3 numbers) @ (every 2 3 numbers) | |
let rec chunks chunkSize acc numbers = | |
if List.length numbers < chunkSize then acc | |
else chunks chunkSize (acc @ [List.take chunkSize numbers]) (List.skip chunkSize numbers) | |
let findTriangles numbers = | |
let threes = chunks 3 [] numbers; | |
List.filter (fun chunk -> isTriangle (tuple3 chunk)) threes | |
let day3 = | |
printfn "\n\nDay 3\n" | |
let seperators = [|"\n";"\r"|] | |
let lines = input.Split( seperators, StringSplitOptions.RemoveEmptyEntries ) | |
let numbers = leftToRightSequence lines | |
let triangles = findTriangles numbers | |
printfn "Part 1: %d" (Seq.length triangles) | |
let numbers = topTopBottom lines | |
let triangles = findTriangles numbers | |
printfn "Part 2: %d" (Seq.length triangles) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment