Day 2a
This commit is contained in:
		
							parent
							
								
									7e3b20a8c8
								
							
						
					
					
						commit
						8b6ea615f7
					
				
					 3 changed files with 118 additions and 0 deletions
				
			
		
							
								
								
									
										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…
	
	Add table
		Add a link
		
	
		Reference in a new issue