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