Dag: 10
SprÄk: Go
var chars map[rune]rune = map[rune]rune{
'(': ')',
'[': ']',
'{': '}',
'<': '>',
}
type stack []rune
func main() {
fileName := "input.txt"
input, err := helpers.ReadLines(fileName)
if err != nil {
panic(err)
}
fmt.Println(syntaxChecker(input))
}
func syntaxChecker(input []string) (incorrect, incomplete int) {
incompleteScores := make([]int, 0)
for _, line := range input {
result, faulty := checkLine(line)
if faulty {
incorrect += result
} else {
incompleteScores = append(incompleteScores, result)
}
}
sort.Ints(incompleteScores)
return incorrect, incompleteScores[len(incompleteScores)/2]
}
func checkLine(input string) (result int, incomplete bool) {
stack := make(stack, 0)
for _, r := range input {
if _, ok := chars[r]; ok {
stack.push(r)
} else {
opening, _ := stack.pop()
if chars[opening] != r {
return getIncorrectScore(r), true
}
}
}
return getStackScore(stack), false
}
func getStackScore(s stack) (result int) {
for i := len(s) - 1; i >= 0; i-- {
result *= 5
result += getIncompleteScore(s[i])
}
return
}
func getIncompleteScore(r rune) int {
switch r {
case '(':
return 1
case '[':
return 2
case '{':
return 3
case '<':
return 4
default:
return 0
}
}
func getIncorrectScore(r rune) int {
switch r {
case ')':
return 3
case ']':
return 57
case '}':
return 1197
case '>':
return 25137
default:
return 0
}
}
func (s *stack) isEmpty() bool {
return len(*s) == 0
}
func (s *stack) pop() (rune, bool) {
if s.isEmpty() {
return ' ', true
}
element := (*s)[len((*s))-1]
*s = (*s)[:len((*s))-1]
return element, false
}
func (s *stack) push(element rune) {
*s = append(*s, element)
}