12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- package main
- import (
- "bufio"
- "fmt"
- "log"
- "os"
- )
- type rucksack struct {
- first map[byte]int
- second map[byte]int
- }
- func readInput(file *os.File) []rucksack {
- scanner := bufio.NewScanner(file)
- var rucksacks []rucksack
- for scanner.Scan() {
- line := scanner.Text()
- if line == "" {
- continue
- }
- edge := len(line)
- half := edge / 2
- start := 0
- current := rucksack{make(map[byte]int), make(map[byte]int)}
- for {
- if half >= edge {
- break
- }
- current.first[line[start]]++
- current.second[line[half]]++
- start++
- half++
- }
- rucksacks = append(rucksacks, current)
- }
- return rucksacks
- }
- func getPriority(item byte) int {
- if item < 96 {
- return int(item) - 38
- }
- return int(item) - 96
- }
- func part1(rucksacks []rucksack) int {
- sum := 0
- for i := range rucksacks {
- for key, _ := range rucksacks[i].first {
- if rucksacks[i].second[key] > 0 {
- sum += getPriority(key)
- }
- }
- }
- return sum
- }
- func main() {
- if len(os.Args) < 2 {
- log.Fatal("You need to specify a file!")
- }
- filePath := os.Args[1]
- file, err := os.Open(filePath)
- if err != nil {
- log.Fatalf("Failed to open %s!\n", filePath)
- }
- rucksacks := readInput(file)
- fmt.Println("Part1:", part1(rucksacks))
- }
|