Day 7: Bridge Repair

Megathread guidelines

  • Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
  • You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL

FAQ

  • TunaCowboy@lemmy.world
    link
    fedilink
    arrow-up
    0
    ·
    3 months ago

    python

    45s on my machine for first shot, trying to break my will to brute force 😅. I’ll try improving on it in a bit after I smoke another bowl and grab another drink.

    solution
    from itertools import product
    import re
    import aoc
    
    def ltr(e):
        r = int(e[0])
        for i in range(1, len(e), 2):
            o = e[i]
            n = int(e[i + 1])
            if o == '+':
                r += n
            elif o == '*':
                r *= n
            elif o == '||':
                r = int(f"{r}{n}")
        return r
    
    def one():
        lines = aoc.get_lines(7)
        rs = []
        for l in lines:
            d = [int(x) for x in re.findall(r'\d+', l)]
            t = d[0]
            ns = d[1:]
            ops = list(product(['+', '*'], repeat=len(ns) - 1))
            for o in ops:
                e = str(ns[0])
                for i, op in enumerate(o):
                    e += f" {op} {ns[i + 1]}"
                r = ltr(e.split())
                if r == t:
                    rs.append(t)
                    break
        print(sum(rs))
    
    def two():
        lines = aoc.get_lines(7)
        rs = []
        for l in lines:
            d = [int(x) for x in re.findall(r'\d+', l)]
            t = d[0]
            ns = d[1:]
            ops = list(product(['+', '*', '||'], repeat=len(ns) - 1))
            for o in ops:
                e = str(ns[0])
                for i, op in enumerate(o):
                    e += f" {op} {ns[i + 1]}"
                r = ltr(e.split())
                if r == t:
                    rs.append(t)
                    break
        print(sum(rs))
    
    one()
    two()