blob: acbe85b646ce7671dafc290afe39afb5aa5fe9e7 [file] [log] [blame]
Colin Cross7bb052a2015-02-03 12:59:37 -08001// run
2
3// Copyright 2009 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7// Test simulating a Turing machine, sort of.
8
9package main
10
11// brainfuck
12
13var p, pc int
14var a [30000]byte
15
16const prog = "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.!"
17
18func scan(dir int) {
19 for nest := dir; dir*nest > 0; pc += dir {
20 switch prog[pc+dir] {
21 case ']':
22 nest--
23 case '[':
24 nest++
25 }
26 }
27}
28
29func main() {
30 r := ""
31 for {
32 switch prog[pc] {
33 case '>':
34 p++
35 case '<':
36 p--
37 case '+':
38 a[p]++
39 case '-':
40 a[p]--
41 case '.':
42 r += string(a[p])
43 case '[':
44 if a[p] == 0 {
45 scan(1)
46 }
47 case ']':
48 if a[p] != 0 {
49 scan(-1)
50 }
51 default:
52 if r != "Hello World!\n" {
53 panic(r)
54 }
55 return
56 }
57 pc++
58 }
59}