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编辑器代码
- #include <stdlib.h>
- #include <string.h>
- #include <stdio.h>
- #define TOKENS "><+-.,[]"
- #define CODE_SEGMENT_SIZE 30000
- #define STACK_SEGMENT_SIZE 1000
- #define DATA_SEGMENT_SIZE 30000
- typedef void (*Callback)(void);
- struct {
- char cs[CODE_SEGMENT_SIZE]; /* Code Segment */
- long ip; /* Instruction Pointer */
- char ss[STACK_SEGMENT_SIZE]; /* Stack Segment */
- long sp; /* Stack Pointer */
- char ds[DATA_SEGMENT_SIZE]; /* Data Segment */
- long bp; /* Base Pointer */
- Callback fn[128];
- } vm;
- void vm_forward() {
- vm.bp = (vm.bp + 1) % DATA_SEGMENT_SIZE;
- }
- void vm_backward() {
- vm.bp = (vm.bp + DATA_SEGMENT_SIZE - 1) % DATA_SEGMENT_SIZE;
- }
- void vm_increment() {
- vm.ds[vm.bp]++;
- }
- void vm_decrement() {
- vm.ds[vm.bp]--;
- }
- void vm_input() {
- vm.ds[vm.bp] = getchar();
- }
- void vm_output() {
- putchar(vm.ds[vm.bp]);
- }
- void vm_while_entry() {
- if (vm.ds[vm.bp]) {
- vm.ss[vm.sp] = vm.ip - 1;
- vm.sp++;
- } else {
- int c = 1;
- for (vm.ip++; vm.cs[vm.ip] && c; vm.ip++) {
- if (vm.cs[vm.ip] == '[') {
- c++;
- } else if (vm.cs[vm.ip] == ']') {
- c--;
- }
- }
- }
- }
- void vm_while_exit() {
- if (vm.ds[vm.bp]) {
- vm.sp--;
- vm.ip = vm.ss[vm.sp];
- }
- }
- void setup() {
- int c;
- int i;
- memset(&vm, 0, sizeof(vm));
- vm.fn['>'] = vm_forward;
- vm.fn['<'] = vm_backward;
- vm.fn['+'] = vm_increment;
- vm.fn['-'] = vm_decrement;
- vm.fn['.'] = vm_output;
- vm.fn[','] = vm_input;
- vm.fn['['] = vm_while_entry;
- vm.fn[']'] = vm_while_exit;
- for (i = 0; (c = getchar()) != EOF;) {
- if (strchr(TOKENS, c)) {
- vm.cs[i] = c;
- i++;
- }
- }
- }
- void run() {
- while (vm.cs[vm.ip]) {
- vm.fn[vm.cs[vm.ip]]();
- vm.ip++;
- }
- }
- int main(int argc, char* argv[]) {
- if (argc > 1) {
- freopen(argv[1], "r", stdin);
- }
- setup();
- run();
- return 0;
- }
将其代码保存为1.c
在linux平台下用gcc编译 gcc 1.c -o test 意思是用gcc编译1.c代码生成test文件
然后将题目的特殊字符写到一个记事本里面,重命名2.bf文件,在同一目录下,运行 ./test 2.bf
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步