Skip to content

Instantly share code, notes, and snippets.

@keithn
Created December 4, 2016 11:07
Show Gist options
  • Save keithn/4d60d2600ac05588a0ba4aebf9ac2faa to your computer and use it in GitHub Desktop.
Save keithn/4d60d2600ac05588a0ba4aebf9ac2faa to your computer and use it in GitHub Desktop.
Advent of Code 2016 Day 3
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