Files
kiss-vscode/projects/aoc/src/year2020/Bags.kiss

31 lines
1.5 KiB
Plaintext

(defun bagColor [:String bag]
(bag.substr 0 (Math.floor (- (bag.indexOf "bag") 1))))
(defun parseRule [:String line :ParentMap parentMap :ChildMap childMap]
(unless (line.indexOf "contain no other bags")
(let [[containerStr contents] (line.split "contain ")
contentStrs (contents.split ", ")]
(deflocal :Map<String,Int> innerMap (new Map))
(doFor str contentStrs
(let [parts (str.split " ")
quantity (Std.parseInt (parts.shift))
colorStr (parts.join " ")]
(dictSet innerMap (bagColor colorStr) quantity)
(unless (childMap.exists (bagColor colorStr)) (dictSet childMap (bagColor colorStr) []))
(.push (dictGet childMap (bagColor colorStr)) (bagColor containerStr))))
(dictSet parentMap (bagColor containerStr) innerMap))))
(defun findIndirectContainers [color :ChildMap childMap :Map<String,Bool> outMap]
(when (childMap.exists color)
(doFor parentColor (dictGet childMap color)
(dictSet outMap parentColor true)
(findIndirectContainers parentColor childMap outMap))))
(defun totalChildBags [bag :ParentMap parentMap]
(if (parentMap.exists bag)
(begin
(deflocal &mut sum 0)
(doFor =>childColor quantity (dictGet parentMap bag)
(set sum (+ sum quantity (* quantity (totalChildBags childColor parentMap)))))
sum)
0))