Advent of Code 2022 day 13
There was quite a lot of faffing with part 1 for edge cases. The main edge case which caused issues is mitigated by the conditionals with the walrus operator, and the following code:
if type(a) == list and type(b) == list and len(a) == len(b): return None
Part 2 was fairly straightfoward. Used linear sort since it was effective enough.
# with open("13_test.txt") as f: with open("13.txt") as f: pairs = [pair.splitlines() for pair in f.read().split("\n\n")] def compare(a, b): for i, x in enumerate(a): if i >= len(b): return False elif type(x) == int and type(b[i]) == int and x > b[i]: return False elif type(x) == int and type(b[i]) == int and x < b[i]: return True elif type(x) == list and type(b[i]) == list: if (result := compare(x, b[i])) is not None: return result elif type(x) == int and type(b[i]) == list: if (result := compare([x], b[i])) is not None: return result elif type(x) == list and type(b[i]) == int: if (result := compare(x, [b[i]])) is not None: return result if type(a) == list and type(b) == list and len(a) == len(b): return None else: return True print( sum( [i for i, (a, b) in enumerate(pairs, 1) if compare(eval(a), eval(b))] ) ) # part 2 signals = [x for pair in pairs for x in pair] + ["[[2]]", "[[6]]"] def linear_sort(l): for i in range(len(l)): for j in range(i): if compare(eval(l[j]), eval(l[i])) is False: temp = l[i] l[i] = l[j] l[j] = temp return l def product(l): mult = 1 for x in l: mult *= x return mult ordered = linear_sort(signals) print( product([i for i, x in enumerate(ordered, 1) if x in ["[[2]]", "[[6]]"]]) )