github.com/cycloss/advent-of-code@v0.0.0-20221210145555-15039b95faa6/2021/day7/day7.go (about)

     1  package main
     2  
     3  import (
     4  	"bufio"
     5  	"fmt"
     6  	"log"
     7  	"os"
     8  	"sort"
     9  	"strconv"
    10  	"strings"
    11  )
    12  
    13  func main() {
    14  	var file, err = os.Open("day7.txt")
    15  	if err != nil {
    16  		log.Fatalf("failed to open file: %v\n", err)
    17  	}
    18  	defer file.Close()
    19  	solve(file)
    20  }
    21  
    22  func solve(file *os.File) {
    23  	var buff = bufio.NewScanner(file)
    24  	var crabs = getCrabs(buff)
    25  	var medianI = getMedianI(crabs)
    26  	// 184 is best for part 1
    27  	var fuel = calculateFuelUsage(crabs, medianI-34)
    28  	fmt.Printf("Part 1 Solution: %d\n", fuel)
    29  	fmt.Printf("Part 2 Solution: %d\n", 0)
    30  
    31  }
    32  
    33  func getCrabs(buff *bufio.Scanner) []int {
    34  	var nums = []int{}
    35  	for buff.Scan() {
    36  		var line = buff.Text()
    37  		var numsRaw = strings.Split(line, ",")
    38  		for _, v := range numsRaw {
    39  			var num, err = strconv.Atoi(v)
    40  			if err != nil {
    41  				log.Fatalf("%v. %s", err, v)
    42  			}
    43  			nums = append(nums, num)
    44  		}
    45  	}
    46  	return nums
    47  }
    48  
    49  func getMedianI(crabs []int) int {
    50  	sort.Ints(crabs)
    51  	return len(crabs) / 2
    52  }
    53  
    54  func calculateFuelUsage(crabs []int, alignI int) int {
    55  	var total = 0
    56  	for _, v := range crabs {
    57  		var diff = absDiffInt(v, alignI)
    58  		// triangle number formula
    59  		total += diff * (diff + 1) / 2
    60  	}
    61  	return total
    62  }
    63  
    64  func absDiffInt(x, y int) int {
    65  	if x < y {
    66  		return y - x
    67  	}
    68  	return x - y
    69  }