package main import ( "bufio" "fmt" "log" "math" "os" "strconv" "strings" ) func main() { inp := StdinToStrings() part1(inp) part2(inp) } func part1(inp []string) { fmt.Println("= Part 1 =") var chk int for i := range inp { cells := strings.Split(inp[i], "\t") max, min := -1, -1 for j := range cells { tst := Atoi(cells[j]) if tst > max { max = tst } if min < 0 || tst < min { min = tst } } chk += (max - min) } fmt.Println("Checksum: ", chk) fmt.Println("") } func part2(inp []string) { fmt.Println("= Part 2 =") var chk int for i := range inp { cells := strings.Split(inp[i], "\t") var foundIt bool for j := range cells { for k := j; k < len(cells); k++ { jVal, kVal := Atoi(cells[j]), Atoi(cells[k]) if isThePair(jVal, kVal) { foundIt = true chk += getResult(jVal, kVal) break } } if foundIt { break } } } fmt.Println("Checksum: ", chk) fmt.Println("") } func isThePair(k, j int) bool { if k == j { return false } jVal, kVal := float64(j), float64(k) return math.Mod(jVal, kVal) == 0 || math.Mod(kVal, jVal) == 0 } func getResult(k, j int) int { if k > j { return k / j } return j / k } func StdinToStrings() []string { var input []string scanner := bufio.NewScanner(os.Stdin) for scanner.Scan() { input = append(input, scanner.Text()) } return input } func Atoi(i string) int { var ret int var err error if ret, err = strconv.Atoi(i); err != nil { log.Fatal("Invalid Atoi") } return ret }