From 5d7ee2e5028cb283735b6788fa046843ed1f0821 Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Fri, 10 Dec 2021 21:41:37 +0100 Subject: Added solutions for 10th day : syntax scoring --- 2021/10/second.go | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 2021/10/second.go (limited to '2021/10/second.go') diff --git a/2021/10/second.go b/2021/10/second.go new file mode 100644 index 0000000..69bd104 --- /dev/null +++ b/2021/10/second.go @@ -0,0 +1,86 @@ +package main + +import ( + "bufio" + "fmt" + "os" + "sort" +) + +type stack []byte + +func (s *stack) clear() { + *s = make(stack, 0) +} + +func (s *stack) push(b byte) { + *s = append(*s, b) +} + +func (s *stack) pop() *byte { + l := len(*s) + if l == 0 { + return nil + } else { + elt := (*s)[l-1] + *s = (*s)[:l-1] + return &elt + } +} + +func main() { + scores := make([]int, 0) + s := make(stack, 0) + + scanner := bufio.NewScanner(os.Stdin) +out: + for scanner.Scan() { + line := scanner.Text() + s.clear() + for i := 0; i < len(line); i++ { + c := line[i] + if c == '(' || c == '[' || c == '{' || c == '<' { + s.push(c) + continue + } + b := s.pop() + switch c { + case ')': + if *b != '(' { + continue out + } + case ']': + if *b != '[' { + continue out + } + case '}': + if *b != '{' { + continue out + } + case '>': + if *b != '<' { + continue out + } + } + } + score := 0 + for c := s.pop(); c != nil; c = s.pop() { + score *= 5 + switch *c { + case '(': + score += 1 + case '[': + score += 2 + case '{': + score += 3 + case '<': + score += 4 + } + } + if score != 0 { + scores = append(scores, score) + } + } + sort.Ints(scores) + fmt.Println(scores[len(scores)/2]) +} -- cgit v1.2.3