Skip to content

Commit 97da3cb

Browse files
committed
feat(2020-18/angch): Hack
1 parent 06fddc7 commit 97da3cb

3 files changed

Lines changed: 353 additions & 0 deletions

File tree

2020-18/angch/main.go

Lines changed: 343 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,343 @@
1+
package main
2+
3+
import (
4+
"bufio"
5+
"log"
6+
"os"
7+
"strconv"
8+
"strings"
9+
)
10+
11+
func do(fileName string) (ret1 int, ret2 int) {
12+
file, err := os.Open(fileName)
13+
if err != nil {
14+
log.Fatal(err)
15+
}
16+
defer file.Close()
17+
scanner := bufio.NewScanner(file)
18+
19+
stack := make([]int, 0)
20+
opstack := make([]string, 0)
21+
_ = stack
22+
sum := 0
23+
for scanner.Scan() {
24+
l := scanner.Text()
25+
_ = l
26+
27+
if l == "" {
28+
break
29+
}
30+
31+
l = strings.ReplaceAll(l, "(", " ( ")
32+
l = strings.ReplaceAll(l, ")", " ) ")
33+
l = strings.ReplaceAll(l, " ", " ")
34+
toks := strings.Split(l, " ")
35+
num := 0
36+
op := ""
37+
for _, v := range toks {
38+
if v == "" {
39+
continue
40+
}
41+
log.Println(v, num, stack, op, opstack)
42+
if v == "*" || v == "/" || v == "+" || v == "-" {
43+
op = v
44+
continue
45+
}
46+
47+
if v == "(" {
48+
stack = append(stack, num)
49+
opstack = append(opstack, op)
50+
op = ""
51+
num = 0
52+
continue
53+
}
54+
if v == ")" {
55+
num1 := stack[len(stack)-1]
56+
stack = stack[:len(stack)-1]
57+
58+
op = opstack[len(opstack)-1]
59+
opstack = opstack[:len(opstack)-1]
60+
61+
switch op {
62+
case "+":
63+
num1 += num
64+
case "-":
65+
num1 -= num
66+
case "*":
67+
num1 *= num
68+
case "/":
69+
num1 /= num
70+
case "":
71+
num1 = num
72+
}
73+
// stack = append(stack, num1)
74+
num = num1
75+
continue
76+
}
77+
78+
num1, err := strconv.Atoi(v)
79+
if err != nil {
80+
log.Fatal(err)
81+
}
82+
83+
if op == "" {
84+
// stack = append(stack, num)
85+
num = num1
86+
} else {
87+
// num1 := stack[len(stack)-1]
88+
// stack = stack[:len(stack)-1]
89+
switch op {
90+
case "+":
91+
num1 += num
92+
case "-":
93+
num1 -= num
94+
case "*":
95+
num1 *= num
96+
case "/":
97+
num1 /= num
98+
}
99+
// stack = append(stack, num1)
100+
num = num1
101+
}
102+
// log.Print(" num", num)
103+
}
104+
log.Println("num", num)
105+
sum += num
106+
}
107+
ret1 = sum
108+
109+
return ret1, ret2
110+
}
111+
112+
func dotok(toks []string) int {
113+
stack := make([]int, 0)
114+
opstack := make([]string, 0)
115+
op := ""
116+
num := 0
117+
for _, v := range toks {
118+
if v == "" {
119+
continue
120+
}
121+
if v == "*" || v == "/" || v == "+" || v == "-" {
122+
op = v
123+
continue
124+
}
125+
126+
num1, err := strconv.Atoi(v)
127+
if err != nil {
128+
log.Fatal(err)
129+
}
130+
131+
if op == "" {
132+
// stack = append(stack, num)
133+
num = num1
134+
} else {
135+
// num1 := stack[len(stack)-1]
136+
// stack = stack[:len(stack)-1]
137+
switch op {
138+
case "+":
139+
num1 += num
140+
case "-":
141+
num1 -= num
142+
case "*":
143+
144+
num1 *= num
145+
}
146+
// stack = append(stack, num1)
147+
num = num1
148+
}
149+
// log.Print(" num", num)
150+
}
151+
152+
for {
153+
if len(opstack) == 0 {
154+
break
155+
}
156+
op = opstack[len(opstack)-1]
157+
opstack = opstack[:len(opstack)-1]
158+
159+
num1 := stack[len(stack)-1]
160+
stack = stack[:len(stack)-1]
161+
162+
switch op {
163+
case "+":
164+
num1 += num
165+
case "-":
166+
num1 -= num
167+
case "*":
168+
num1 *= num
169+
case "":
170+
num1 = num
171+
}
172+
// stack = append(stack, num1)
173+
num = num1
174+
}
175+
176+
return num
177+
}
178+
179+
func do2(fileName string) (ret1 int, ret2 int) {
180+
file, err := os.Open(fileName)
181+
if err != nil {
182+
log.Fatal(err)
183+
}
184+
defer file.Close()
185+
scanner := bufio.NewScanner(file)
186+
187+
stack := make([]int, 0)
188+
_ = stack
189+
sum := 0
190+
k := 0
191+
for scanner.Scan() {
192+
l := scanner.Text()
193+
_ = l
194+
k++
195+
196+
if l == "" {
197+
break
198+
}
199+
200+
l = strings.ReplaceAll(l, "(", " ( ")
201+
l = strings.ReplaceAll(l, ")", " ) ")
202+
l = strings.ReplaceAll(l, " ", " ")
203+
toks := strings.Split(l, " ")
204+
num := 0
205+
206+
tokbuffer := make([]string, 0)
207+
opstack := make([]string, 0)
208+
op := ""
209+
log.Println("input", toks)
210+
for _, v := range toks {
211+
if v == "" {
212+
continue
213+
}
214+
215+
// if v == "(" {
216+
// tokbuffer = append(tokbuffer, v)
217+
// continue
218+
// }
219+
220+
// if v == ")" {
221+
// toks := make([]string, 0)
222+
223+
// for {
224+
// t := tokbuffer[len(tokbuffer)-1]
225+
// tokbuffer = tokbuffer[:len(tokbuffer)-1]
226+
227+
// if t == "(" {
228+
// break
229+
// }
230+
231+
// toks = append(toks, t)
232+
// }
233+
// log.Println(" tok", toks, num)
234+
// // num = dotok(toks)
235+
// } else {
236+
237+
// tokbuffer = append(tokbuffer, v)
238+
// }
239+
// log.Print(" num", num)
240+
if v == "(" {
241+
opstack = append(opstack, v)
242+
log.Println(v, tokbuffer, opstack)
243+
continue
244+
}
245+
if v == ")" {
246+
for len(opstack) > 0 {
247+
top := opstack[len(opstack)-1]
248+
if top != "(" {
249+
tokbuffer = append(tokbuffer, top)
250+
opstack = opstack[:len(opstack)-1]
251+
} else if top == "(" {
252+
opstack = opstack[:len(opstack)-1]
253+
break
254+
}
255+
}
256+
log.Println(v, tokbuffer, opstack)
257+
continue
258+
}
259+
if v == "+" || v == "-" || v == "*" {
260+
if len(tokbuffer) == 0 || tokbuffer[len(tokbuffer)-1] == "(" {
261+
tokbuffer = append(tokbuffer, v)
262+
} else {
263+
for len(opstack) > 0 {
264+
top := opstack[len(opstack)-1]
265+
266+
if (top == "-" || top == "+") && top != "(" {
267+
tokbuffer = append(tokbuffer, top)
268+
opstack = opstack[:len(opstack)-1]
269+
continue
270+
}
271+
272+
break
273+
}
274+
opstack = append(opstack, v)
275+
}
276+
log.Println(v, tokbuffer, opstack)
277+
continue
278+
}
279+
280+
tokbuffer = append(tokbuffer, v)
281+
if op != "" {
282+
tokbuffer = append(tokbuffer, op)
283+
}
284+
log.Println(v, tokbuffer, opstack)
285+
}
286+
287+
for len(opstack) > 0 {
288+
top := opstack[len(opstack)-1]
289+
opstack = opstack[:len(opstack)-1]
290+
tokbuffer = append(tokbuffer, top)
291+
}
292+
293+
log.Println(tokbuffer, opstack)
294+
295+
stack := make([]int, 0)
296+
for _, v := range tokbuffer {
297+
log.Println("e ", v, stack)
298+
if v == "*" || v == "+" || v == "-" {
299+
n1 := stack[len(stack)-1]
300+
n2 := stack[len(stack)-2]
301+
stack = stack[:len(stack)-2]
302+
if v == "+" {
303+
n3 := n1 + n2
304+
stack = append(stack, n3)
305+
} else if v == "-" {
306+
n3 := n1 - n2
307+
stack = append(stack, n3)
308+
} else if v == "*" {
309+
n3 := n1 * n2
310+
stack = append(stack, n3)
311+
}
312+
continue
313+
}
314+
num, err := strconv.Atoi(v)
315+
if err != nil {
316+
log.Fatal(err)
317+
}
318+
stack = append(stack, num)
319+
}
320+
num = stack[0]
321+
322+
// num = dotok(toks)
323+
324+
log.Println(k, "num", num)
325+
sum += num
326+
// break
327+
}
328+
ret1 = sum
329+
330+
//3414545442547727
331+
// 3881468912309
332+
return ret1, ret2
333+
}
334+
335+
func main() {
336+
// log.Println(do("test.txt"))
337+
// log.Println(do2("test2.txt"))
338+
// log.Println(do2("test2.txt"))
339+
// log.Println(do2("test3.txt"))
340+
// log.Println(do("test2.txt"))
341+
// log.Println(do("input.txt"))
342+
log.Println(do2("input.txt"))
343+
}

2020-18/angch/test.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2 * 3 + (4 * 5)
2+
5 + (8 * 3 + 9 + 3 * 4 * 3)
3+
5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))
4+
((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2

2020-18/angch/test2.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
1 + 2 * 3 + 4 * 5 + 6
2+
1 + (2 * 3) + (4 * (5 + 6))
3+
2 * 3 + (4 * 5)
4+
5 + (8 * 3 + 9 + 3 * 4 * 3)
5+
5 * 9 * (7 * 3 * 3 + 9 * 3 + (8 + 6 * 4))
6+
((2 + 4 * 9) * (6 + 9 * 8 + 6) + 6) + 2 + 4 * 2

0 commit comments

Comments
 (0)