Last active
April 22, 2021 16:00
-
-
Save ntreu14/3bfbfaa1e3ec24affdcbc010af4b8ae0 to your computer and use it in GitHub Desktop.
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
open System.IO | |
type InnerBag = { | |
InnerBagName: string | |
InnerBagQuantity: int | |
} | |
let rec parseInnerBags acc = function | |
| [] | "no"::"other"::["bags."] -> acc | |
| innerQuantity::innerAdj::innerColor::_::rest -> | |
let bagName = sprintf "%s %s" innerAdj innerColor | |
let bag = { InnerBagName=bagName; InnerBagQuantity=int innerQuantity } | |
parseInnerBags (bag::acc) rest | |
| pattern -> failwithf "cannot parse inner pattern %A" pattern | |
let parseLine acc (s: string) = | |
match List.ofArray <| s.Split(' ') with | |
| adj::color::_::_::"no"::"other"::["bags."] -> | |
let bagName = sprintf "%s %s" adj color | |
Map.add bagName [] acc | |
| adj::color::_::_::rest -> | |
let bagName = sprintf "%s %s" adj color | |
Map.add bagName (parseInnerBags [] rest) acc | |
| pattern -> failwithf "cannot parse pattern %A" pattern | |
let rec findAllBagsContaining soughtBag allBags = | |
allBags | |
|> Map.filter (fun _ innerBags -> innerBags |> List.exists (fun bag -> bag.InnerBagName = soughtBag)) | |
|> Map.toList | |
|> List.collect (fst >> fun bagName -> bagName::findAllBagsContaining bagName allBags) | |
let rec countBagsInsideOf bagName allBags = | |
match Map.tryFind bagName allBags with | |
| Some innerBags -> | |
innerBags |> List.sumBy (fun innerBag -> | |
innerBag.InnerBagQuantity + countBagsInsideOf innerBag.InnerBagName allBags * innerBag.InnerBagQuantity | |
) | |
| None -> 0 // this should never happen | |
let bags = | |
File.ReadAllLines "input.txt" |> Array.fold parseLine Map.empty | |
// Part 1 | |
findAllBagsContaining "shiny gold" bags | |
|> Set.ofList | |
|> Set.count | |
|> printfn "%d" | |
// Part2 | |
countBagsInsideOf "shiny gold" bags | |
|> printfn "%d" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment