74 lines
2.5 KiB
Plaintext
74 lines
2.5 KiB
Plaintext
func rule_exists[rules_left: Array, rules_right: Array, a: i64, b: i64] : bool
|
|
for k in 0..rules_left->size
|
|
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..update->size
|
|
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 = true
|
|
|
|
while swapped
|
|
swapped = false
|
|
for i in 0..update->size-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 = 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 = 0
|
|
|
|
for i in 0..updates->size
|
|
let update: Array = array.nth(updates, i)
|
|
if check(update, rules_left, rules_right)
|
|
out = out + array.nth(update, update->size / 2)
|
|
|
|
io.println_i64(out)
|
|
|
|
func part2[updates: Array, rules_left: Array, rules_right: Array] : void
|
|
let out = 0
|
|
|
|
for i in 0..updates->size
|
|
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, update->size / 2)
|
|
|
|
io.println_i64(out)
|
|
|
|
func main[] : i64
|
|
let data = must(io.read_text_file?("input.txt")) |> str.split("\n\n")
|
|
|
|
let rules_left = []
|
|
let rules_right = []
|
|
let rules_lines = str.split(array.nth(data, 0), "\n")
|
|
for i in 0..rules_lines->size
|
|
let line: str = array.nth(rules_lines, i)
|
|
let parts = 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 = []
|
|
let updates_lines = str.split(array.nth(data, 1), "\n")
|
|
for i in 0..updates_lines->size
|
|
let line: str = array.nth(updates_lines, i)
|
|
let xs = str.split(line, ",")
|
|
|
|
for i in 0..xs->size
|
|
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)
|