Day 2a
This commit is contained in:
parent
7e3b20a8c8
commit
8b6ea615f7
82
day02/day02.go
Normal file
82
day02/day02.go
Normal file
|
@ -0,0 +1,82 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Game struct {
|
||||
id int
|
||||
sets []Set
|
||||
}
|
||||
|
||||
type Set struct {
|
||||
red int
|
||||
green int
|
||||
blue int
|
||||
}
|
||||
|
||||
func parseGame(input string) Game {
|
||||
idStr, setsStr, _ := strings.Cut(input, ": ")
|
||||
|
||||
var game Game
|
||||
var err error
|
||||
|
||||
game.id, err = strconv.Atoi(strings.TrimPrefix(idStr, "Game "))
|
||||
|
||||
for i, setStr := range strings.Split(setsStr, "; ") {
|
||||
game.sets = append(game.sets, Set{})
|
||||
for _, colorStr := range strings.Split(setStr, ", ") {
|
||||
if strings.HasSuffix(colorStr, " red") {
|
||||
game.sets[i].red, err = strconv.Atoi(strings.TrimSuffix(colorStr, " red"))
|
||||
}
|
||||
if strings.HasSuffix(colorStr, " green") {
|
||||
game.sets[i].green, err = strconv.Atoi(strings.TrimSuffix(colorStr, " green"))
|
||||
}
|
||||
if strings.HasSuffix(colorStr, " blue") {
|
||||
game.sets[i].blue, err = strconv.Atoi(strings.TrimSuffix(colorStr, " blue"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
panic("day02: invalid game format")
|
||||
}
|
||||
|
||||
return game
|
||||
}
|
||||
|
||||
func isGameValid(game Game) bool {
|
||||
for _, set := range game.sets {
|
||||
if set.red > 12 || set.green > 13 || set.blue > 14 {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func ScanFile(file *os.File) (int, error) {
|
||||
scanner := bufio.NewScanner(file)
|
||||
sum := 0
|
||||
for scanner.Scan() {
|
||||
if game := parseGame(scanner.Text()); isGameValid(game) {
|
||||
sum += game.id
|
||||
}
|
||||
}
|
||||
if err := scanner.Err(); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return sum, nil
|
||||
}
|
||||
|
||||
func main() {
|
||||
sum, err := ScanFile(os.Stdin)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Invalid input: %s\n", err)
|
||||
return
|
||||
}
|
||||
fmt.Println(sum)
|
||||
}
|
31
day02/day02_test.go
Normal file
31
day02/day02_test.go
Normal file
|
@ -0,0 +1,31 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestScanFile(t *testing.T) {
|
||||
cases := []struct {
|
||||
inFile string;
|
||||
want int;
|
||||
}{
|
||||
{"input1.txt", 8},
|
||||
}
|
||||
|
||||
for _, c := range cases {
|
||||
f, err := os.Open(c.inFile)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
got, err := ScanFile(f)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if got != c.want {
|
||||
t.Errorf("ScanFile(%q) == %d, want %d", c.inFile, got, c.want)
|
||||
}
|
||||
}
|
||||
}
|
5
day02/input1.txt
Normal file
5
day02/input1.txt
Normal file
|
@ -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
|
Loading…
Reference in a new issue