Advertisement
Guest User

Untitled

a guest
Dec 10th, 2021
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.67 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "sort"
  5.     "strings"
  6. )
  7.  
  8. func PartOne(input []string) (result int) {
  9.     closed := map[rune]int{')': 3, ']': 57, '}': 1197, '>': 25137}
  10.     for _, line := range input {
  11.         line = RemoveSimpleToken(line)
  12.         for _, c := range line {
  13.             if v, ok := closed[c]; ok {
  14.                 result += v
  15.                 break
  16.             }
  17.         }
  18.     }
  19.     return
  20. }
  21.  
  22. func PartTwo(input []string) (result int) {
  23.     closed := make([]string, 0)
  24.     for _, line := range input {
  25.         s := CloseChunks(line)
  26.         if s != "" {
  27.             closed = append(closed, s)
  28.         }
  29.     }
  30.     values := make([]int, 0)
  31.     for _, v := range closed {
  32.         values = append(values, Calculate(v))
  33.     }
  34.     sort.Ints(values)
  35.     return values[len(values)/2]
  36. }
  37.  
  38. func RemoveSimpleToken(s string) string {
  39.     save := s
  40.     s = strings.ReplaceAll(s, "()", "")
  41.     s = strings.ReplaceAll(s, "[]", "")
  42.     s = strings.ReplaceAll(s, "{}", "")
  43.     s = strings.ReplaceAll(s, "<>", "")
  44.     if save == s {
  45.         return s
  46.     }
  47.     return RemoveSimpleToken(s)
  48. }
  49.  
  50. func CloseChunks(input string) (s string) {
  51.     closed := map[rune]struct{}{')': {}, ']': {}, '}': {}, '>': {}}
  52.     incomplete := true
  53.     input = RemoveSimpleToken(input)
  54.     for _, c := range input {
  55.         if _, ok := closed[c]; ok {
  56.             incomplete = false
  57.             break
  58.         }
  59.     }
  60.     if incomplete {
  61.         for i := len(input) - 1; i >= 0; i-- {
  62.             c := input[i]
  63.             switch c {
  64.             case '(':
  65.                 s += string(')')
  66.             case '[':
  67.                 s += string(']')
  68.             case '{':
  69.                 s += string('}')
  70.             case '<':
  71.                 s += string('>')
  72.             }
  73.         }
  74.     }
  75.     return
  76. }
  77.  
  78. func Calculate(input string) (result int) {
  79.     closed := map[rune]int{')': 1, ']': 2, '}': 3, '>': 4}
  80.     for _, c := range input {
  81.         if v, ok := closed[c]; ok {
  82.             result *= 5
  83.             result += v
  84.         }
  85.     }
  86.     return
  87. }
  88.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement