Day 2: Red-Nosed Reports

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://blocks.programming.dev if you prefer sending it through a URL

FAQ

  • Hammerheart
    link
    fedilink
    arrow-up
    1
    ·
    1 day ago
    def is_safe(report: list[int]) -> bool:
        global removed
        acceptable_range = [_ for _ in range(-3,4) if _ != 0]
        diffs = []
        if any([report.count(x) > 2 for x in report]):
            return False
        for i, num in enumerate(report[:-1]):
            cur = num
            next = report[i+1]
            difference = cur - next
            diffs.append(difference)
            if difference not in acceptable_range:
                return False
            if len(diffs) > 1:
                if diffs[-1] * diffs[-2] <= 0:
                    return False
        return True
    
    with open('input') as reports:
        list_of_reports = reports.readlines()[:-1]
    
    
    count = 0
    
    failed_first_pass = []
    failed_twice = []
    
    for reportsub in list_of_reports:
        levels = [int(l) for l in reportsub.split()]
        original = levels.copy()
        if is_safe(levels):
            safe = True
            count += 1
        else:
            failed_first_pass.append(levels)
    
    for report in failed_first_pass:
        print(report)
        working_copy = report.copy()
        for i in range(len(report)):
            safe = False
            working_copy.pop(i)
            print("checking", working_copy)
            if is_safe(working_copy):
                count += 1
                safe = True
                break
            else:
                working_copy = report.copy()
    
    print(count)
    
    • Hammerheart
      link
      fedilink
      arrow-up
      1
      ·
      1 day ago

      this took me so fucking long and in the end i just went for brute force anyway. there are still remnants of some of previous, overly complicated, failed attempts, like the hideous global removed. In the end, I realized I was fucking up by using remove() instead of pop(), it was causing cases with duplicates where the removal of one would yield a safe result to count as unsafe.