123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- package main
- import (
- "bufio"
- "errors"
- "fmt"
- "io"
- "log"
- "os"
- )
- func isDigit(b byte) bool {
- if '0' <= b && b <= '9' {
- return true
- }
- return false
- }
- type State struct {
- buf []byte
- a []byte
- b []byte
- sum int
- }
- func (st *State) Reset() {
- st.buf = st.buf[:0]
- st.a = st.a[:0]
- st.b = st.b[:0]
- }
- func main() {
- r := bufio.NewReader(os.Stdin)
- fmt.Println(process(r))
- }
- func process(r *bufio.Reader) int {
- st := State{
- buf: make([]byte, 0, 16),
- a: make([]byte, 0, 3),
- b: make([]byte, 0, 3),
- }
- for {
- e, err := r.ReadByte()
- if errors.Is(err, io.EOF) {
- break
- }
- if err != nil {
- log.Fatalf("Unable to read input: %v", err)
- }
- event(&st, e)
- }
- return st.sum
- }
- func event(st *State, e byte) {
- switch {
- case len(st.buf) == 5 && e == ')':
- if len(st.a) == 0 || len(st.b) == 0 {
- st.Reset()
- break
- }
- s := 1
- for j, c := range st.a {
- if j > 0 {
- s *= 10
- }
- ss := s
- for k, d := range st.b {
- if k > 0 {
- ss *= 10
- }
- sum := int(c) * int(d) * ss
- st.sum += sum
- }
- }
- st.Reset()
- case len(st.buf) == 5 && isDigit(e):
- if len(st.a) == 3 {
- st.Reset()
- break
- }
- st.b = append(st.b, e-48)
- case len(st.buf) == 4 && isDigit(e):
- if len(st.a) == 3 {
- st.Reset()
- break
- }
- st.a = append(st.a, e-48)
- case len(st.buf) == 4 && e == ',' ||
- len(st.buf) == 3 && e == '(' ||
- len(st.buf) == 2 && e == 'l' ||
- len(st.buf) == 1 && e == 'u' ||
- len(st.buf) == 0 && e == 'm':
- st.buf = append(st.buf, e)
- default:
- st.Reset()
- }
- }
|