day3.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import os
  2. import jax
  3. import jax.numpy as jnp
  4. with open(os.path.join(os.path.abspath(""), "day3", "example.txt")) as example:
  5. example = example.readlines()
  6. with open(os.path.join(os.path.abspath(""), "day3", "input.txt")) as input:
  7. input = input.readlines()
  8. def solve1(pop):
  9. example = []
  10. for ind, line in enumerate(pop):
  11. line = "." + line.replace("\n", ".")
  12. example.append(line)
  13. example.insert(0, "." * len(example[0]))
  14. example.append("." * len(example[0]))
  15. part_numbers = []
  16. numbers = []
  17. adjacent = False
  18. for i in range(len(example) - 1):
  19. number = ""
  20. for j in range(len(example[0]) - 1):
  21. el = example[i][j]
  22. if example[i][j].isdigit():
  23. number += example[i][j]
  24. if (
  25. example[i - 1][j - 1] != "."
  26. or example[i - 1][j] != "."
  27. or example[i - 1][j + 1] != "."
  28. or example[i + 1][j - 1] != "."
  29. or example[i + 1][j] != "."
  30. or example[i + 1][j + 1] != "."
  31. or not (example[i][j + 1] == "." or example[i][j + 1].isdigit())
  32. or not (example[i][j - 1] == "." or example[i][j - 1].isdigit())
  33. ):
  34. adjacent = True
  35. else:
  36. if number != "" and not adjacent:
  37. numbers.append(int(number))
  38. adjacent = False
  39. elif number and adjacent:
  40. part_numbers.append(int(number))
  41. adjacent = False
  42. number = ""
  43. # print(part_numbers)
  44. print(sum(part_numbers))
  45. return part_numbers
  46. solve1(example)
  47. a = solve1(input)
  48. def solve2(pop):
  49. example = []
  50. for ind, line in enumerate(pop):
  51. line = "." + line.replace("\n", ".")
  52. example.append(line)
  53. example.insert(0, "." * len(example[0]))
  54. example.append("." * len(example[0]))
  55. part_numbers = []
  56. numbers = []
  57. gear = False
  58. geared = {}
  59. for i in range(len(example) - 1):
  60. number = ""
  61. for j in range(len(example[0]) - 1):
  62. el = example[i][j]
  63. if example[i][j].isdigit():
  64. number += example[i][j]
  65. if (
  66. example[i - 1][j - 1] == "*"
  67. or example[i - 1][j] == "*"
  68. or example[i - 1][j + 1] == "*"
  69. or example[i + 1][j - 1] == "*"
  70. or example[i + 1][j] == "*"
  71. or example[i + 1][j + 1] == "*"
  72. or not (example[i][j + 1] == "*" or example[i][j + 1].isdigit())
  73. or not (example[i][j - 1] == "*" or example[i][j - 1].isdigit())
  74. ):
  75. gear = True
  76. else:
  77. if number != "" and not gear:
  78. numbers.append(int(number))
  79. gear = False
  80. elif number and gear:
  81. part_numbers.append(int(number))
  82. gear = False
  83. number = ""
  84. def solve_reddit(lines):
  85. lines = [line.strip() for line in lines]
  86. NUM_LINES = len(lines)
  87. LINE_LEN = len(lines[0])
  88. nums = []
  89. for i in range(len(lines)):
  90. j = 0
  91. while j < LINE_LEN:
  92. if lines[i][j].isdecimal():
  93. start = j
  94. num = ""
  95. while j < LINE_LEN and lines[i][j].isdecimal():
  96. num += lines[i][j]
  97. j += 1
  98. j -= 1
  99. nums.append((int(num), (i, start, j)))
  100. j += 1
  101. sum = 0
  102. pnums = []
  103. for num in nums:
  104. part_number = False
  105. for i in range(num[1][0] - 1, num[1][0] + 2):
  106. if i >= 0 and i < NUM_LINES:
  107. for j in range(num[1][1] - 1, num[1][2] + 2):
  108. if j >= 0 and j < LINE_LEN:
  109. if not (lines[i][j].isdecimal() or lines[i][j] == "."):
  110. part_number = True
  111. sum += num[0]
  112. pnums.append(num[0])
  113. break
  114. if part_number:
  115. break
  116. print(sum)
  117. return pnums
  118. b = solve_reddit(input)
  119. print([n for n in b if n not in a])