github.com/cycloss/advent-of-code@v0.0.0-20221210145555-15039b95faa6/2021/day1/day1.go (about) 1 package main 2 3 import ( 4 "bufio" 5 "fmt" 6 "os" 7 "strconv" 8 ) 9 10 func main() { 11 var file, err = os.Open("day1/day1.txt") 12 if err != nil { 13 fmt.Println(err) 14 } 15 defer file.Close() 16 17 solve(file) 18 } 19 20 type ringBuffer struct { 21 index int 22 cap int 23 buffer []*int 24 } 25 26 func newBuffer(cap int) *ringBuffer { 27 var buff = make([]*int, cap, cap) 28 return &ringBuffer{0, cap, buff} 29 } 30 31 func (b *ringBuffer) sum() int { 32 var total = 0 33 for _, v := range b.buffer { 34 total += *v 35 } 36 return total 37 } 38 39 func (b *ringBuffer) getWriteIndex() int { 40 return b.index % b.cap 41 } 42 43 func (b *ringBuffer) insertValue(val int) { 44 b.buffer[b.getWriteIndex()] = &val 45 b.index++ 46 } 47 48 func (b *ringBuffer) full() bool { 49 return b.buffer[b.getWriteIndex()] != nil 50 } 51 52 const windowSize1 = 1 53 const windowSize2 = 3 54 55 func solve(file *os.File) { 56 var buff = bufio.NewScanner(file) 57 58 var ringBuff1 = newBuffer(windowSize1) 59 var increaseCount1 = 0 60 var increaseCount2 = 0 61 var ringBuff2 = newBuffer(windowSize2) 62 63 for buff.Scan() { 64 var depth = buff.Text() 65 var currentDepth, err = strconv.Atoi(depth) 66 if err != nil { 67 panic(fmt.Sprintf("Failed to convert line: %s. Error: %v\n", depth, err)) 68 } 69 if windowIncreased(ringBuff1, currentDepth) { 70 increaseCount1++ 71 } 72 if windowIncreased(ringBuff2, currentDepth) { 73 increaseCount2++ 74 } 75 } 76 fmt.Printf("Sea bed increased: %d times\n", increaseCount1) 77 fmt.Printf("Sea bed increased: %d times in sliding windows of %d\n", increaseCount2, windowSize2) 78 79 } 80 81 func windowIncreased(depthBuffer *ringBuffer, newVal int) bool { 82 83 if depthBuffer.full() { 84 var prevSum = depthBuffer.sum() 85 depthBuffer.insertValue(newVal) 86 var currentSum = depthBuffer.sum() 87 return currentSum > prevSum 88 } else { 89 depthBuffer.insertValue(newVal) 90 return false 91 } 92 }