| 
									
										
										
										
											2012-02-16 23:51:04 -05:00
										 |  |  | // run | 
					
						
							| 
									
										
										
										
											2008-05-08 17:12:15 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | // 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. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-24 11:48:19 +11:00
										 |  |  | // Test simulating a Turing machine, sort of. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-08 17:12:15 -07:00
										 |  |  | package main | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // brainfuck | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-04 10:40:00 +10:00
										 |  |  | var p, pc int | 
					
						
							|  |  |  | var a [30000]byte | 
					
						
							| 
									
										
										
										
											2012-01-18 13:20:55 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-04 10:40:00 +10:00
										 |  |  | const prog = "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.!" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func scan(dir int) { | 
					
						
							|  |  |  | 	for nest := dir; dir*nest > 0; pc += dir { | 
					
						
							|  |  |  | 		switch prog[pc+dir] { | 
					
						
							| 
									
										
										
										
											2012-01-18 13:20:55 -08:00
										 |  |  | 		case ']': | 
					
						
							|  |  |  | 			nest-- | 
					
						
							|  |  |  | 		case '[': | 
					
						
							|  |  |  | 			nest++ | 
					
						
							| 
									
										
										
										
											2010-09-04 10:40:00 +10:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-08 17:12:15 -07:00
										 |  |  | func main() { | 
					
						
							| 
									
										
										
										
											2012-01-18 14:31:31 -08:00
										 |  |  | 	r := "" | 
					
						
							| 
									
										
										
										
											2008-05-15 15:20:59 -07:00
										 |  |  | 	for { | 
					
						
							|  |  |  | 		switch prog[pc] { | 
					
						
							| 
									
										
										
										
											2012-01-18 13:20:55 -08:00
										 |  |  | 		case '>': | 
					
						
							|  |  |  | 			p++ | 
					
						
							|  |  |  | 		case '<': | 
					
						
							|  |  |  | 			p-- | 
					
						
							|  |  |  | 		case '+': | 
					
						
							|  |  |  | 			a[p]++ | 
					
						
							|  |  |  | 		case '-': | 
					
						
							|  |  |  | 			a[p]-- | 
					
						
							|  |  |  | 		case '.': | 
					
						
							| 
									
										
										
										
											2012-01-18 14:31:31 -08:00
										 |  |  | 			r += string(a[p]) | 
					
						
							| 
									
										
										
										
											2012-01-18 13:20:55 -08:00
										 |  |  | 		case '[': | 
					
						
							|  |  |  | 			if a[p] == 0 { | 
					
						
							|  |  |  | 				scan(1) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		case ']': | 
					
						
							|  |  |  | 			if a[p] != 0 { | 
					
						
							|  |  |  | 				scan(-1) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		default: | 
					
						
							| 
									
										
										
										
											2012-01-18 14:31:31 -08:00
										 |  |  | 			if r != "Hello World!\n" { | 
					
						
							|  |  |  | 				panic(r) | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2012-01-18 13:20:55 -08:00
										 |  |  | 			return | 
					
						
							| 
									
										
										
										
											2008-05-15 15:20:59 -07:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2010-09-04 10:40:00 +10:00
										 |  |  | 		pc++ | 
					
						
							| 
									
										
										
										
											2008-05-15 15:20:59 -07:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-05-08 17:12:15 -07:00
										 |  |  | } |