blob: acbe85b646ce7671dafc290afe39afb5aa5fe9e7 [file] [log] [blame]
Russ Cox57eb06f2012-02-16 23:51:04 -05001// run
Robert Griesemer9bc7b082008-05-08 17:12:15 -07002
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
Rob Pike80a97832012-02-24 11:48:19 +11007// Test simulating a Turing machine, sort of.
8
Robert Griesemer9bc7b082008-05-08 17:12:15 -07009package main
10
11// brainfuck
12
Rob Pikee430ee62010-09-04 10:40:00 +100013var p, pc int
14var a [30000]byte
Ian Lance Taylor6b346282012-01-18 13:20:55 -080015
Rob Pikee430ee62010-09-04 10:40:00 +100016const prog = "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.!"
17
18func scan(dir int) {
19 for nest := dir; dir*nest > 0; pc += dir {
20 switch prog[pc+dir] {
Ian Lance Taylor6b346282012-01-18 13:20:55 -080021 case ']':
22 nest--
23 case '[':
24 nest++
Rob Pikee430ee62010-09-04 10:40:00 +100025 }
26 }
27}
28
Robert Griesemer9bc7b082008-05-08 17:12:15 -070029func main() {
Ian Lance Taylorf2030932012-01-18 14:31:31 -080030 r := ""
Rob Pikec0c30252008-05-15 15:20:59 -070031 for {
32 switch prog[pc] {
Ian Lance Taylor6b346282012-01-18 13:20:55 -080033 case '>':
34 p++
35 case '<':
36 p--
37 case '+':
38 a[p]++
39 case '-':
40 a[p]--
41 case '.':
Ian Lance Taylorf2030932012-01-18 14:31:31 -080042 r += string(a[p])
Ian Lance Taylor6b346282012-01-18 13:20:55 -080043 case '[':
44 if a[p] == 0 {
45 scan(1)
46 }
47 case ']':
48 if a[p] != 0 {
49 scan(-1)
50 }
51 default:
Ian Lance Taylorf2030932012-01-18 14:31:31 -080052 if r != "Hello World!\n" {
53 panic(r)
54 }
Ian Lance Taylor6b346282012-01-18 13:20:55 -080055 return
Rob Pikec0c30252008-05-15 15:20:59 -070056 }
Rob Pikee430ee62010-09-04 10:40:00 +100057 pc++
Rob Pikec0c30252008-05-15 15:20:59 -070058 }
Robert Griesemer9bc7b082008-05-08 17:12:15 -070059}