Add day 2
authorGreg Burri <greg.burri@gmail.com>
Sat, 2 Dec 2017 21:29:04 +0000 (22:29 +0100)
committerGreg Burri <greg.burri@gmail.com>
Sat, 2 Dec 2017 21:29:04 +0000 (22:29 +0100)
AdventOfCode2017/AdventOfCode2017.fsproj
AdventOfCode2017/Day1.fs
AdventOfCode2017/Day2.fs [new file with mode: 0644]
AdventOfCode2017/Program.fs

index 6b02c2a..4092b9b 100644 (file)
@@ -25,6 +25,7 @@
     <PlatformTarget>AnyCPU</PlatformTarget>
     <DocumentationFile>bin\$(Configuration)\$(AssemblyName).XML</DocumentationFile>
     <Prefer32Bit>true</Prefer32Bit>
+    <StartArguments>2</StartArguments>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
     <DebugType>pdbonly</DebugType>
   <ItemGroup>
     <Compile Include="AssemblyInfo.fs" />
     <Compile Include="Day1.fs" />
+    <Compile Include="Day2.fs" />
     <Compile Include="Program.fs" />
     <None Include="App.config" />
     <Content Include="packages.config" />
+    <None Include="Data\day1">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+    <None Include="Data\day2">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
   </ItemGroup>
   <ItemGroup>
     <Reference Include="mscorlib" />
index 6b2ad1a..79e523b 100644 (file)
@@ -2,10 +2,11 @@
 
 let readDigit d = int d - int '0'
 
-let solveCaptcha (shift : int) (captcha : string) =
-    let ns = captcha.ToCharArray () |> Array.map readDigit
-    let l = ns.Length
-    [ for i in 0 .. l - 1 -> if ns.[i] = ns.[(i + shift) % l] then ns.[i] else 0 ] |> List.sum
+let parseInput (str : string) : int[] = str.ToCharArray () |> Array.map readDigit
+
+let solveCaptcha (shift : int) (captcha : int[]) =
+    let l = captcha.Length
+    [ for i in 0 .. l - 1 -> if captcha.[i] = captcha.[(i + shift) % l] then captcha.[i] else 0 ] |> List.sum
 
 let solveCaptcha1 = solveCaptcha 1
-let solveCaptcha2 captcha = solveCaptcha (String.length captcha / 2) captcha
+let solveCaptcha2 (captcha : int[]) = solveCaptcha (captcha.Length / 2) captcha
diff --git a/AdventOfCode2017/Day2.fs b/AdventOfCode2017/Day2.fs
new file mode 100644 (file)
index 0000000..c92fe54
--- /dev/null
@@ -0,0 +1,24 @@
+module AdventOfCode2017.Day2
+
+open System
+
+let parseInput (str : string) : int[][] =
+    str.Split ([| '\n' |], StringSplitOptions.RemoveEmptyEntries)
+    |> Array.map (fun line -> line.Split ([| ' '; '\t' |], StringSplitOptions.RemoveEmptyEntries) |> Array.map int)
+
+let checksum1 (a : int[][]) =
+    a
+    |> Array.map (fun ns -> Array.max ns - Array.min ns)
+    |> Array.sum
+
+let checksum2 (a : int[][]) =
+    a
+    |> Array.map (
+        fun ns ->
+            seq {
+                for a in ns do
+                    for b in ns do
+                        if a <> b && a % b = 0 then yield a / b
+            } |> Seq.head
+    )
+    |> Array.sum
index 1890a1d..b541671 100644 (file)
@@ -1,16 +1,30 @@
 module AdventOfCode2017.Main
 
+open System.IO
+
 let day1 () =
-    let captcha = "9513446799636685297929646689682997114316733445451534532351778534251427172168183621874641711534917291674333857423799375512628489423332297538215855176592633692631974822259161766238385922277893623911332569448978771948316155868781496698895492971356383996932885518732997624253678694279666572149831616312497994856288871586777793459926952491318336997159553714584541897294117487641872629796825583725975692264125865827534677223541484795877371955124463989228886498682421539667224963783616245646832154384756663251487668681425754536722827563651327524674183443696227523828832466473538347472991998913211857749878157579176457395375632995576569388455888156465451723693767887681392547189273391948632726499868313747261828186732986628365773728583387184112323696592536446536231376615949825166773536471531487969852535699774113163667286537193767515119362865141925612849443983484245268194842563154567638354645735331855896155142741664246715666899824364722914296492444672653852387389477634257768229772399416521198625393426443499223611843766134883441223328256883497423324753229392393974622181429913535973327323952241674979677481518733692544535323219895684629719868384266425386835539719237716339198485163916562434854579365958111931354576991558771236977242668756782139961638347251644828724786827751748399123668854393894787851872256667336215726674348886747128237416273154988619267824361227888751562445622387695218161341884756795223464751862965655559143779425283154533252573949165492138175581615176611845489857169132936848668646319955661492488428427435269169173654812114842568381636982389224236455633316898178163297452453296667661849622174541778669494388167451186352488555379581934999276412919598411422973399319799937518713422398874326665375216437246445791623283898584648278989674418242112957668397484671119761553847275799873495363759266296477844157237423239163559391553961176475377151369399646747881452252547741718734949967752564774161341784833521492494243662658471121369649641815562327698395293573991648351369767162642763475561544795982183714447737149239846151871434656618825566387329765118727515699213962477996399781652131918996434125559698427945714572488376342126989157872118279163127742349"
+    let captcha = File.ReadAllText "Data/day1" |> Day1.parseInput
     sprintf "part1 = %A, part2 = %A" (Day1.solveCaptcha1 captcha) (Day1.solveCaptcha2 captcha)
 
-let printDay (n : int) (f : unit -> string) =
-    printfn "Result of day %i: %s" n (f ())
+let day2 () =
+    let array = File.ReadAllText "Data/day2" |> Day2.parseInput
+    sprintf "part1 = %A, part2 = %A" (Day2.checksum1 array) (Day2.checksum2 array)
+
+
+let doDay (n : int) =
+    let result =
+        match n with
+        | 2 -> day2 ()
+        | _ -> day1 ()
+    printfn "Result of day %i: %s" n result
 
 [<EntryPoint>]
-let main _argv =
+let main argv =
     printfn "https://adventofcode.com/2017"
 
-    printDay 1 day1
-
+    if argv.Length > 0 then
+        doDay (int argv.[0])
+    else
+        for d = 1 to 24 do
+            doDay d
     0