record lens [ label : bytes; focal_length : int; ] fn main [ var line := list_join(list_break_to_lines(read_lazy(h[0])), ""); var steps := list_break(line, ','); var boxes := array_fill(empty(lens), [256]); for s in steps do [ if s[len(s) - 1] = '-' then [ var label := s[ .. len(s) - 1]; var hash := list_fold(uint8, uint8, 0, label, lambda(x y : uint8) [ return (x + y) * 17; ]); for i := 0 to len(boxes[hash]) do [ if boxes[hash][i].label = label then [ boxes[hash] := boxes[hash][ .. i] + boxes[hash][i + 1 .. ]; break; ] ] ] else [ var e := list_search(s, '='); var label := s[ .. e]; var hash := list_fold(uint8, uint8, 0, label, lambda(x y : uint8) [ return (x + y) * 17; ]); var fl := ston(s[e + 1 .. ]); for i := 0 to len(boxes[hash]) do [ if boxes[hash][i].label = label then [ boxes[hash][i].focal_length := fl; goto done; ] ] boxes[hash] +<= lens.[ label : label, focal_length : fl ]; done: ] ] var sum := 0; for i := 0 to 256 do [ for j := 0 to len(boxes[i]) do [ sum += (i + 1) * (j + 1) * boxes[i][j].focal_length; ] ] write(h[1], ntos(sum) + nl); ]