alexandrajay2002

Advent of Code 2024 day 19 part 1

Dec 19th, 2024
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.66 KB | Source Code | 0 0
  1. from operator import itemgetter
  2. from argparse import ArgumentParser, FileType
  3.  
  4.  
  5. def parse_towels(line):
  6.     return sorted(((towel, len(towel)) for towel in line.split(', ')),
  7.                   key=itemgetter(1), reverse=True)
  8.  
  9.  
  10. def parse_patterns(src):
  11.     return [line for line in src.splitlines() if line != '']
  12.  
  13.  
  14. def parse(src):
  15.     towels, patterns = src.split('\n\n', 1)
  16.     return parse_towels(towels), parse_patterns(patterns)
  17.  
  18.  
  19. def possible(pattern, towels):
  20.     todo = {pattern, }
  21.  
  22.     while len(todo) > 0:
  23.         part = todo.pop()
  24.         for towel, towel_len in towels:
  25.             if part[:towel_len] == towel:
  26.                 if part == towel:
  27.                     return True
  28.  
  29.                 todo.add(part[towel_len:])
  30.  
  31.     return False
  32.  
  33.  
  34. def prune_towels(towels):
  35.     index = 0
  36.     while index < len(towels) and towels[index][1] > 1:
  37.         # a towel that can be made from other towels is redundant
  38.         if possible(towels[index][0], towels[index+1:]):
  39.             towels.pop(index)
  40.         else:
  41.             index += 1
  42.  
  43.  
  44. def main(towels, patterns, verbose):
  45.     prune_towels(towels)
  46.  
  47.     total = 0
  48.     for pattern in patterns:
  49.         if possible(pattern, towels):
  50.             if verbose:
  51.                 print(f'{pattern} is possible')
  52.             total += 1
  53.         elif verbose:
  54.             print(f'{pattern} is not possible')
  55.  
  56.     return total
  57.  
  58.  
  59. arg_parser = ArgumentParser()
  60. arg_parser.add_argument('src', type=FileType('r'))
  61. arg_parser.add_argument('-v', '--verbose', action='store_true')
  62.  
  63. if __name__ == '__main__':
  64.     args = arg_parser.parse_args()
  65.     print(main(*parse(args.src.read()), args.verbose))
  66.  
Advertisement
Add Comment
Please, Sign In to add comment