🌅
This commit is contained in:
92
solutions/day3/day3.go
Normal file
92
solutions/day3/day3.go
Normal file
@@ -0,0 +1,92 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user