Python实现BrainFxxk虚拟机

news2024/10/7 9:25:23

Python实现BrainFxxk虚拟机


在这里插入图片描述


文章目录

    • Python实现BrainFxxk虚拟机
    • 👨‍🏫前言:什么是BrainFxxk?
    • 👨‍🔬内容一:BrainFxxk的字符标识
    • 👨‍⚖️内容二:经典案例——打印 Hello World!
    • 👨‍💻内容三:BrainFxxk编程中的加减乘除
    • 🍉文末推荐【3D科研绘图 · 与学术图表绘制从入门到精通】


👨‍🏫前言:什么是BrainFxxk?


Brainfuck是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。由于fuck在英语中是脏话,这种语言有时被称为brainf*ck或brainf**k,甚至被简称为BF。
在这里插入图片描述

👉Müller的目标是建立一种简单的、可以用最小的编译器来实现的、符合图灵完全思想的编程语言。这种语言由八种状态构成,为Amiga机器编写的编译器(第二版)只有240个字节大小!
👉就象它的名字所暗示的,brainfuck程序很难读懂。尽管如此,brainfuck图灵机一样可以完成任何计算任务。虽然brainfuck的计算方式如此与众不同,但它确实能够正确运行。
这种语言基于一个简单的机器模型,除了指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。
👉这种语言,是一种按照“Turing complete(图灵完备)”思想设计的语言,它的主要设计思路是:用最小的概念实现一种“简单”的语言,BrainF**k 语言只有八种符号,所有的操作都由这八种符号的组合来完成。

🌸🌸🌸🌷🌷🌷💐💐💐🌷🌷🌷🌸🌸🌸

👨‍🔬内容一:BrainFxxk的字符标识


👉 Brainfuck基于这样一台机器。它具有一列初始化为0的数组(数组长度最初要求是30,000,但这个标准不是必要的)和一个初始指向第一个元素的指针。
❤️该语言总共只有8个命令,除此之外所有其他字符都会被忽略👇👇👇
><+-.,[]

下面是这八种状态的描述,其中每个状态由一个字符标识:
在这里插入图片描述

🌸🌸🌸🌷🌷🌷💐💐💐🌷🌷🌷🌸🌸🌸

👨‍⚖️内容二:经典案例——打印 Hello World!


了解了关于BrainFuck的一些基本知识,接下来我们试着输出 Hello World!

1️⃣首先,如何用BF换行?

需要注意的是,BF标准规定换行符使用’\n’(10)而非’\r’(13),所以现在我们需要输出一个10。我们使用+和.两个命令

++++++++++.
这样我们就成功换行。

2️⃣但接着问题就来了,如果我要打印一个’A’(65)怎么办?写65个+?估计这样的话键盘磨损很快吧(当然如果你用程序输出程序当我没说)
这种时候,我们就需要使用乘法了。65=8*8+1,而乘法可以使用循环写,我们再引入其他几个命令。
++++++++[>++++++++<-]>+.
看这个程序,其先将当前位置加8,然后循环运行右移加8左移减1直到左侧单元为0,然后右移加1,就获得了65。这实际上就是将8加8次然后加1。用类似的方法可以大大压缩程序大小。

👋有了这些知识储备,我们就可以写一个输出"Hello, World!"的程序了
++++++++[>+++++++++<-]>.>>++++++++++[<++++++++++>-]<+.+++++++..+++.>>++++[<+++++++++++>-]<.------------.<<<+++[>+++++<-]>.>.+++.------.--------.>+.(147)
括号里就是整个程序的长度,如你所见,这是很简单的。

为了方便大家理解,我将分析过程也放在下面了😀

1.  ++++++++++ ,将 *ptr0 置为 10,用作后面循环的条件。
2.  [>+++++++>++++++++++>+++>+<<<<-] ,循环 10 次,每次执行

*(ptr0 + 1) += 7
*(ptr0 + 2) += 10
*(ptr0 + 3) += 3
*(ptr0 + 4) += 1

当循环完后

*(ptr0 + 1) = 70
*(ptr0 + 2) = 100
*(ptr0 + 3) = 30
*(ptr0 + 4) = 10

3.  >++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>. ,
这一串就是通过加减得到每个字母对应的 ascii 码,然后将其打印出来,大致过程如下

