solution.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #!/usr/bin/python3
  2. import sys
  3. import json
  4. import functools
  5. # part 1
  6. def compare_signals(left, right):
  7. l_int, r_int = type(left) == int, type(right) == int
  8. #print(f'comparing\n{left} (int: {l_int}) and\n{right} (int: {r_int})')
  9. if l_int and r_int:
  10. return left - right
  11. if l_int:
  12. return compare_signals([left], right)
  13. if r_int:
  14. return compare_signals(left, [right])
  15. for i in range(min(len(left), len(right))):
  16. nested_comparison = compare_signals(left[i], right[i])
  17. if nested_comparison != 0:
  18. return nested_comparison
  19. return len(left) - len(right)
  20. def part1():
  21. i = 1
  22. indices = []
  23. for line in sys.stdin:
  24. if line == '\n':
  25. continue
  26. left = json.loads(line.strip())
  27. right = json.loads(next(sys.stdin).strip())
  28. #print('index', i, left, 'and', right)
  29. print(f'\nchecking signal {i}')
  30. result = compare_signals(left, right) <= 0
  31. print(f'signal {i} is in right order: {result}')
  32. if result:
  33. indices.append(i)
  34. i += 1
  35. print(f'the sum of indices is {sum(indices)}')
  36. # part 2
  37. def part2():
  38. packets = [[[2]], [[6]]]
  39. for line in sys.stdin:
  40. if line == '\n':
  41. continue
  42. left = json.loads(line.strip())
  43. right = json.loads(next(sys.stdin).strip())
  44. packets.append(left)
  45. packets.append(right)
  46. packets.sort(key=functools.cmp_to_key(compare_signals))
  47. divider_indices = []
  48. for i, packet in enumerate(packets):
  49. #print(packet)
  50. if packet == [[2]] or packet == [[6]]:
  51. divider_indices.append(i + 1)
  52. print(f'the divider indices are {divider_indices} (with product {divider_indices[0] * divider_indices[1]})')
  53. if sys.argv[1] in '1':
  54. part1()
  55. else:
  56. part2()