Skip to content

Instantly share code, notes, and snippets.

@purplemonkeymad
Created December 2, 2023 21:19
Show Gist options
  • Save purplemonkeymad/983eec7ff0629e8834163b17ec673958 to your computer and use it in GitHub Desktop.
Save purplemonkeymad/983eec7ff0629e8834163b17ec673958 to your computer and use it in GitHub Desktop.
2023 day 2
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