package day3 import ( "bufio" "fmt" "os" ) func in_set(target rune, set []rune) bool { for _, char := range set { if char == target { return true } } return false } func priority(value rune) int { var base_value int = 0 if value >= 'A' && value <= 'Z' { base_value = int('A') - 27 } if value >= 'a' && value <= 'z' { base_value = int('a') - 1 } return int(value) - base_value } func part1_addition(runes []rune) int { var total int = 0 midpoint := len(runes) / 2 left_runes := runes[0:midpoint] right_runes := runes[midpoint:] for pos, char := range left_runes { if !in_set(char, left_runes[0:pos]) { if in_set(char, right_runes) { total += priority(char) } } } return total } func score_badge(set1 []rune, set2 []rune, set3 []rune) int { for pos, char := range set1 { if !in_set(char, set1[0:pos]) { if in_set(char, set2) && in_set(char, set3) { return priority(char) } } } fmt.Println("PANIC: Couldn't find overlapping badge item") return 0 } func Run(filename string) { file, err := os.Open(filename) if err != nil { fmt.Println("Error opening file:", err) return } scanner := bufio.NewScanner(file) scanner.Split(bufio.ScanLines) var total_overlap int = 0 var total_badge int = 0 var grouping [][]rune = [][]rune{} for scanner.Scan() { line := scanner.Text() runes := []rune(line) total_overlap += part1_addition(runes) grouping = append(grouping, runes) if len(grouping) == 3 { total_badge += score_badge(grouping[0], grouping[1], grouping[2]) grouping = [][]rune{} } } file.Close() fmt.Println("Total initial score is", total_overlap) fmt.Println("Total badge score is", total_badge) }