day 4
This commit is contained in:
		
							
								
								
									
										135
									
								
								04/main.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										135
									
								
								04/main.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,135 @@
 | 
				
			|||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"bufio"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"strconv"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func mustAtoi(line []rune) int {
 | 
				
			||||||
 | 
						i, _ := strconv.Atoi(string(line))
 | 
				
			||||||
 | 
						return i
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func main() {
 | 
				
			||||||
 | 
						start := time.Now()
 | 
				
			||||||
 | 
						partOne()
 | 
				
			||||||
 | 
						duration := time.Since(start)
 | 
				
			||||||
 | 
						partTwo()
 | 
				
			||||||
 | 
						duration2 := time.Since(start)
 | 
				
			||||||
 | 
						fmt.Printf("p1: %s, p2: %s\n", duration, duration2-duration)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func makeScanner(test bool) *bufio.Scanner {
 | 
				
			||||||
 | 
						var f *os.File
 | 
				
			||||||
 | 
						if test {
 | 
				
			||||||
 | 
							f, _ = os.Open("inputs/testinput")
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							f, _ = os.Open("inputs/input")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						reader := bufio.NewReader(f)
 | 
				
			||||||
 | 
						return bufio.NewScanner(reader)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func partOne() {
 | 
				
			||||||
 | 
						scanner := makeScanner(false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sum := 0
 | 
				
			||||||
 | 
						for scanner.Scan() {
 | 
				
			||||||
 | 
							line := scanner.Text()
 | 
				
			||||||
 | 
							draws := map[int]struct{}{}
 | 
				
			||||||
 | 
							state := 0
 | 
				
			||||||
 | 
							acc := []rune{}
 | 
				
			||||||
 | 
							score := 0
 | 
				
			||||||
 | 
							for _, c := range line {
 | 
				
			||||||
 | 
								// slice off the 'game :' part
 | 
				
			||||||
 | 
								if state == 0 {
 | 
				
			||||||
 | 
									if c == ':' {
 | 
				
			||||||
 | 
										state = 1
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								switch c {
 | 
				
			||||||
 | 
								case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
 | 
				
			||||||
 | 
									acc = append(acc, c)
 | 
				
			||||||
 | 
								case '|':
 | 
				
			||||||
 | 
									state = 2
 | 
				
			||||||
 | 
									acc = []rune{}
 | 
				
			||||||
 | 
								case ' ':
 | 
				
			||||||
 | 
									if len(acc) != 0 && state == 1 {
 | 
				
			||||||
 | 
										draws[mustAtoi(acc)] = struct{}{}
 | 
				
			||||||
 | 
									} else if state == 2 {
 | 
				
			||||||
 | 
										if _, ok := draws[mustAtoi(acc)]; ok {
 | 
				
			||||||
 | 
											if score == 0 {
 | 
				
			||||||
 | 
												score = 1
 | 
				
			||||||
 | 
											} else {
 | 
				
			||||||
 | 
												score *= 2
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									acc = []rune{}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if _, ok := draws[mustAtoi(acc)]; ok {
 | 
				
			||||||
 | 
								if score == 0 {
 | 
				
			||||||
 | 
									score = 1
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									score *= 2
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							sum += score
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						fmt.Println(sum)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func partTwo() {
 | 
				
			||||||
 | 
						scanner := makeScanner(false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						card := 1
 | 
				
			||||||
 | 
						dupes := map[int]int{}
 | 
				
			||||||
 | 
						sum := 0
 | 
				
			||||||
 | 
						for scanner.Scan() {
 | 
				
			||||||
 | 
							line := scanner.Text()
 | 
				
			||||||
 | 
							draws := map[int]struct{}{}
 | 
				
			||||||
 | 
							state := 0
 | 
				
			||||||
 | 
							acc := []rune{}
 | 
				
			||||||
 | 
							score := 0
 | 
				
			||||||
 | 
							dupes[card]++
 | 
				
			||||||
 | 
							for _, c := range line {
 | 
				
			||||||
 | 
								// slice off the 'game :' part
 | 
				
			||||||
 | 
								if state == 0 {
 | 
				
			||||||
 | 
									if c == ':' {
 | 
				
			||||||
 | 
										state = 1
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								switch c {
 | 
				
			||||||
 | 
								case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
 | 
				
			||||||
 | 
									acc = append(acc, c)
 | 
				
			||||||
 | 
								case '|':
 | 
				
			||||||
 | 
									state = 2
 | 
				
			||||||
 | 
									acc = []rune{}
 | 
				
			||||||
 | 
								case ' ':
 | 
				
			||||||
 | 
									if len(acc) != 0 && state == 1 {
 | 
				
			||||||
 | 
										draws[mustAtoi(acc)] = struct{}{}
 | 
				
			||||||
 | 
									} else if state == 2 {
 | 
				
			||||||
 | 
										if _, ok := draws[mustAtoi(acc)]; ok {
 | 
				
			||||||
 | 
											score++
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									acc = []rune{}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if _, ok := draws[mustAtoi(acc)]; ok {
 | 
				
			||||||
 | 
								score++
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							for i := card + 1; i <= card+score; i++ {
 | 
				
			||||||
 | 
								dupes[i] += dupes[card]
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							sum += dupes[card]
 | 
				
			||||||
 | 
							card++
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						fmt.Println(sum)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user