2023 day02
This commit is contained in:
		
							parent
							
								
									4b49e6b86c
								
							
						
					
					
						commit
						24ed30fbe6
					
				
					 2 changed files with 83 additions and 0 deletions
				
			
		
							
								
								
									
										65
									
								
								2023/day02/d02_1.nim
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								2023/day02/d02_1.nim
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,65 @@
 | 
				
			||||||
 | 
					import std/[math, sequtils, strutils, sugar]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type
 | 
				
			||||||
 | 
					  Rules = object
 | 
				
			||||||
 | 
					    red: int
 | 
				
			||||||
 | 
					    green: int
 | 
				
			||||||
 | 
					    blue: int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  CubeSet* = object
 | 
				
			||||||
 | 
					    red*: int
 | 
				
			||||||
 | 
					    green*: int
 | 
				
			||||||
 | 
					    blue*: int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  Game* = object
 | 
				
			||||||
 | 
					    id*: int
 | 
				
			||||||
 | 
					    sets*: seq[CubeSet]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const rules = Rules(red: 12, green: 13, blue: 14)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func isPossible(rules: Rules, cubes: CubeSet): bool =
 | 
				
			||||||
 | 
					  if cubes.red > rules.red:
 | 
				
			||||||
 | 
					    return false
 | 
				
			||||||
 | 
					  if cubes.green > rules.green:
 | 
				
			||||||
 | 
					    return false
 | 
				
			||||||
 | 
					  if cubes.blue > rules.blue:
 | 
				
			||||||
 | 
					    return false
 | 
				
			||||||
 | 
					  return true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func parseGame*(game: string): Game =
 | 
				
			||||||
 | 
					  let
 | 
				
			||||||
 | 
					    sp = game.split({':', ';'})
 | 
				
			||||||
 | 
					    sets = sp[1..^1]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  result.id = sp[0].split(' ')[1].parseInt()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  for set in sets:
 | 
				
			||||||
 | 
					    var cubes = CubeSet()
 | 
				
			||||||
 | 
					    for reveal in set.split(','):
 | 
				
			||||||
 | 
					      let
 | 
				
			||||||
 | 
					        sp = reveal.strip().split(' ')
 | 
				
			||||||
 | 
					      let
 | 
				
			||||||
 | 
					        amount = sp[0].strip().parseInt()
 | 
				
			||||||
 | 
					        colour = sp[1]
 | 
				
			||||||
 | 
					      case colour
 | 
				
			||||||
 | 
					      of "red":
 | 
				
			||||||
 | 
					        cubes.red = amount
 | 
				
			||||||
 | 
					      of "green":
 | 
				
			||||||
 | 
					        cubes.green = amount
 | 
				
			||||||
 | 
					      of "blue":
 | 
				
			||||||
 | 
					        cubes.blue = amount
 | 
				
			||||||
 | 
					    result.sets.add(cubes)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					when isMainModule:
 | 
				
			||||||
 | 
					  let
 | 
				
			||||||
 | 
					    input = stdin.readAll().strip().splitLines()
 | 
				
			||||||
 | 
					    games = input.map(parseGame)
 | 
				
			||||||
 | 
					    possibleIds =
 | 
				
			||||||
 | 
					      collect:
 | 
				
			||||||
 | 
					        for game in games:
 | 
				
			||||||
 | 
					          block gameBlock:
 | 
				
			||||||
 | 
					            for set in game.sets:
 | 
				
			||||||
 | 
					              if not rules.isPossible(set):
 | 
				
			||||||
 | 
					                break gameBlock
 | 
				
			||||||
 | 
					            game.id
 | 
				
			||||||
 | 
					  echo possibleIds.sum()
 | 
				
			||||||
							
								
								
									
										18
									
								
								2023/day02/d02_2.nim
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								2023/day02/d02_2.nim
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,18 @@
 | 
				
			||||||
 | 
					import std/[math, sequtils, strutils, sugar]
 | 
				
			||||||
 | 
					import d02_1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func fewestCubes(sets: seq[CubeSet]): CubeSet =
 | 
				
			||||||
 | 
					  for cubes in sets:
 | 
				
			||||||
 | 
					    if cubes.red > result.red:
 | 
				
			||||||
 | 
					      result.red = cubes.red
 | 
				
			||||||
 | 
					    if cubes.green > result.green:
 | 
				
			||||||
 | 
					      result.green = cubes.green
 | 
				
			||||||
 | 
					    if cubes.blue > result.blue:
 | 
				
			||||||
 | 
					      result.blue = cubes.blue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					when isMainModule:
 | 
				
			||||||
 | 
					  let
 | 
				
			||||||
 | 
					    input = stdin.readAll().strip().splitLines()
 | 
				
			||||||
 | 
					    games = input.map(parseGame).mapIt(it.sets)
 | 
				
			||||||
 | 
					    fewest = games.map(fewestCubes)
 | 
				
			||||||
 | 
					  echo fewest.mapIt(it.red * it.green * it.blue).sum()
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue