blob: 0af39de8b203d692c27f28db99be37629903de02 [file] [log] [blame]
Robert Griesemer9bc7b082008-05-08 17:12:15 -07001// $G $F.go && $L $F.$A && ./$A.out
2
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
7package main
8
9// brainfuck
10
Rob Pikee430ee62010-09-04 10:40:00 +100011var p, pc int
12var a [30000]byte
13const prog = "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.!"
14
15func scan(dir int) {
16 for nest := dir; dir*nest > 0; pc += dir {
17 switch prog[pc+dir] {
18 case ']':
19 nest--
20 case '[':
21 nest++
22 }
23 }
24}
25
Robert Griesemer9bc7b082008-05-08 17:12:15 -070026func main() {
Rob Pikec0c30252008-05-15 15:20:59 -070027 for {
28 switch prog[pc] {
29 case '>':
Rob Pikee430ee62010-09-04 10:40:00 +100030 p++
Rob Pikec0c30252008-05-15 15:20:59 -070031 case '<':
Rob Pikee430ee62010-09-04 10:40:00 +100032 p--
Rob Pikec0c30252008-05-15 15:20:59 -070033 case '+':
Rob Pikee430ee62010-09-04 10:40:00 +100034 a[p]++
Rob Pikec0c30252008-05-15 15:20:59 -070035 case '-':
Rob Pikee430ee62010-09-04 10:40:00 +100036 a[p]--
Rob Pikec0c30252008-05-15 15:20:59 -070037 case '.':
Rob Pikee430ee62010-09-04 10:40:00 +100038 print(string(a[p]))
Rob Pikec0c30252008-05-15 15:20:59 -070039 case '[':
40 if a[p] == 0 {
Rob Pikee430ee62010-09-04 10:40:00 +100041 scan(1)
Rob Pikec0c30252008-05-15 15:20:59 -070042 }
43 case ']':
44 if a[p] != 0 {
Rob Pikee430ee62010-09-04 10:40:00 +100045 scan(-1)
Rob Pikec0c30252008-05-15 15:20:59 -070046 }
47 default:
Rob Pikee430ee62010-09-04 10:40:00 +100048 return
Rob Pikec0c30252008-05-15 15:20:59 -070049 }
Rob Pikee430ee62010-09-04 10:40:00 +100050 pc++
Rob Pikec0c30252008-05-15 15:20:59 -070051 }
Robert Griesemer9bc7b082008-05-08 17:12:15 -070052}