91 lines
1.3 KiB
Go
91 lines
1.3 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"fmt"
|
||
|
"os"
|
||
|
)
|
||
|
|
||
|
func main() {
|
||
|
inp := StdinToStrings()
|
||
|
for i := range inp {
|
||
|
ln, gb := RemoveGarbage(inp[i])
|
||
|
fmt.Print(ln)
|
||
|
v := FindGroupValue(ln)
|
||
|
fmt.Println(" :: Value:", v, ":: Garbage:", gb)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func FindGroupValue(inp string) int {
|
||
|
var ret, depth int
|
||
|
for i := 0; i < len(inp); i++ {
|
||
|
switch inp[i] {
|
||
|
case '{':
|
||
|
depth++
|
||
|
ret += depth
|
||
|
case '}':
|
||
|
depth--
|
||
|
}
|
||
|
}
|
||
|
return ret
|
||
|
}
|
||
|
|
||
|
func GetOuterGroup(inp string) string {
|
||
|
var ret string
|
||
|
gCount := 1
|
||
|
for i := range inp[1:] {
|
||
|
if gCount == 0 {
|
||
|
break
|
||
|
}
|
||
|
ret += string(inp[i])
|
||
|
switch inp[i] {
|
||
|
case '{':
|
||
|
gCount++
|
||
|
case '}':
|
||
|
gCount--
|
||
|
}
|
||
|
}
|
||
|
return ret
|
||
|
}
|
||
|
|
||
|
func RemoveGarbage(inp string) (string, int) {
|
||
|
var ret string
|
||
|
var isGarbage, ignore bool
|
||
|
var cnt int
|
||
|
for i := 0; i < len(inp); i++ {
|
||
|
if isGarbage {
|
||
|
if ignore {
|
||
|
ignore = false
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
switch inp[i] {
|
||
|
case '!':
|
||
|
ignore = true
|
||
|
continue
|
||
|
case '>':
|
||
|
isGarbage = false
|
||
|
default:
|
||
|
cnt++
|
||
|
}
|
||
|
} else {
|
||
|
switch inp[i] {
|
||
|
case '<':
|
||
|
isGarbage = true
|
||
|
default:
|
||
|
ret += string(inp[i])
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return ret, cnt
|
||
|
}
|
||
|
|
||
|
func StdinToStrings() []string {
|
||
|
var input []string
|
||
|
scanner := bufio.NewScanner(os.Stdin)
|
||
|
for scanner.Scan() {
|
||
|
input = append(input, scanner.Text())
|
||
|
}
|
||
|
return input
|
||
|
}
|