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