diff --git a/day-04/src/part02.py b/day-04/src/part02.py index c40e8e0..9716499 100644 --- a/day-04/src/part02.py +++ b/day-04/src/part02.py @@ -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}"); \ No newline at end of file +print("===================================\n") +print(f"Total Points: \n{total_points}") +print(f"Total Cards: \n{total_card_copies}") \ No newline at end of file