1
0

main.jl 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. using BenchmarkTools
  2. selfdir = joinpath(splitdir(@__FILE__)[1], "input")
  3. data = readlines(selfdir)
  4. function parse_line(line)
  5. main_bag, contains = split(line, " bags contain ")
  6. if contains == "no other bags."
  7. return (main_bag, ())
  8. else
  9. con = collect(match(r"^(\d+) ([a-z ]+) bags?\.?$", bag).captures for bag in split(contains, ", ")) .|>
  10. x -> (parse(Int, x[1]), x[2])
  11. return main_bag, con
  12. end
  13. end
  14. #--------part1
  15. function shiny_gold(bag, rules)
  16. if bag == "shiny gold"
  17. return true
  18. else
  19. return any(shiny_gold(name, rules) for (_, name) in rules[bag])
  20. end
  21. end
  22. function inside_shiny_gold(bag, rules)
  23. return 1 + reduce(+, (num * inside_shiny_gold(name, rules) for (num, name) in rules[bag]), init=0)
  24. end
  25. #---------part2
  26. function contains_shiny_gold()
  27. data .|> parse_line |> Dict |> x -> [shiny_gold(name , x) for name in keys(x) if name != "shiny gold"] |> sum
  28. end
  29. function how_much_inside_shiny_gold()
  30. (data .|> parse_line |> Dict |> x -> inside_shiny_gold("shiny gold" , x)) - 1
  31. end
  32. #---------evaluation
  33. part1 = @btime contains_shiny_gold()
  34. part1 = @btime how_much_inside_shiny_gold()