-
-
Save purplemonkeymad/983eec7ff0629e8834163b17ec673958 to your computer and use it in GitHub Desktop.
2023 day 2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import re | |
import argparse | |
___game_maxes = { | |
"red":12, | |
"green":13, | |
"blue":14 | |
} | |
def _parse_roll(string): | |
regex_items = [r'\b(\d+) (red)\b',r'\b(\d+) (green)\b',r'\b(\d+) (blue)\b'] | |
roll_object = {"red":0,"green":0,"blue":0} | |
for color in regex_items: | |
match = re.search(color,string) | |
if match == None: | |
continue | |
roll_object[match.group(2)] = int(match.group(1)) | |
return roll_object | |
def _parse_game(string: str): | |
game_part,roll_list_part = string.split(':',maxsplit=1) | |
game = int(game_part.split(' ')[1]) | |
roll_list = [_parse_roll(x) for x in roll_list_part.split(';')] | |
game_object = { | |
"game": game, | |
"rolls": roll_list | |
} | |
return game_object | |
def _test_game(game): | |
for x in game['rolls']: | |
if (x['red'] > ___game_maxes['red']): | |
return False | |
if (x['green'] > ___game_maxes['green']): | |
return False | |
if (x['blue'] > ___game_maxes['blue']): | |
return False | |
return True | |
def _min_game(game): | |
mingame = {"red":0,"green":0,"blue":0} | |
for x in game['rolls']: | |
if (x['red'] > mingame['red']): | |
mingame['red'] = x['red'] | |
if (x['green'] > mingame['green']): | |
mingame['green'] = x['green'] | |
if (x['blue'] > mingame['blue']): | |
mingame['blue'] = x['blue'] | |
return mingame | |
def main(line_list): | |
games = [_parse_game(x) for x in line_list] | |
print("found {} games".format(len(games))) | |
#part1 | |
valid_games = [x for x in games if _test_game(x)] | |
total = sum([x['game'] for x in valid_games]) | |
print("part 1 total {}".format(total)) | |
# part 2 | |
min_games = [_min_game(x) for x in games] | |
total = 0 | |
for g in min_games: | |
value = 1 | |
for v in g.values(): | |
value = value * v | |
total = total + value | |
print("part 2 total {}".format(total)) | |
if __name__ == "__main__": | |
parser = argparse.ArgumentParser(description="day 1 solver") | |
parser.add_argument("-input",type=str) | |
parser.add_argument("-part",type=int) | |
args = parser.parse_args() | |
filename = args.input | |
if filename == None: | |
parser.print_help() | |
exit(1) | |
file = open(filename,'r') | |
main([line.rstrip('\n') for line in file.readlines()]) | |
file.close() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment