标签:style blog http color io os ar for strong
啦啦啦转载自coolshell.cn,作者陈皓
Brainfuck,是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。这种语言有时被称为brainf**k或brainf***,甚至被简称为BF。这种 语言,是一种按照“Turing complete(完整图灵机)”思想设计的语言,它的主要设计思路是:用最小的概念实现一种“简单”的语言,BrainF**k 语言只有八种符号,所有的操作都由这八种符号的组合来完成。
BF基于一个简单的机器模型,除了八个指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。
下面是这八种指令的描述,其中每个指令由一个字符标识:
| 字符 | 含义 |
|---|---|
> |
指针加一 |
< |
指针减一 |
+ |
指针指向的字节的值加一 |
- |
指针指向的字节的值减一 |
. |
输出指针指向的单元内容(ASCII码) |
, |
输入内容到指针指向的单元(ASCII码) |
[ |
如果指针指向的单元值为零,向后跳转到对应的]指令的次一指令处 |
] |
如果指针指向的单元值不为零,向前跳转到对应的[指令的次一指令处 |
(按照更节省时间的简单说法,]也可以说成“向后跳转到对应的[状态”。这两解释是一样的。)
(第三种同价的说法,[意思是"向前跳转到对应的]“,]意思是”向后跳转到对应的[指令的次一指令处,如果指针指向的字节非零。”)
Brainfuck程序可以用下面的替换方法翻译成C语言(假设ptr是char*类型):
| Brainfuck | C |
|---|---|
> |
++ptr; |
< |
--ptr; |
+ |
++*ptr; |
- |
--*ptr; |
. |
putchar(*ptr); |
, |
*ptr =getchar(); |
[ |
while (*ptr) { |
] |
} |
#include <stdio.h>
#include <stdlib.h>//exit()函数的头文件
/*hello_world_BF.txt
out.txt
*/
int p, r, q;
char a[5000], f[5000], b, o, *s=f;
void interpret(char *c)
{
char *d;
r++;
while( *c ) {
//if(strchr("<>;+-,.[]\n",*c))printf("%c",*c);
switch(o=1,*c++) {
case ‘<‘: p--; break;
case ‘>‘: p++; break;
case ‘+‘: a[p]++; break;
case ‘-‘: a[p]--; break;
case ‘.‘: putchar(a[p]); fflush(stdout); break;
case ‘,‘: a[p]=getchar();fflush(stdout); break;
case ‘[‘:
for( b=1,d=c; b && *c; c++ )
b+=*c==‘[‘, b-=*c==‘]‘;
if(!b) {
c[-1]=0;
while( a[p] )
interpret(d);
c[-1]=‘]‘;
break;
}
case ‘]‘:
puts("UNBALANCED BRACKETS"), exit(0);
case ‘#‘:
if(q>2)
printf("%2d %2d %2d %2d %2d %2d %2d %2d %2d %2d\n%*s\n",
*a,a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],3*p+2,"^");
break;
default: o=0;
}
if( p<0 || p>100)
puts("RANGE ERROR"), exit(0);
}
r--;
// chkabort();
}
int main(int argc,char *argv[])
{
FILE *z;
q=argc;
// if(z=fopen(argv[1],"r")) {
if(z=fopen("hello_world_BF.txt","r")) {
while( (b=getc(z))>0 )
*s++=b;
*s=0;
interpret(f);
}
fclose(z);
return 0;
}
测试样例:
+++ +++ +++ + initialize counter (cell #0) to 10
[ use loop to set the next four cells to 70/100/30/10
> +++ +++ + add 7 to cell #1
> +++ +++ +++ + add 10 to cell #2
> +++ add 3 to cell #3
> + add 1 to cell #4
<<< < - decrement counter (cell #0)
]
>++ . print ‘H‘
>+. print ‘e‘
+++ +++ +. print ‘l‘
. print ‘l‘
+++ . print ‘o‘
>++ . print ‘ ‘
<<+ +++ +++ +++ +++ ++. print ‘W‘
>. print ‘o‘
+++ . print ‘r‘
--- --- . print ‘l‘
--- --- --. print ‘d‘
>+. print ‘!‘
>. print ‘\n‘
标签:style blog http color io os ar for strong
原文地址:http://www.cnblogs.com/likeatree/p/4004347.html