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  }