用户:
WiseAnswer查看:2 回复:4 评论:2 创建时间:2022-10-01T10:47:21
最近看到了图灵机的思想,又看到了Brainf**k语言,突发奇想,创造了CODEMAO编程语言,纯属娱乐,不要说我抄袭Brainf**k。
首先先了解一下图灵机的基本思想,该机器由以下几个部分组成:
1、一条无限长的纸带 TAPE。纸带被划分为一个接一个的小格子,每个格子上包含一个来自有限字母表的符号,字母表中有一个特殊的符号 表示空白。纸带上的格子从左到右依此被编号为 0,1,2,... ,纸带的右端可以无限伸展。
2、一个读写头 HEAD。该读写头可以在纸带上左右移动,它能读出当前所指的格子上的符号,并能改变当前格子上的符号。
3、一套控制规则 TABLE。它根据当前机器所处的状态以及当前读写头所指的格子上的符号来确定读写头下一步的动作,并改变状态寄存器的值,令机器进入一个新的状态。
4、一个状态寄存器。它用来保存图灵机当前所处的状态。图灵机的所有可能状态的数目是有限的,并且有一个特殊的状态,称为停机状态。参见停机问题。
(以上内容摘自百度百科)
理论上,这样的机器可以计算一切可计算的问题。而现在介绍的CODEMAO语言就能实现这一切。
CODEMAO语言可以理解为,有一个无限长的数组a,每个元素占用1字节,指针p默认指向a的首元素,CODEMAO语言要操作的就是指针p与p指向的元素。
概念图
CODEMAO语言的关键字非常少,是最简单的编程语言之一。只有一下8个
1、"C" 这个关键字表示将指针加1
2、"O" 这个关键字表示将指针减1
3、"D" 这个关键字表示将指针指向的值加1
4、"E" 这个关键字表示将指针指向的值减1
5、"M" 这个关键字表示输入一个字符到指针指向的字节
6、"A" 这个关键字表示将指针指向的字节以字符型输出
7、"{" 这个关键字配合"}"
8、"}" 这个关键字表示如果当前指针指向的值不为0,则跳转到"{"
否则继续向下
以上就是CODEMAO语言的关键字,非常简单对吧?下面,我们来输出个
Hello World!
首先,输出H,H在ASCII码表中的值是72
所以CODEMAO语言写成:
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDA
运行试试(编译器我自己写的,源码和程序都发在评论区了)

很好,不过一个H就要打72个D,体积太大
所以,我们要压缩体积,因为{}有循环的效果,所以我们可以用乘法只要用两个字节,一个计次,一个记结果
{E}C{E}DDDDDDDD{ODDDDDDDDDCE}OA
(前面的两个
{E}
是为了清空字节)
运行:

结果是成功的
所以,Hello World! 就可以写成:
{E}C{E}DDDDDDDD{ODDDDDDDDDCE}OA{E}C{E}DDDDDDDDDD{ODDDDDDDDDDCE}ODA{E}C{E}DDDDDDDDD{ODDDDDDDDDDDDCE}OA{E}C{E}DDDDDDDDD{ODDDDDDDDDDDDCE}OA{E}C{E}DDDDDDDDDD{ODDDDDDDDDDDCE}ODA{E}C{E}DDDD{ODDDDDDDDCE}OA{E}C{E}DDDDDDD{ODDDDDDDDDDDDCE}ODDDA{E}C{E}DDDDDDDDDD{ODDDDDDDDDDDCE}ODA{E}C{E}DDDDDDDD{ODDDDDDDDDDDDDDCE}ODDA{E}C{E}DDDDDDDDD{ODDDDDDDDDDDDCE}OA{E}C{E}DDDDDDDDDD{ODDDDDDDDDDCE}OA{E}C{E}DDDD{ODDDDDDDDCE}ODA
再次运行:

