record rule [ cat : int; rel : byte; num : int; dest : bytes; ] fn main [ var cat2ch := "xmas"; var lines := list_break_to_lines(read_lazy(h[0])); var xlines := list_break(lines, ""); var rules := treemap_init(bytes, list(rule)); for l in xlines[0] do [ var s := list_search(l, '{'); var name := l[ .. s]; var rs := list_break(l[s + 1 .. len(l) - 1], ','); var r := empty(rule); for q in rs do [ var c := list_search(q, ':'); if c = -1 then [ r +<= rule.[ cat : -1, rel : 0, num : 0, dest : q ]; ] else [ r +<= rule.[ cat : list_search(cat2ch, q[0]), rel : q[1], num : ston(q[2 .. c]), dest : q[c + 1 .. ] ]; ] ] rules := treemap_insert(rules, name, r); ] var sum := 0; for l in xlines[1] do [ l := l[1 .. len(l) - 1]; l := list_replace_substring(l, "x=", ""); l := list_replace_substring(l, "m=", ""); l := list_replace_substring(l, "a=", ""); l := list_replace_substring(l, "s=", ""); var n := map(list_break(l, ','), ston); var crule := "in"; while true do [ var rs := treemap_search(rules, crule).j; for q in rs do [ if q.cat = -1 then goto match; var n1 := n[q.cat]; var n2 := q.num; if select(q.rel = '>', n1 < n2, n1 > n2) then [ match: crule := q.dest; if crule = "A" then [ sum += n[0] + n[1] + n[2] + n[3]; goto next; ] if crule = "R" then [ goto next; ] break; ] ] ] next: ] write(h[1], ntos(sum) + nl); ]