烧脑语言Brainfuck及其加减乘除

Brainfuck,文如其名,为“烧脑”而生,简称BF。
BF由Urban Müller于1993年创建,是满足图灵完备性(Turing complete)的一种极小化的计算机语言。
小到什么程度?
BF一共只有8种符号 <>+-.,[] ,编译器也只有区区200多个字节。
用BF写的程序那叫一个不忍直视,好不烧脑!
不信?猜猜下面这行BF代码是干啥用的!

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

结果是输出下面这几个再熟悉不过的字符:

在这里插入图片描述

怎么突然感觉这世界有点陌生了?Oh, f**k!

指令符号

BF只有8种操作符号,对应8种指令:

字符含义C语言描述
>指针前进一位++ptr;
<指针后退一位--ptr;
+指针指向的字节值加一++*ptr;
-指针指向的字节值减一--*ptr;
.输出指针所指向的字节值putchar(*ptr);
,输入一字节值并存储到指针所指向的字节中*ptr = getchar();
[如果指针的值为0,则跳过匹配的]继续向前执行while(*ptr){
]跳到前面匹配的[执行,直到指针的值为0}

下面就是200多个字节的BF官方编译器代码(稍作修改),编译之后就可以运行“烧脑”的BF程序了~

#include <stdio.h>
#include <stdlib.h>int p, r, q;
char a[5000], f[5000], b, o, *s=f;void interpret(char *c)
{char *d;int tmp;r++;while(*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 ',':tmp = getchar();if(tmp==EOF)a[p]=0;elsea[p]=tmp;break;case '[':for(b=1,d=c; b && *c; c++){if(*c=='[')b += 1;else if(*c==']')b -= 1;}if(b==0){*(c-1)=0;while(a[p])interpret(d);*(c-1)=']';break;}case ']':puts("UNBALANCED BRACKETS");exit(0);default:o=0;}if(p<0||p>100){puts("RANGE ERROR");exit(0);}}r--;
}int main(int argc, char* argv[])
{FILE* z;q=argc;if((z=fopen(argv[1], "r"))){while((b=getc(z))>0){*s++ = b;}*s=0;interpret(f);}return 0;
}

简单例子

1. 将指针当前位置的值清零:

[-]

2. 将当前指针以及之前位置的值都清零:

[[-]<]

3. 从键盘读取一个ASCII字符并输出到屏幕上:

,.

一位数的加减乘除

1. 加法

BF代码:

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

说明:
BF指针每次只读写一个字节,即一个ASCII字符,当用户输入“a+b”(a,b均为个位数),BF将在字节中存入字符对应的ASCII值,所以这个字节中存储的值并不等于该数字,而是比数字大48,因为“0”的ASCII值是48,所以a+b要减去一个48才能得到正确的ASCII字符。
比如:“3”的ASCII值为51,“5”的ASCII值为53,51-48+53=3+53=56,这正是“8”的ASCII值。而如果直接把“3”和“5”的ASCII值相加,则得51+53=104,对应的ASCII字符是“h”。
你可以在BF代码里面写48个减号,但这样就太不雅观了而且很容易出错,考虑48=6x8,所以可以先定义一个字节c=6,然后用一个while循环,每次c减1, a减8,这样当c减为0时a刚好减了48,代码就是:>++++++[<-------->-],这时a的字节存储的值才等于真正的数字a,而b字节存储的仍是数字b的ASCII符号的值,这时把a,b两个字节的值相加,就能够得到数字a+b的正确ASCII字符:[<+>-]<.
最后的,.是读取换行符然后在打印结果后输出一个换行。

【测试】

在这里插入图片描述

2. 减法

BF代码:

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

【测试】

在这里插入图片描述

3. 乘法

BF代码:

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

【测试】

在这里插入图片描述

4. 除法

先写一个整除的BF程序:

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

【测试】

在这里插入图片描述

但是遇到不能整除的情况,结果就不对了。

在这里插入图片描述

因为BF的除法是用减法来实现的,比如计算a/b,不断地 --b, --a,当b为0的时候再复位b,并将一个计数位c加一,然后再次运行 --b, --a,这里有两个while循环,外循环的终止条件是a=0,内循环的终止条件是b=0,如果a,b同时为0(b整除a),此时内外循环同时结束,读取计数位c的值就是商。但是如果b不整除a,由于内循环只判断b是否为0而不判断a是否为0,所以会导致a为负数因而外循环不会正常结束或者出错,我们需要在内循环中每一步也要判断a是否为0,而BF语言并没有if-else这样的条件分支语句,这就是处理非整除情况的难点。
经过一番苦思冥想,我终于想到了一个办法。
先在输入开头预留5个字节(01000),考虑在内循环再嵌入一个微循环,该循环在做完 --a之后判断a是否为0,如果a不为0则进入微循环[>>>>>]指针右移5个字节至一个空字节,微循环结束,接着执行<<<<左移4个字节,整体效果就相当于右移了一个字节到b,为什么要这么折腾呢?因为当a=0时指针不会进入微循环,而是直接执行<<<<左移4个字节,这时候就定位到了开头预留的第二个字节1,而指针把这个位置的值当作b,减一之后变成b=0了,内循环结束,指针把第一个字节当作a,读入a=0,所以外循环也结束,然后定位到计数位c取值即可。
这个微循环就相当于goto语句,当a=0时就跳转到预留的位置,相当于提前结束了循环,当b整除a的时候,计算结果c比正确值少1,所以程序在读入用户输入的a值后先把a加1。
以下为修改后的除法程序:

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

【测试】

整除:

在这里插入图片描述
在这里插入图片描述

非整除:

在这里插入图片描述
在这里插入图片描述

【结论】

一般来说,只要有分支判断语句和类似于数组的结构,这门语言就应该具备图灵完备性,BF语言就是一个很好的例证。
本文抛砖引玉,更多有趣的性质还有待大家一起研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/40674.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端面试题

前端面试题 目录 前端面试题React相关1.说说React生命周期中有哪些坑&#xff1f;为什么要溢出will相关生命周期2. 说说Real diff算法是怎么运作的&#xff0c;从tree层到component层到element层分别讲解&#xff1f;3.调和阶段setState干了什么4.css3的新特性都有哪些5.说说re…

李德毅院士:人工智能看哲学

Datawhale干货 作者&#xff1a;李德毅院士&#xff0c;来源&#xff1a;图灵人工智能 作者简介&#xff1a;李德毅&#xff0c;中国人民解放军军事科学院研究员&#xff0c;中国工程院院士&#xff0c;国际欧亚科学院院 士。研究方向为计算机工程、不确定性人工智能、数据挖掘…

李德毅 | 人工智能看哲学

来源&#xff1a;图灵人工智能 作者&#xff1a;李德毅 中国人民解放军军事科学院研究员、中国工程院院士、国际欧亚科学院院士 摘要&#xff1a;本文探讨哲学和神学、科学之间的关系&#xff0c;探讨智慧和智能的关系&#xff1b;认为哲学不是科学&#xff0c;也不是科学的科学…

【其他】邮箱的IMAP/SMTP服务开启与关闭(实现邮箱发送验证码的前提)

IMAP是什么&#xff1f; IMAP&#xff0c;即Internet Message Access Protocol&#xff08;互联网邮件访问协议&#xff09;&#xff0c;您可以通过这种协议从邮件服务器上获取邮件的信息、下载邮件等。IMAP与POP类似&#xff0c;都是一种邮件获取协议。 临时授权码 也就是开启…

gmail用outlook不断提示密码--开启了二步验证后惹的过

如果你近来gmail用outlook不断提示密码&#xff0c;那你好好想想有没有开启了二步验证的功能了&#xff08;就是登录要输入手机验证码&#xff09; 解决办法就是去你的google账号里生成一个专用密码&#xff0c;重新更新你的专用密码&#xff0c; 以下是outlook&#xff0c; g…

Gmail邮件发送失败被退信[代码:421 4.7.0]

文章目录 问题描述问题分析解决步骤 问题描述 客户公司邮件服务器发送邮件到gmail 个人邮箱或企业邮箱都会被拦截。退信信息参考如下&#xff1a; 421, "4.7.0", Our system has detected an unusual rate of unsolicited mail originating from your IP address.…

登录功能中发送邮箱验证的简单使用

登录功能中发送邮箱验证的简单使用 java开发中常用的邮箱相关的就是给邮箱发送验证码&#xff0c;发送验证码在java中使用javamail&#xff0c;它提供了一套发送和接收功能的标准&#xff0c;支持协议&#xff1a;smtp&#xff0c;pop3&#xff0c;imap。其中smtp负责发送邮件…

邮件二次验证

import smtplib from email.mime.text import MIMEText# 第三方 SMTP 服务 mail_host "smtp.sina.cn" # SMTP服务器 #网易是 smtp.163.com #腾讯是 smtp.qq.com mail_user "perfectcrmsina.cn" # 用户名#新浪邮箱账号或者163和QQ 的邮箱账号 …

Sendmail配置以及验证成功

Sendmail服务安装&#xff0c;已经安装了sendmail,没有安装的可以用yum安装 yum install sendmail sendmail-cf -y 配置 2018skills.com和lin.2018skills.com两个区域邮件服务 创建两个用户winmail,linmail; 配置用户发邮件的附件大小5MB vim /etc/mail/sendmail.cf 用户winmai…

多模态应用展望——看图聊天、BLIP2

看图聊天 BLIP2 是 salesforce 公司开源的多模态模型&#xff0c;其大致的原理&#xff0c;可以类比看图写作&#xff0c;当前 AI 在文生图模式之外&#xff0c;也支持图生文模式&#xff0c;可以将照片中的核心元素识别出来。然后把这些元素作为上下文&#xff0c;交给 ChatG…

多模态梳理

一、多模态学习基本概念 1 背景 人们听到的声音、看到的实物、闻到的味道都是一种模态&#xff0c;人们生活在一个多种模态相互交融的环境中。为了使人工智能更好地理解世界&#xff0c;必须赋予人工智能学习、理解和推理多模态信息的能力。多模态学习指建立模型使机器从多模…

由ChatGPT谈谈下一代多模态模型的雏形

来源&#xff1a;蘑菇先生学习记 NewBeeNLP https://zhuanlan.zhihu.com/p/606364639 本文约5800字&#xff0c;建议阅读11分钟 本文浅谈对多模态模型的新的认识。 最近ChatGPT风头正劲&#xff0c;但只能理解文字或多或少限制其才华的发挥。得益于Transformer在NLP和CV领域的大…

(多模态 / 多维度)特征融合

文章目录 模式分类中的特征融合方法引入现状 ( < 2017)算法基于贝叶斯理论的特征融合算法决策级水平融合(*)特征级水平融合 基于稀疏表示理论的特征融合算法基于深度学习的特征融合算法 偏传统的特征融合方法[^6]一些多模态特征融合的思路方法[^7]基于线性规划模型基于稀疏高…

学习笔记:多模态

1.多模态数据&#xff1a; 不同的存在形式或信息来源均可被称之为一种模态。由两种或两种以上模态组成的数据称之为多模态数据&#xff08;多模态用来表示不同形态的数据形式&#xff0c;或者同种形态不同的格式&#xff0c;一般表示文本、图片、音频、视频、混合数据&#xf…

多模态 跨模态|人机交互新突破!

我们对世界的认知和体验是多模式的&#xff0c;我们看向窗外&#xff0c;听到雨滴&#xff0c;闻到青草的味道&#xff0c;触摸到木板的纹理... 某种意义上来说&#xff0c;AI 就是赋予机器类人的感知和智慧&#xff0c;想要让 AI 理解我们周围的世界&#xff0c;它需要同时解释…

基于LLMs的多模态大模型(Visual ChatGPT,PICa,MM-REACT,MAGIC)

当LLMs已经拥有了极强的对话能力后&#xff0c;如何使其拥有视觉和语音等多模态能力是紧接而来的热点&#xff08;虽然GPT4已经有了&#xff09;&#xff0c;这个系列将不定期更新一些利用LLMs做多模态任务的文章。 直觉上&#xff0c;如果直接训练一个类似chatgpt架构的多模态…

2021年5月9日,是第108个母亲节,祝福所有的母亲节日快乐

2021年5月9日&#xff0c;是第108个母亲节&#xff0c;祝福所有的母亲节日快乐 2021年5月9日&#xff0c;是第108个母亲节&#xff0c;放下你手里的所有事情&#xff0c;哪怕是几分钟&#xff0c;给妈妈打一个电话吧&#xff0c;分享一下你最近的酸甜苦辣。 或许你忙到没有准备…

母亲节:向世界上最伟大的母爱致敬

在这世间众多的亲情关系中&#xff0c;有一种关系无与伦比&#xff0c;毫不费力地凌驾于其他任何已知的地球关系之上。这种非凡的关系就是母亲与子女之间的关系。 母亲对家庭无尽的爱、奉献和忠诚使这份感情无价。为了向全球所有母亲表示敬意&#xff0c;母亲节在世界46个国家庆…

原来程序员的母亲节可以这样温馨!

致我的可爱老妈 嗨&#xff0c;忙碌的程序员宝宝们&#xff0c;记得母亲节快要来了吗&#xff1f; 在老妈眼里&#xff0c;你一出生&#xff0c;她就觉得你是一个天才。无论你的代码写得多好看&#xff0c;老妈看不懂你的代码&#xff0c;在老妈的世界里&#xff0c;她会跳很带…