93 lines
1.7 KiB
Go
93 lines
1.7 KiB
Go
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)
|
|
}
|