-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
89 lines (84 loc) · 1.45 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package main
import (
"bufio"
"flag"
"fmt"
"io/ioutil"
"os"
"strings"
)
const MAXN = 100000
var mem [MAXN]int
var jmp [MAXN]int
var stack [MAXN]int
var cmd [MAXN]string
var pointer int = 0
func run(data *bufio.Scanner, printstr bool) {
ind := 0
stackp := 0
for data.Scan() {
c := data.Text()
cmd[ind] = c
if c == "[" {
stack[stackp] = ind
stackp++
}
if c == "]" {
stackp--
jmp[stack[stackp]] = ind
jmp[ind] = stack[stackp]
}
ind++
}
for i := 0; i < ind; i++ {
cur := cmd[i]
if cur == ">" {
pointer++
}
if cur == "<" {
pointer--
}
if cur == "+" {
mem[pointer]++
}
if cur == "-" {
mem[pointer]--
}
if cur == "." {
if printstr {
fmt.Print(string(mem[pointer]))
} else {
fmt.Print(mem[pointer])
}
}
if cur == "," {
var n int
fmt.Print("\ninput:")
_, err := fmt.Scanf("%d", &n)
if err != nil {
fmt.Println(err)
}
mem[pointer] = n
}
if cur == "[" && mem[pointer] == 0 {
i = jmp[i]
}
if cur == "]" && mem[pointer] != 0 {
i = jmp[i]
}
}
}
func main() {
filename := flag.String("fn", "", "filename to parse(required)")
pntstr := flag.Bool("ps", false, "whether or not the program outputs the string")
flag.Parse()
filebuffer, err := ioutil.ReadFile(*filename)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
inputdata := string(filebuffer)
data := bufio.NewScanner(strings.NewReader(inputdata))
data.Split(bufio.ScanRunes)
run(data, *pntstr)
}