初始值:
*(ptr0 + 1) = 70
*(ptr0 + 2) = 100
*(ptr0 + 3) = 30
*(ptr0 + 4) = 10

代码计算过程:
*(ptr0 + 1) = 72 输出 'H'
*(ptr0 + 2) = 101 输出 'e'
*(ptr0 + 2) = 108 输出 'l'
*(ptr0 + 2) = 108 输出 'l'
*(ptr0 + 2)  = 111 输出 'o'
*(ptr0 + 3) = 32 输出 ' '
*(ptr0 + 1) = 87 输出 'W'
*(ptr0 + 2)  = 111 输出 'o'
*(ptr0 + 2)  = 114 输出 'r'
*(ptr0 + 2)  = 108 输出 'l'
*(ptr0 + 2)  = 100 输出 'd'
*(ptr0 + 3) = 33 输出 '!'
*(ptr0 + 4) = 10 输出 '\n'

3️⃣最后我们使用Python来模拟这个过程【代码如下👇👇👇】

import sys

def mtd(code):
    data = [0 for i in range(1000)]
    pc = 0
    ptr = 0
    skip_loop = False
    bracket_count = 0
    stack = []
    while pc < len(code):
        c = code[pc]
        if skip_loop :
            if c =='[':
                bracket_count+=1
            elif c==']':
                bracket_count -=1
                if bracket_count==0:
                    skip_loop =False
            pc+=1
            continue
        if c == '>':
            ptr +=1
            pc +=1
        elif c == '<':
            ptr -=1
            pc +=1
        elif c == '+':
            data[ptr] +=1
            pc +=1
        elif c == '-':
            data[ptr] -=1
            pc +=1
        elif c == '.':
            print(chr(data[ptr]),end="")
            pc +=1
        elif c == ',':
            pc +=1
        elif c == '[':
            if data[ptr] == 0:
                #nonlocal bracket_count,skip_loop
                bracket_count = 1
                skip_loop = True
                pc+=1
            else:
                pc+=1
                stack.append(pc)
        elif c == ']':
            if data[ptr] == 0:
                pc+=1
                stack.pop()
            else:
                pc = stack[len(stack)-1]

code = input("请输入一串代码:")
mtd(code)

让我们把上述的代码导入看看是什么样的结果吧!🙃
在这里插入图片描述
很明显,我们已经成功做到了!

🌸🌸🌸🌷🌷🌷💐💐💐🌷🌷🌷🌸🌸🌸

👨‍💻内容三:BrainFxxk编程中的加减乘除


1. x=0
x[-]
我们只需要把变量循环减到0就好了

2. x=y
x[-]tmp[-]y[x+tmp+y-]tmp[y+tmp-]x
我们可以设置一个中间变量tmp,把y同时复制到x和tmp,再把tmp复制回y。

3. x+=y
tmp[-]y[x+tmp+y-]tmp[y+tmp-]x
只需要把x=y中的清空x变量删去即可。
那么x=y+z怎么办?我们可以分别运行x=y,x+=z。这样我们就获得了结果。

4. x-=y
tmp[-]y[x-tmp+y-]tmp[y+tmp-]x
类似x+=y不解释

5.x*=y
x*y可以写作y个x相加,我们可以使用上述for循环,即

for(tmp=x,x=0;tmp;--tmp){
    x+=y;
}

翻译一下即得

tmp0[-]tmp1[-]x[tmp1+x-]tmp1[y[tmp0+x+y-]tmp0[y+tmp0-]tmp1-]x

6. x/=y
tmp0=x,x=0;
tmp1=0;
while(tmp0){
    for(tmp1=y;tmp1;--tmp1){
        --tmp0;
        if(tmp0==0){
            --tmp1;
            if(tmp1){        //如果tmp0==0时tmp1!=0,说明没有整除,x要减掉一个后面多加的1
                --x;
                tmp1=0;
            }
            ++tmp1;
        }
    }
    ++x;
}

翻译后

tmp0[-]tmp1[-]tmp2[-]tmp3[-]x[tmp0+x-]tmp0[y[tmp1+tmp2+y-]tmp2[y+tmp2-]tmp1[tmp2+tmp0-[tmp2-tmp0[tmp3+tmp0-]]tmp3[tmp0+tmp3-]tmp2[tmp1-[x-tmp1[-]]+tmp2[-]]tmp1-]x+tmp0]x

因此我们可以在上述代码的基础上,改写一个减法虚拟机👇👇👇

import sys

def mtd(x,y,code):
    data = [0 for i in range(1000)]
    data[0] = int(x)
    data[1] = int(y)
    if(data[0]<data[1]):
        t = 0;
        t = data[0]
        data[0] = data[1]
        data[1] = t
    pc = 0
    ptr = 0
    skip_loop = False
    bracket_count = 0
    stack = []
    while pc < len(code):
        c = code[pc]
        if skip_loop :
            if c =='[':
                bracket_count+=1
            elif c==']':
                bracket_count -=1
                if bracket_count==0:
                    skip_loop =False
            pc+=1
            continue
        if c == '>':
            ptr +=1
            pc +=1
        elif c == '<':
            ptr -=1
            pc +=1
        elif c == '+':
            data[ptr] +=1
            pc +=1
        elif c == '-':
            data[ptr] -=1
            pc +=1
        elif c == '.':
            print(chr(data[ptr]),end="")
            pc +=1
        elif c == ',':
            pc +=1
        elif c == '[':
            if data[ptr] == 0:
                #nonlocal bracket_count,skip_loop
                bracket_count = 1
                skip_loop = True
                pc+=1
            else:
                pc+=1
                stack.append(pc)
        elif c == ']':
            if data[ptr] == 0:
                pc+=1
                stack.pop()
            else:
                pc = stack[len(stack)-1]
    print((data[0]), end="")
x = input("请输入数字一:")
y = input("请输入数字二:")
code = '>>[-]<[<->>+<-]>[<+>-]<<'   ## x=x-y
mtd(x,y,code)

运行一下发现确实实现了想要的效果😆😆😆
在这里插入图片描述

🌸🌸🌸🌷🌷🌷💐💐💐🌷🌷🌷🌸🌸🌸

🍉文末推荐【3D科研绘图 · 与学术图表绘制从入门到精通】


🎃书籍介绍:
👉本期为大家带来的是北京大学出版社的《3D科研绘图 · 与学术图表绘制从入门到精通》
本书共7章,系统讲解了化学、材料学、生物医学等领域的作图需求和相关软件技术,并从设计基本概念、软件底层原理和案例实际操作三个方面展开全方位的教学。
本书在内容的设定和案例的选择上充分考虑了读者对象的需求,无论是刚入门的初学者还是寻求深度发展的科学可视化人员,都能从中汲取所需的知识。特别是涉及专业科学可视化部分的内容,有效填补了现有同类型参考书的空白。本书专为有图像设计需求的研究人员和科学可视化从业者编写。
在这里插入图片描述

💁‍♂️本书特色:
1.实例丰富:我们涵盖各类绘图软件与工具,让你能够自如运用不同技术绘制出高质量的图表。
2.内容全面:全流程讲解3D科研绘图与学术图表绘制的方法,有效填补了现有同类型参考书的空白。
3.经验总结:作者多年一线研发实战经验全面归纳整理,毫无保留分享技术要领。
4.大咖力荐:多位大型科技公司技术高管和高校相关领域教研专家推荐。
5.全彩印刷:图表案例精彩呈现,带来良好的阅读体验,方便理解和学习。

💁‍♂️作者介绍:
李浩东,复旦大学高分子专业博士,国内最大的3D科研绘图微信公众号“3D科研绘图”主笔,杭州思斐迩科技有限公司联合创始人之一、设计总监。曾为全球上百家高校和科研机构提供设计服务,包括中科院、清华、北大、MIT、Stanford、ETHZurich、EPFL等,设计作品被Science、Nature、JACS、Angew等知名期刊选用。目前已为浙江大学、同济大学、上海科技大学、武汉大学、中科院大连化物所、山西煤化所、青岛生物能源所等单位提供专业绘图讲座和培训,线上线下总受众数超十万人。

🧀参与形式:
👉关注➕点赞➕收藏➕评论,每人最多可以评论三条,随机抽取2位小伙伴免费送书一本🍿

🧀抽奖时间:
⏰2023-11-04 18:00

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文心一言 VS 讯飞星火 VS chatgpt (121)-- 算法导论10.4 2题

二、用go语言&#xff0c;给定一个n结点的二叉树&#xff0c;写出一个 O(n)时间的递归过程&#xff0c;将该树每个结点的关键字输出。 文心一言&#xff1a; 在Go语言中&#xff0c;你可以使用递归函数来遍历二叉树的所有节点&#xff0c;并输出每个节点的关键字。以下是一个…

Vs2019 配置全局公共库和头文件

本文参考&#xff1a;Visual Studio 2019 配置全局公共库目录 背景 在程序开发过程中&#xff0c;日志和数据格式化是必不可少的。而spdlog和fmt正好可以满足这两点并且轻量。但是如果每次新建一个项目都必须引入一次显的太繁琐。那么是否可以加入vs的公共库呢? 实施 spdlog…

vector 的 capacity 增长

在对 vector 容器 push_back 操作时&#xff0c;其capacity 会以怎样的大小进行扩容呢&#xff1f; #include <stdio.h> #include <stdlib.h> #include <vector> #include <string>int main() {std::vector<std::string> stringVec;printf(&quo…

JAVA将EEE MMM dd HH:mm:ss zzz yyyy日期格式化为yyyy-MM-dd HH:mm:ss形式

1、将EEE MMM dd HH:mm:ss zzz yyyy格式的数据转换成yyyy-MM-dd HH:mm:ss 代码如下 public static void main(String[] args) throws ParseException {String dateStr "Mon Oct 26 15:19:15 CST 2020";DateFormat cstFormate new SimpleDateFormat("yyyy-MM…

【VPX610】 青翼科技基于6U VPX总线架构的高性能实时信号处理平台

板卡概述 VPX610是一款基于6U VPX架构的高性能实时信号处理平台&#xff0c;该平台采用2片TI的KeyStone系列多核DSP TMS320C6678作为主处理单元&#xff0c;采用1片Xilinx的Virtex-7系列FPGA XC7VX690T作为协处理单元&#xff0c;具有2个FMC子卡接口&#xff0c;各个处理节点之…

成绩发布必备指南

哈喽&#xff0c;亲爱的老师们&#xff01;今天我们来聊聊一个让老师们的“成绩发布大战”变得轻松自如的秘密武器——成绩查询系统&#xff01;有了它&#xff0c;学生们可以自主查询成绩&#xff0c;再也不用老师们一个个公布成绩啦&#xff01; 那么&#xff0c;这个成绩查询…

pgsql 分组查询,每组取10条

需求&#xff1a; 按照表的字段分组&#xff0c;然后每组取10条结果&#xff0c;返回即可 sql 如下&#xff1a; SELECT* FROM (SELECT chk_id,feature_id,task_id, ROW_NUMBER () OVER (PARTITION BY chk_id ORDER BY chk_id) AS row_num FROM ics_check_report WHERE task…

【电商开放平台】五大全新API接口详解来袭~

为了给用户提供更多优质的商品&#xff0c;大多数电商开放平台为广大开发者们提供五大全新接口&#xff1a;【品牌栏目】、【单个品牌详情】、【商品评论】、【店铺转链】、【短视频商品】。除此之外&#xff0c;【高效转链】接口也进行了更新优化。 一、品牌栏目 接口亮点&am…

【自动化测试教程】Java+Selenium自动化测试环境搭建

本主要介绍以Java为基础&#xff0c;搭建Selenium自动化测试环境&#xff0c;并且实现代码编写的过程。 1.Selenium介绍 Selenium 1.0 包含 core、IDE、RC、grid 四部分&#xff0c;selenium 2.0 则是在两位大牛偶遇相互沟通决定把面向对象结构化&#xff08;OOPP&#xff09…

财报解读:步步逼近ChatGPT,科大讯飞即将迎来全面爆发?

10月份&#xff0c;科大讯飞进入新的成果验证节点。 一是进一步透露AI进展的财报发布。三季报显示&#xff0c;科大讯飞仍然保持较为稳健的发展步伐&#xff0c;营收始终处于增长状态&#xff0c;对讯飞星火认知大模型的应用成果&#xff0c;进行了进一步揭示。基于此&#xf…

亿图导出word和PDF中清晰度保留方法

步骤一 在亿图软件中画一个元件大小搭配合理的图。注意字体大小的安排&#xff0c;尤其是角标的大小要合适&#xff0c;示范如下 选中所有元器件&#xff0c;右键使用组合功能将电路图组合为一个整体 步骤二&#xff1a; 将亿图软件中的图保存为SVG格式。示范如下 在导出到…

LeetCode 64.最小路径和(开辟额外空间(二维)、不开辟额外空间(二维)、优化(一维))

Problem: 64. 最小路径和 文章目录 前言思路解题方法Code优化&#xff1a; 前言 简单写写自己对这道题的拙见&#xff0c;如有意见或者建议可以联系笔者owo 思路 这道题就是典型的填格子&#xff0c;对于这类题目在看到的时候需要抓住我这个位置状态是依赖于哪几个数据继续构造…

广州华锐互动:3D虚拟现实技术还原物理现象,互动式教学提高学生学习兴趣

物理现象是自然界的客观规律&#xff0c;但是很多人对于物理现象的理解存在困难。随着科技的发展&#xff0c;3D虚拟技术已经越来越普及&#xff0c;3D虚拟技术能够将物理现象进行虚拟还原&#xff0c;将抽象的物理概念转化为具体的三维场景&#xff0c;使得人们能够更加直观地…

如何巧妙告知家长成绩分数

如何让学生和家长们查询期中考试成绩,一直是让许多老师都头疼不已的问题。今天我就来交给大家怎么解决这个问题。 我们先了解一下成绩查询系统是什么。在互联网高度发达的今天&#xff0c;成绩查询系统已经不再是学校的专属&#xff0c;而是可以通过网络平台进行操作的一种工具…

二维码生成和解析工具包-zxing

目录 1、简介 2、做个例子 2.1 添加依赖 2.2 工具类 2.3 测试 3、总结 今天在看一个开源项目的时候发现一个工具类&#xff0c;一个简单的生成二维码的工具类&#xff0c;测试了下很是方便。 虽然在平常的开发中没有使用过&#xff0c;为了以后的场景做个备份 1、简介 …

CTF密码学概述

一. 引言 密码在我们的生活中应用于方方面面&#xff0c;我们的微信、QQ、支付宝、以及我们去银行取钱&#xff0c;都需要输入正确的密码&#xff0c;所以密码学在计算机信息安全上面都是非常重要的。我们现在每天打开的网络页面&#xff0c;浏览的视频内容都是表层网络&#…

用友GRP-U8注入

分享一个拿到CNDV证书的SQL注入&#xff0c;证书截图如下 0x01 漏洞介绍 fofa&#xff1a;app”用友-GRP-U8” 用友GRP-U8存在SQL注入&#xff0c;漏洞文件名为bx_historyDataCheck.jsp 0x02 漏洞分析 文件截图如下 该文件接收3个传参&#xff0c;分别是userName&#xff…

班主任,怎么发布期中考试成绩?

各位班主任是不是有时候觉得每次手动发布期中考试成绩是一件既繁琐又痛苦的事情&#xff1f;让我给你们介绍一个神器——成绩查询系统&#xff01;让你们的工作变得轻松&#xff0c;让学生们能够自主查询成绩。 我们先了解一下什么是成绩查询系统。成绩查询系统是一种专门用于发…

性能测试 —— Jmeter 常用三种定时器!

1、同步定时器 位置&#xff1a;HTTP请求->定时器->Synchronizing Timer 当需要进行大量用户的并发测试时&#xff0c;为了让用户能真正的同时执行&#xff0c;添加同步定时器&#xff0c;用户阻塞线程&#xff0c;知道线程数达到预先配置的数值&#xff0c;才开始执行…

【Golang】简记操作:Centos安装、卸载、升级Golang运行环境

目录 安装 1、根据实际需求选择合适的golang版本 如下图&#xff0c;选择合适的版本&#xff0c;右键复制链接 2、在Centos选择合适的目录下载golang的源文件 3、解压golang的源文件&#xff0c;解压完成即可执行go命令 4、设置golang的全局环境变量&#xff08;/etc/pr…