Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "sort"
- "strings"
- )
- func PartOne(input []string) (result int) {
- closed := map[rune]int{')': 3, ']': 57, '}': 1197, '>': 25137}
- for _, line := range input {
- line = RemoveSimpleToken(line)
- for _, c := range line {
- if v, ok := closed[c]; ok {
- result += v
- break
- }
- }
- }
- return
- }
- func PartTwo(input []string) (result int) {
- closed := make([]string, 0)
- for _, line := range input {
- s := CloseChunks(line)
- if s != "" {
- closed = append(closed, s)
- }
- }
- values := make([]int, 0)
- for _, v := range closed {
- values = append(values, Calculate(v))
- }
- sort.Ints(values)
- return values[len(values)/2]
- }
- func RemoveSimpleToken(s string) string {
- save := s
- s = strings.ReplaceAll(s, "()", "")
- s = strings.ReplaceAll(s, "[]", "")
- s = strings.ReplaceAll(s, "{}", "")
- s = strings.ReplaceAll(s, "<>", "")
- if save == s {
- return s
- }
- return RemoveSimpleToken(s)
- }
- func CloseChunks(input string) (s string) {
- closed := map[rune]struct{}{')': {}, ']': {}, '}': {}, '>': {}}
- incomplete := true
- input = RemoveSimpleToken(input)
- for _, c := range input {
- if _, ok := closed[c]; ok {
- incomplete = false
- break
- }
- }
- if incomplete {
- for i := len(input) - 1; i >= 0; i-- {
- c := input[i]
- switch c {
- case '(':
- s += string(')')
- case '[':
- s += string(']')
- case '{':
- s += string('}')
- case '<':
- s += string('>')
- }
- }
- }
- return
- }
- func Calculate(input string) (result int) {
- closed := map[rune]int{')': 1, ']': 2, '}': 3, '>': 4}
- for _, c := range input {
- if v, ok := closed[c]; ok {
- result *= 5
- result += v
- }
- }
- return
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement