Day 13: Claw Contraption

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

  • Acters@lemmy.world
    link
    fedilink
    arrow-up
    0
    ·
    edit-2
    2 months ago

    Python

    Execution time: ~<1 millisecond (800 microseconds on my machine)

    Good old school linear algebra from middle school. we can solve this really really fast. With minimal changes from part 1!

    FastCode

    [ paste ]

    from time import perf_counter_ns
    import string
    
    def profiler(method):
        def wrapper_method(*args: any, **kwargs: any) -> any:
            start_time = perf_counter_ns()
            ret = method(*args, **kwargs)
            stop_time = perf_counter_ns() - start_time
            time_len = min(9, ((len(str(stop_time))-1)//3)*3)
            time_conversion = {9: 'seconds', 6: 'milliseconds', 3: 'microseconds', 0: 'nanoseconds'}
            print(f"Method {method.__name__} took : {stop_time / (10**time_len)} {time_conversion[time_len]}")
            return ret
    
        return wrapper_method
    
    @profiler
    def main(input_data):
        part1_total_cost = 0
        part2_total_cost = 0
        for machine in input_data:
            Ax,Ay,Bx,By,Px,Py = [ int(l[2:]) for l in machine.split() if l[-1] in string.digits ]
            y,r = divmod((Ay * Px - Ax * Py), (Ay * Bx - Ax * By))
            if r == 0:
                x,r = divmod(Px - Bx * y, Ax)
                if r == 0:
                    part1_total_cost += 3*x + y
            y,r = divmod((Ay * (Px+10000000000000) - Ax * (Py+10000000000000)), (Ay * Bx - Ax * By))
            if r == 0:
                x,r = divmod((Px+10000000000000) - Bx * y, Ax)
                if r == 0:
                    part2_total_cost += 3*x + y
    
        return part1_total_cost,part2_total_cost
    
    if __name__ == "__main__":
        with open('input', 'r') as f:
            input_data = f.read().strip().replace(',', '').split('\n\n')
        part_one, part_two = main(input_data)
        print(f"Part 1: {part_one}\nPart 2: {part_two}")