Sean McLemon | Advent of Code

Home | Czech | Blog | GitHub | Advent Of Code | Notes


2018-12-05 - Alchemical Reduction

(original .ipynb)
open System.IO

let realInput = File.ReadAllText("puzzle_input/day5.txt")
let testInput = "dabAcCaCBAcCcaDA"
let (=?) s1 s2 = System.String.Equals(s1, s2, System.StringComparison.CurrentCultureIgnoreCase) && not (s1.Equals(s2))
let (=??) s1 s2 = System.String.Equals(s1, s2, System.StringComparison.CurrentCultureIgnoreCase)

let stringToList (str:string) =
    str.ToCharArray() |> Array.map (fun c -> c.ToString()) |> Array.toList

let rec reducePolymer' polymerList = 
    match polymerList with
    | [] -> []
    | u::[] -> [ u ]
    | u::v::rest -> 
        if u =? v then reducePolymer' rest else u :: (reducePolymer' (v :: rest))
    
let rec reducePolymer (polymerString:string) = 
    let polymerList = stringToList polymerString
    let reactedPolymerString = reducePolymer' polymerList |> String.concat ""
    
    if polymerString.Length = reactedPolymerString.Length
    then reactedPolymerString
    else reducePolymer reactedPolymerString


// Part 1
(reducePolymer realInput).Length |> printfn "part one: %A" 


// Part 2
let reduceMinusUnit polymerList ch = 
    polymerList
    |> List.filter (fun c -> not (c =?? ch))
    |> String.concat ""
    |> reducePolymer
    
// surely a better way to do this
let allLetters = " abcdefghijklmnopqrstuvwxyz"

stringToList allLetters 
|> List.map (fun c -> (c, (reduceMinusUnit (stringToList realInput) c).Length ))
|> List.sortBy (fun p -> snd p)
|> List.head
|> snd
|> printfn "part two: %A"
part one: 10496
part two: 5774