You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

aoc4-2.py 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. class Board:
  2. def __init__(self, lines, boardsize=None, boardnum=None):
  3. self.lines = [[el for el in line.split(" ") if el != ""] for line in lines]
  4. self.boardsize = 5 if boardsize == None else boardsize
  5. self.boardnum = 0 if boardnum == None else boardnum
  6. self.marks = []
  7. for _ in range(self.boardsize):
  8. self.marks.append([0]*self.boardsize)
  9. def mark(self, digit):
  10. for i, line in enumerate(self.lines):
  11. if digit in line:
  12. y = i
  13. x = line.index(digit)
  14. self.marks[y][x] = 1
  15. return None
  16. def check(self):
  17. for line in self.marks:
  18. if sum(line) == 5:
  19. return True
  20. for i in range(5):
  21. if self.marks[0][i] == 1 and \
  22. self.marks[1][i] == 1 and \
  23. self.marks[2][i] == 1 and \
  24. self.marks[3][i] == 1 and \
  25. self.marks[4][i] == 1:
  26. return True
  27. return False
  28. def sum_unmarked(self):
  29. total = 0
  30. for i in range(self.boardsize):
  31. for j in range(self.boardsize):
  32. if self.marks[j][i] == 0:
  33. total += int(self.lines[j][i])
  34. return total
  35. def __repr__(self):
  36. outstr = f"Board {self.boardnum}:\n"
  37. for i in range(self.boardsize):
  38. outstr += f"{' '.join([str(el).rjust(2) for el in self.lines[i]])} {' '.join([str(el).rjust(2) for el in self.marks[i]])}\n"
  39. return outstr
  40. def __str__(self):
  41. outstr = f"Board {self.boardnum}:\n"
  42. for i in range(self.boardsize):
  43. outstr += f"{' '.join([str(el).rjust(2) for el in self.lines[i]])} {' '.join([str(el).rjust(2) for el in self.marks[i]])}\n"
  44. return outstr
  45. def main():
  46. with open("aoc4-1.txt", "r") as file:
  47. lines = [line.strip() for line in file.readlines()]
  48. firstline = lines[0].split(",")
  49. lines = lines[2:]
  50. i = 0
  51. j = 0
  52. boards = []
  53. while i < len(lines):
  54. boards.append(Board(lines[i:i+5], boardnum=j))
  55. j += 1
  56. i += 6
  57. for el in firstline:
  58. print(el)
  59. is_to_pop = [] # that's the plural of "i"
  60. for i, board in enumerate(boards):
  61. board.mark(el)
  62. if board.check():
  63. if len(boards) > 1:
  64. is_to_pop.append(i)
  65. else:
  66. return (board, int(el) * board.sum_unmarked())
  67. boards = [board for i, board in enumerate(boards) if i not in is_to_pop]
  68. if __name__ == "__main__":
  69. board, total = main()
  70. print(board)
  71. print(total)