恭喜,Hello World!成功了
其实字符串输出不需要我们手打,为了方便,我也做了一个工具
#include<bits/stdc++.h>
using namespace std;
constexpr char KEY_POINTER_PLUS = 'C';
constexpr char KEY_POINTER_MINUS = 'O';
constexpr char KEY_VALUE_PLUS = 'D';
constexpr char KEY_VALUS_MINUS = 'E';
constexpr char KEY_IN = 'M';
constexpr char KEY_OUT = 'A';
constexpr char KEY_GOTO_LEFT = '{';
constexpr char KEY_GOTO_RIGHT = '}';
void zy(char a,int& i,int& k,int& pc);
int main() {
string a;
getline(cin,a);
for(int i=0; i<a.length(); i++) {
char cc=a[i];
int k,b,c;
zy(cc,k,b,c);
cout<<KEY_GOTO_LEFT<<KEY_VALUS_MINUS<<KEY_GOTO_RIGHT<<KEY_POINTER_PLUS<<KEY_GOTO_LEFT<<KEY_VALUS_MINUS<<KEY_GOTO_RIGHT;
for(int i=0; i<k; i++) {
cout<<KEY_VALUE_PLUS;
}
cout<<KEY_GOTO_LEFT<<KEY_POINTER_MINUS;
for(int i=0; i<b; i++) {
cout<<KEY_VALUE_PLUS;
}
cout<<KEY_POINTER_PLUS<<KEY_VALUS_MINUS<<KEY_GOTO_RIGHT<<KEY_POINTER_MINUS;
for(int i=0; i<c; i++) {
cout<<KEY_VALUE_PLUS;
}
cout<<KEY_OUT;
}
cout<<endl;
getchar();
}
void zy(char a,int& i,int& k,int& pc) {
int min=999,mini=999;
for(int ii=1; ii<=a; ii++) {
int nn=a/ii;
int nb=a-(ii*nn);
if(ii+nn+nb<min) {
min=ii+nn+nb;
mini=ii;
}
}
i=mini;
k=a/mini;
pc=a-((a/mini)*mini);
只要输入字符串,就可以输出CODEMAO代码了
这个工具我将和编译器一起放到评论区
以上就是这个帖子的全部内容,希望大家能把自己写的CODEMAO代码分享在评论区
掰掰。。。
工具代码有点问题,改进版
#include<bits/stdc++.h>
using namespace std;
constexpr char KEY_POINTER_PLUS = 'C';
constexpr char KEY_POINTER_MINUS = 'O';
constexpr char KEY_VALUE_PLUS = 'D';
constexpr char KEY_VALUS_MINUS = 'E';
constexpr char KEY_IN = 'M';
constexpr char KEY_OUT = 'A';
constexpr char KEY_GOTO_LEFT = '{';
constexpr char KEY_GOTO_RIGHT = '}';
void zy(char a,int& i,int& k,int& pc);
int main() {
string a;
getline(cin,a);
for(int i=0; i<a.length(); i++) {
char cc=a[i];
int k,b,c;
zy(cc,k,b,c);
cout<<KEY_GOTO_LEFT<<KEY_VALUS_MINUS<<KEY_GOTO_RIGHT<<KEY_POINTER_PLUS<<KEY_GOTO_LEFT<<KEY_VALUS_MINUS<<KEY_GOTO_RIGHT;
for(int i=0; i<k; i++) {
cout<<KEY_VALUE_PLUS;
}
cout<<KEY_GOTO_LEFT<<KEY_POINTER_MINUS;
for(int i=0; i<b; i++) {
cout<<KEY_VALUE_PLUS;
}
cout<<KEY_POINTER_PLUS<<KEY_VALUS_MINUS<<KEY_GOTO_RIGHT<<KEY_POINTER_MINUS;
for(int i=0; i<c; i++) {
cout<<KEY_VALUE_PLUS;
}
cout<<KEY_OUT;
}
cout<<endl;
getchar();
}
void zy(char a,int& i,int& k,int& pc) {
int min=999,mini=999;
for(int ii=1; ii<=a; ii++) {
int nn=a/ii;
int nb=a-(ii*nn);
if(ii+nn+nb<min) {
min=ii+nn+nb;
mini=ii;
}
}
i=mini;
k=a/mini;
pc=a-((a/mini)*mini);
}
点赞0
评论