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 }