solution.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #!/usr/bin/python3
  2. import sys
  3. import re
  4. def generate_field(span, row, len_col, len_row):
  5. left = max(span[0] - 1, 0)
  6. right = min(span[1], len_row - 1)
  7. up = max(row - 1, 0)
  8. down = min(row + 1, len_col - 1)
  9. field = [
  10. (up, left), (up, right), (down, left), (down, right),
  11. ]
  12. return field
  13. def check_field(grid, field):
  14. for y in range(field[0][0], field[2][0] + 1):
  15. for x in range(field[0][1], field[1][1] + 1):
  16. if grid[y][x] not in '.0123456789':
  17. return True
  18. return False
  19. def find_gear(grid, field):
  20. for y in range(field[0][0], field[2][0] + 1):
  21. for x in range(field[0][1], field[1][1] + 1):
  22. if grid[y][x] in '*':
  23. return (y, x)
  24. return (-1, -1)
  25. def part1():
  26. print('part 1')
  27. grid = []
  28. numbers = []
  29. spans = []
  30. rows = []
  31. for row, line in enumerate(sys.stdin):
  32. grid.append(list(line.strip()))
  33. for match in re.finditer(r'\d+', line.strip()):
  34. numbers.append(int(match.group()))
  35. spans.append(match.span())
  36. rows.append(row)
  37. summed = 0
  38. for number, row, span in zip(numbers, rows, spans):
  39. field = generate_field(span, row, len(grid), len(grid[row]))
  40. #print(number, row, span, field)
  41. if check_field(grid, field):
  42. summed += number
  43. #else:
  44. #print(f'{number} not in field')
  45. print(summed)
  46. def part2():
  47. print('part 2')
  48. grid = []
  49. numbers = []
  50. spans = []
  51. rows = []
  52. for row, line in enumerate(sys.stdin):
  53. grid.append(list(line.strip()))
  54. for match in re.finditer(r'\d+', line.strip()):
  55. numbers.append(int(match.group()))
  56. spans.append(match.span())
  57. rows.append(row)
  58. gears = {}
  59. for number, row, span in zip(numbers, rows, spans):
  60. field = generate_field(span, row, len(grid), len(grid[row]))
  61. y, x = find_gear(grid, field)
  62. if y > 0 and x > 0:
  63. if (y, x) in gears:
  64. gears[(y, x)].append(number)
  65. else:
  66. gears[(y, x)] = [number]
  67. ratios = 0
  68. for gear in gears:
  69. if len(gears[gear]) > 1:
  70. ratio = 1
  71. for number in gears[gear]:
  72. ratio *= number
  73. ratios += ratio
  74. print(gears)
  75. print(ratios)
  76. if sys.argv[1] in '1':
  77. part1()
  78. else:
  79. part2()