| // run | 
 |  | 
 | // Copyright 2009 The Go Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style | 
 | // license that can be found in the LICENSE file. | 
 |  | 
 | // Test simulating a Turing machine, sort of. | 
 |  | 
 | package main | 
 |  | 
 | // brainfuck | 
 |  | 
 | var p, pc int | 
 | var a [30000]byte | 
 |  | 
 | const prog = "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.!" | 
 |  | 
 | func scan(dir int) { | 
 | 	for nest := dir; dir*nest > 0; pc += dir { | 
 | 		switch prog[pc+dir] { | 
 | 		case ']': | 
 | 			nest-- | 
 | 		case '[': | 
 | 			nest++ | 
 | 		} | 
 | 	} | 
 | } | 
 |  | 
 | func main() { | 
 | 	r := "" | 
 | 	for { | 
 | 		switch prog[pc] { | 
 | 		case '>': | 
 | 			p++ | 
 | 		case '<': | 
 | 			p-- | 
 | 		case '+': | 
 | 			a[p]++ | 
 | 		case '-': | 
 | 			a[p]-- | 
 | 		case '.': | 
 | 			r += string(a[p]) | 
 | 		case '[': | 
 | 			if a[p] == 0 { | 
 | 				scan(1) | 
 | 			} | 
 | 		case ']': | 
 | 			if a[p] != 0 { | 
 | 				scan(-1) | 
 | 			} | 
 | 		default: | 
 | 			if r != "Hello World!\n" { | 
 | 				panic(r) | 
 | 			} | 
 | 			return | 
 | 		} | 
 | 		pc++ | 
 | 	} | 
 | } |