func rule_exists[rules_left: Array, rules_right: Array, a: I64, b: I64] : Bool for k in 0..array.size(rules_left) if array.nth(rules_left, k) == a & array.nth(rules_right, k) == b return true return false func check[update: Array, rules_left: Array, rules_right: Array] : Bool for i in 0..array.size(update) for j in 0..i if rule_exists(rules_left, rules_right, array.nth(update, i), array.nth(update, j)) return false return true func sort_by_rules[update: Array, rules_left: Array, rules_right: Array] : Void let swapped: Bool = true while swapped swapped = false for i in 0..array.size(update)-1 let a: I64 = array.nth(update, i) let b: I64 = array.nth(update, i+1) if rule_exists(rules_left, rules_right, b, a) let tmp: I64 = a array.set(update, i, b) array.set(update, i+1, tmp) swapped = true func part1[updates: Array, rules_left: Array, rules_right: Array] : Void let out: I64 = 0 for i in 0..array.size(updates) let update: Array = array.nth(updates, i) if check(update, rules_left, rules_right) out = out + array.nth(update, array.size(update) / 2) io.println_i64(out) func part2[updates: Array, rules_left: Array, rules_right: Array] : Void let out: I64 = 0 for i in 0..array.size(updates) let update: Array = array.nth(updates, i) if !check(update, rules_left, rules_right) sort_by_rules(update, rules_left, rules_right) out = out + array.nth(update, array.size(update) / 2) io.println_i64(out) func main[] : I64 let data: Array = io.read_file("input.txt") |> str.split("\n\n") let rules_left: Array = [] let rules_right: Array = [] let rules_lines: Array = str.split(array.nth(data, 0), "\n") for i in 0..array.size(rules_lines) let line: String = array.nth(rules_lines, i) let parts: Array = str.split(line, "|") array.push(rules_left, str.parse_i64(array.nth(parts, 0))) array.push(rules_right, str.parse_i64(array.nth(parts, 1))) let updates: Array = [] let updates_lines: Array = str.split(array.nth(data, 1), "\n") for i in 0..array.size(updates_lines) let line: String = array.nth(updates_lines, i) let xs: Array = str.split(line, ",") for i in 0..array.size(xs) array.set(xs, i, str.parse_i64(array.nth(xs, i))) array.push(updates, xs) part1(updates, rules_left, rules_right) part2(updates, rules_left, rules_right)