b.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import os, argparse
  2. def solve_task(lines):
  3. messages = []
  4. for line in lines:
  5. if line == "":
  6. continue
  7. else:
  8. messages.append(Packet(line))
  9. d1 = Packet("[[2]]")
  10. d2 = Packet("[[6]]")
  11. messages.append(d1)
  12. messages.append(d2)
  13. messages.sort()
  14. i1 = messages.index(d1)+1
  15. i2 = messages.index(d2)+1
  16. print(f"Divider packages at index {i1} and {i2}")
  17. print(f"Decoder key: {i1*i2}")
  18. class Packet:
  19. def __init__(self, line) -> None:
  20. self.package = eval(line)
  21. def __lt__(self, other):
  22. return compare(self.package, other.package)
  23. def compare(left,right):
  24. if isinstance(left, int) and isinstance(right, int):
  25. if left == right:
  26. return "undetermined"
  27. else:
  28. return left < right
  29. elif isinstance(left, int):
  30. return compare([left], right)
  31. elif isinstance(right, int):
  32. return compare(left, [right])
  33. else:
  34. for i in range(min(len(left), len(right))):
  35. comp = compare(left[i], right[i])
  36. if comp == "undetermined":
  37. continue
  38. else:
  39. return comp
  40. if len(left) < len(right):
  41. return True
  42. elif len(right) < len(left):
  43. return False
  44. else:
  45. return "undetermined"
  46. def read_lines(filename):
  47. lines = []
  48. with open(filename) as infile:
  49. for raw_line in infile:
  50. line = raw_line.rstrip()
  51. lines.append(line)
  52. return lines
  53. def parse_arguments():
  54. parser = argparse.ArgumentParser(description="Script that solves the case",epilog="Have a nice day!")
  55. parser.add_argument('filename', nargs='?', default="example.txt", help='Input file')
  56. args = parser.parse_args()
  57. return args
  58. def main():
  59. args = parse_arguments()
  60. lines = read_lines(args.filename)
  61. solve_task(lines)
  62. if __name__ == "__main__":
  63. main()