Advertisement
Ladies_Man

Economical Polish ntn. Эк. вычисление RPN

Mar 20th, 2014
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.82 KB | None | 0 0
  1. package main
  2.  
  3. import "fmt"
  4. import "strconv"
  5.  
  6. func main() {
  7.     signs := make([]string, 0)
  8.     chars := make([]string, 0)
  9.     brcks := make([]string, 0)
  10.     dict := make(map[string]string)
  11.    
  12. //delete expression that has already been used
  13.     lex_cut := func(ptr bool) {
  14.         if ptr != true {
  15.                         brcks = brcks[:len(brcks)-1] //'('
  16.             signs = signs[:len(signs)-1]  //'$'
  17.             chars = chars[:len(chars)-2]   //'ab'
  18.             brcks = brcks[:len(brcks)-1]     //')'
  19.             return
  20.         } else {
  21.             chars = chars[:len(chars)-2]
  22.             return
  23.         }
  24.     }
  25.     j := 1
  26.     var brcls, c, s, res int
  27.     //var str string
  28.     newj := strconv.Itoa(j)
  29.    
  30.     fmt.Scanf ("%d\n", &str)
  31.     if len(str) == 1 { goto exit }
  32.        
  33.     for _, x := range str {
  34.             switch {
  35.             case x == '#':
  36.                 signs = append(signs, string(x))
  37.                 s++
  38.                 //fmt.Printf("-#-")
  39.             case x == '$':
  40.                 signs = append(signs, string(x))
  41.                 s++
  42.                 //fmt.Printf("-$-")
  43.             case x == '@':
  44.                 signs = append(signs, string(x))
  45.                 s++
  46.                 //fmt.Printf("-@-")
  47.             case 'a' <= x && x <= 'z':
  48.                 chars = append(chars, string(x))
  49.                 c++
  50.                 //fmt.Printf("-a-")
  51.             case x == '(':
  52.                 continue
  53.             case x == ')':
  54.                 //fmt.Printf(">> ")
  55.                 brcks = append(brcks, string(x))
  56.                 brcls++
  57.                 min_expr := RPN_to_STD_notation(signs, chars, brcls)
  58.                 //check if it exists in dictionary
  59.                 _, ok := dict[min_expr]
  60.                
  61.                 if ok {
  62.                     //if exists -> delete
  63.                     brcks = brcks[:len(brcks)-1]
  64.                     signs = signs[:len(signs)-1]
  65.                     chars := chars[:len(chars)-2]
  66.                                         brcks = brcks[:len(brcks)-1]
  67.                     chars[len(chars)-1] = string(newj)
  68.                 } else {
  69.                     //else mark and add
  70.                     dict[min_expr] = string(brcls)
  71.                     lex_cut(ok)
  72.                     chars = append(chars, string(brcls))
  73.                     res++
  74.                 }
  75.  
  76.             }
  77.         }
  78.     }
  79.     fmt.Printf("%d", res)
  80.         exit:
  81.     fmt.Printf("0")
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement