Cleaned up answer addeded some asserts

This commit is contained in:
icaema 2023-12-04 19:47:31 -05:00
parent fdc1fea8dd
commit ec546d9e19
1 changed files with 33 additions and 47 deletions

View File

@ -2,12 +2,15 @@ import sys
from dataclasses import dataclass, field
DEBUG = True
debug_padding = 24
debug_padding = 20
def debug_print(printname, *args):
if DEBUG:
print(f"{'DEBUG::'+printname:<{debug_padding}}", *args)
#==========================================================================================
def get_points(match_count):
return 0 if match_count==0 else 2**(match_count-1)
@ -15,86 +18,69 @@ def get_points(match_count):
class Card:
card_no: int = 0
match_count: int = 0
copies: int = 1
#technically unneeded ----
winning_numbers: set = field(default_factory=set)
my_numbers: list = field(default_factory=list)
#winning_numbers: set = field(default_factory=set)
#my_numbers: list = field(default_factory=list)
cards = []
total_points = 0
#print("Parsing Input:")
#print("")
#print("===================================\n");
print("Parsing Input:")
print("")
print("===================================\n")
FILENAME = "/home/icaema/Public/advent-of-code/day-04/data/p02data.txt"
f = open(FILENAME, "r")
#for line in sys.stdin:
for line in f.readlines():
line = line[5:] #remove the "Card "
#debug_print("input", line)
line = line[5:] #remove "Card "
debug_print("input", line.strip())
[card_number_side, given_number_side] = line.split(':')
card_number = int(card_number_side)
#debug_print("aaaa", f"cns: -{card_number}-; gns: -{given_number_side}-")
[winning_numbers,my_numbers] = given_number_side.split('|')
#debug_print("parsing", f"cardNo: -{card_number}-; winNum: -{winning_numbers.strip()}-; myNum: -{my_numbers.strip()}-")
winning_numbers = set(int(wn) for wn in winning_numbers.split())
my_numbers = [int(mn) for mn in my_numbers.split()]
match_count = len([x for x in my_numbers if x in winning_numbers])
# cards wont have repeated my_numbers
if DEBUG: assert len(my_numbers) == len(set(my_numbers))
total_points += get_points(match_count)
current_card = Card(card_number, match_count, winning_numbers, my_numbers)
current_card = Card(card_number, match_count) #1,winning_numbers, my_numbers)
cards.append(current_card)
#debug_print("parsed", current_card)
print("")
print(" Proccessing:")
print("===================================\n")
cards_and_copies = [{'card_no':card.card_no, 'match_count':card.match_count, 'copies':1} for card in cards]
for i in range(len(cards)):
card_processing = cards[i]
# i+1 is the cards number
if DEBUG: assert card_processing.card_no == i+1
#debug_print("loop_card", i, card_processing)
for j in range(card_processing.match_count):
cards[(i+1)+j].copies += card_processing.copies
if DEBUG:
#card number can also be calculated by its index+1
for i, card in enumerate(cards_and_copies):
assert card['card_no'] == i+1
#debug_print("cards_and_copies", cards_and_copies)
for i in range(len(cards_and_copies)):
card_processing = cards_and_copies[i]
debug_print("loop_card", i, card_processing)
for j in range(card_processing['match_count']):
cards_and_copies[(i+1)+j]['copies'] += card_processing['copies']
for card in cards_and_copies:
debug_print("final print", card)
print("frick", sum([i['copies'] for i in cards_and_copies]))
#print("")
#print(" Calculate Answer:")
#print("===================================\n");
for card in cards:
debug_print("final_cards_and_copies", card)
#actually we do this earlier for the extra efficiency
#total_points = sum([get_points(card.match_count) for card in cards])
total_card_copies = sum([card.copies for card in cards])
print("")
print(" Answer:")
print("===================================\n");
print(f"Answer: \n{total_points}");
print("===================================\n")
print(f"Total Points: \n{total_points}")
print(f"Total Cards: \n{total_card_copies}")