|  | // 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++ | 
|  | } | 
|  | } |