BrainFuck 以及运用(idf)

   由于这是第二次遇见了,所以在博客里分享一下,以后用的找着,话不多说,进入正题,百度之,Brainfuck是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。由于fuck在英语中是脏话,这种语言有时被称为brainf*ck或brainf**k,甚至被简称为BF。它的主要设计思路是:用最小的概念实现一种“简单”的语言,BrainF**k 语言只有八种符号,所有的操作都由这八种符号的组合来完成百度都有,我就不多复制粘贴了。

    直接看八种符号规则:

 

下面我就idf训练营ppc题做一个实例运用: 题目链接:http://ctf.idf.cn/index.php?g=game&m=article&a=index&id=54

这是什么,你能理解它吗?

 ++++++++++++[>++++>+++++>++++++>+++++++>++++++++>+++++++++>++++++++++<<<<<<<-]>>>>+++.<-----.>---.<+++.>>>>+++.<<<<----.>>>++++++.<<<<<+++.--.>>>>>----.<<<++++.<<+++.>>>>+++.>---.>++.

百度brainfuck编辑器代码

  1. #include <stdlib.h>  
  2. #include <string.h>  
  3. #include <stdio.h>  
  4.   
  5. #define TOKENS "><+-.,[]"  
  6.   
  7. #define CODE_SEGMENT_SIZE 30000  
  8. #define STACK_SEGMENT_SIZE 1000  
  9. #define DATA_SEGMENT_SIZE 30000  
  10.   
  11. typedef void (*Callback)(void);  
  12.   
  13. struct {  
  14.   char cs[CODE_SEGMENT_SIZE];   /* Code Segment */  
  15.   long ip;                      /* Instruction Pointer */  
  16.   
  17.   char ss[STACK_SEGMENT_SIZE];  /* Stack Segment */  
  18.   long sp;                      /* Stack Pointer */  
  19.   
  20.   char ds[DATA_SEGMENT_SIZE];   /* Data Segment */  
  21.   long bp;                      /* Base Pointer */  
  22.   
  23.   Callback fn[128];  
  24. } vm;  
  25.   
  26. void vm_forward() {  
  27.   vm.bp = (vm.bp + 1) % DATA_SEGMENT_SIZE;  
  28. }  
  29.   
  30. void vm_backward() {  
  31.   vm.bp = (vm.bp + DATA_SEGMENT_SIZE - 1) % DATA_SEGMENT_SIZE;  
  32. }  
  33.   
  34. void vm_increment() {  
  35.   vm.ds[vm.bp]++;  
  36. }  
  37.   
  38. void vm_decrement() {  
  39.   vm.ds[vm.bp]--;  
  40. }  
  41.   
  42. void vm_input() {  
  43.   vm.ds[vm.bp] = getchar();  
  44. }  
  45.   
  46. void vm_output() {  
  47.   putchar(vm.ds[vm.bp]);  
  48. }  
  49.   
  50. void vm_while_entry() {  
  51.   if (vm.ds[vm.bp]) {  
  52.     vm.ss[vm.sp] = vm.ip - 1;  
  53.     vm.sp++;  
  54.   } else {  
  55.     int c = 1;  
  56.     for (vm.ip++; vm.cs[vm.ip] && c; vm.ip++) {  
  57.       if (vm.cs[vm.ip] == '[') {  
  58.         c++;  
  59.       } else if (vm.cs[vm.ip] == ']') {  
  60.         c--;  
  61.       }  
  62.     }  
  63.   }  
  64. }  
  65.   
  66. void vm_while_exit() {  
  67.   if (vm.ds[vm.bp]) {  
  68.     vm.sp--;  
  69.     vm.ip = vm.ss[vm.sp];  
  70.   }  
  71. }  
  72.   
  73. void setup() {  
  74.   int c;  
  75.   int i;  
  76.   
  77.   memset(&vm, 0, sizeof(vm));  
  78.   vm.fn['>'] = vm_forward;  
  79.   vm.fn['<'] = vm_backward;  
  80.   vm.fn['+'] = vm_increment;  
  81.   vm.fn['-'] = vm_decrement;  
  82.   vm.fn['.'] = vm_output;  
  83.   vm.fn[','] = vm_input;  
  84.   vm.fn['['] = vm_while_entry;  
  85.   vm.fn[']'] = vm_while_exit;  
  86.   
  87.   for (i = 0; (c = getchar()) != EOF;) {  
  88.     if (strchr(TOKENS, c)) {  
  89.       vm.cs[i] = c;  
  90.       i++;  
  91.     }  
  92.   }  
  93. }  
  94.   
  95. void run() {  
  96.   while (vm.cs[vm.ip]) {  
  97.     vm.fn[vm.cs[vm.ip]]();  
  98.     vm.ip++;  
  99.   }  
  100. }  
  101.   
  102. int main(int argc, char* argv[]) {  
  103.   if (argc > 1) {  
  104.     freopen(argv[1], "r", stdin);  
  105.   }  
  106.   
  107.   setup();  
  108.   run();  
  109.   
  110.   return 0;  
  111. }

将其代码保存为1.c

在linux平台下用gcc编译  gcc 1.c -o test 意思是用gcc编译1.c代码生成test文件

 然后将题目的特殊字符写到一个记事本里面,重命名2.bf文件,在同一目录下,运行 ./test 2.bf

 

 

 

 

  

posted @ 2015-06-13 22:34  hack0ne  阅读(1239)  评论(0编辑  收藏  举报