day2, example ok
This commit is contained in:
parent
bdcdc1cdb6
commit
7e06806a2b
|
@ -0,0 +1,100 @@
|
||||||
|
package day2
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
var Restriction map[string]int = map[string]int{
|
||||||
|
"red": 12,
|
||||||
|
"green": 13,
|
||||||
|
"blue": 14,
|
||||||
|
}
|
||||||
|
|
||||||
|
type Game struct {
|
||||||
|
Num int
|
||||||
|
Sets [3]map[string]int
|
||||||
|
}
|
||||||
|
|
||||||
|
// now i need to encode the restriction,
|
||||||
|
// code 'compare game to restriction'
|
||||||
|
// scan though input lines, keep only numbers of games that pass the restriction, or rather sum them
|
||||||
|
|
||||||
|
func Run() int {
|
||||||
|
filename := "./day2/example"
|
||||||
|
file, err := os.Open(filename)
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Sprintf("error opening file", filename))
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(file)
|
||||||
|
|
||||||
|
result := 0
|
||||||
|
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := scanner.Text()
|
||||||
|
game := ReadLine(line)
|
||||||
|
log.Printf("reading %s got game %+v it is %t", line, game, game.isPossible(Restriction))
|
||||||
|
if game.isPossible(Restriction) {
|
||||||
|
result += game.Num
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g Game)isPossible(restriction map[string]int) bool {
|
||||||
|
for color, maxAmount := range restriction {
|
||||||
|
for _, set := range g.Sets {
|
||||||
|
seenAmount, found := set[color]
|
||||||
|
if found && seenAmount > maxAmount {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func ReadLine(line string) Game {
|
||||||
|
result := Game{}
|
||||||
|
|
||||||
|
infoIndex := strings.IndexRune(line, ':')
|
||||||
|
gameTitle := line[0:infoIndex]
|
||||||
|
titleNumStr := strings.Split(gameTitle, " ")[1]
|
||||||
|
titleNum, err := strconv.Atoi(titleNumStr)
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Sprintf("error getting game number from %s\n", line))
|
||||||
|
}
|
||||||
|
result.Num = titleNum
|
||||||
|
|
||||||
|
setsLints := strings.Split(line[infoIndex+1:], ";")
|
||||||
|
for i, set := range setsLints {
|
||||||
|
result.Sets[i] = readSet(set)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// line like this
|
||||||
|
// 8 green, 6 blue, 20 red
|
||||||
|
func readSet(setLine string) map[string]int {
|
||||||
|
result := make(map[string]int)
|
||||||
|
itemLines := strings.Split(setLine, ",")
|
||||||
|
for _, line := range itemLines {
|
||||||
|
keyValue := strings.Split(strings.Trim(line, " "), " ")
|
||||||
|
if len(keyValue) != 2 {
|
||||||
|
panic(fmt.Sprintf("part '%s' of '%s' was of wrong lenght! %+v len is %d", line, setLine, keyValue, len(keyValue)))
|
||||||
|
}
|
||||||
|
num, err := strconv.Atoi(keyValue[0])
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Sprint(setLine, line, err))
|
||||||
|
}
|
||||||
|
result[keyValue[1]] = num
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green
|
||||||
|
Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue
|
||||||
|
Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red
|
||||||
|
Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red
|
||||||
|
Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green
|
10
main.go
10
main.go
|
@ -1,13 +1,13 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"log"
|
||||||
|
|
||||||
dayone "sunshine.industries/aoc2023/day1"
|
"sunshine.industries/aoc2023/day2"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
s := "yoyo!"
|
log.Print("> starting run:")
|
||||||
fmt.Printf("hello, %s\n", s)
|
result := day2.Run()
|
||||||
dayone.Run()
|
log.Printf("day2 result: %d", result)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue