Advent of Code 2022 day 25

A nice and easy end to the puzzles. I look forward to next year!

from math import ceil

with open("25.txt") as f:
    lines = f.read().splitlines()

snafu_to_dec_char = {
    "2": 2,
    "1": 1,
    "0": 0,
    "-": -1,
    "=": -2,
}

dec_to_snafu_char = {
    2: "2",
    1: "1",
    0: "0",
    -1: "-",
    -2: "=",
}

def snafu_to_dec(line):
    dec = 0
    power = 0
    for coeff in reversed(line):
        dec += snafu_to_dec_char[coeff]*(5**power)
        power += 1
    return dec

def dec_to_snafu(x):
    def get_coeffs(x):
        coeffs = []
        max_power = ceil(x**(1/5))
        for power in reversed(range(max_power)):
            coeff = x // 5**power
            coeffs.append(coeff)
            x -= (coeff*(5**power))
        return coeffs

    def carry_overs(coeffs):
        new_coeffs = [0] + coeffs
        for i in range(len(new_coeffs)):
            while new_coeffs[-i] > 2:
                new_coeffs[-i-1] += 1
                new_coeffs[-i] -= 5
        return new_coeffs

    coeffs = get_coeffs(x)
    latest_coeffs = carry_overs(coeffs)
    return "".join(dec_to_snafu_char[x] for x in latest_coeffs).lstrip("0")

print(dec_to_snafu(sum(snafu_to_dec(line) for line in lines)))