one file per day

This commit is contained in:
Rupus Reinefjord 2023-12-06 13:16:37 +01:00
parent 24ed30fbe6
commit 5886e0b12c
4 changed files with 49 additions and 43 deletions

View file

@ -1,5 +1,4 @@
import std/[math, sequtils, strutils]
import d01_1
func calcDigitLookup(): seq[(string, string)] =
let digits = {
@ -21,9 +20,25 @@ func calcDigitLookup(): seq[(string, string)] =
const digits = calcDigitLookup()
when isMainModule:
proc calibrationValue(line: string): int =
var digits: seq[char]
for ch in line:
if ch.isDigit():
digits.add(ch)
result = parseInt(digits[0] & digits[^1])
proc p1(input: string) =
let lines = input.strip().splitLines()
echo lines.map(calibrationValue).sum()
proc p2(input: string) =
let
input = stdin.readAll().strip()
input = input.strip()
realInput = input.multiReplace(digits)
lines = realInput.splitLines()
echo lines.map(calibrationValue).sum()
when isMainModule:
let input = stdin.readAll()
p1(input)
p2(input)

View file

@ -1,12 +0,0 @@
import std/[math, sequtils, strutils]
proc calibrationValue*(line: string): int =
var digits: seq[char]
for ch in line:
if ch.isDigit():
digits.add(ch)
result = parseInt(digits[0] & digits[^1])
when isMainModule:
var input = stdin.readAll().strip().splitLines()
echo input.map(calibrationValue).sum()

View file

@ -6,14 +6,14 @@ type
green: int
blue: int
CubeSet* = object
red*: int
green*: int
blue*: int
CubeSet = object
red: int
green: int
blue: int
Game* = object
id*: int
sets*: seq[CubeSet]
Game = object
id: int
sets: seq[CubeSet]
const rules = Rules(red: 12, green: 13, blue: 14)
@ -26,7 +26,7 @@ func isPossible(rules: Rules, cubes: CubeSet): bool =
return false
return true
func parseGame*(game: string): Game =
func parseGame(game: string): Game =
let
sp = game.split({':', ';'})
sets = sp[1..^1]
@ -50,9 +50,18 @@ func parseGame*(game: string): Game =
cubes.blue = amount
result.sets.add(cubes)
when isMainModule:
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
proc p1(input: string) =
let
input = stdin.readAll().strip().splitLines()
input = input.strip().splitLines()
games = input.map(parseGame)
possibleIds =
collect:
@ -63,3 +72,15 @@ when isMainModule:
break gameBlock
game.id
echo possibleIds.sum()
proc p2(input: string) =
let
input = input.strip().splitLines()
games = input.map(parseGame).mapIt(it.sets)
fewest = games.map(fewestCubes)
echo fewest.mapIt(it.red * it.green * it.blue).sum()
when isMainModule:
let input = stdin.readAll()
p1(input)
p2(input)

View file

@ -1,18 +0,0 @@
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()