详解brainfuck和Ook!

hello,我是冷凌爱,我又来发笔记了,这篇笔记是最早遇到brainfuck和Ook!时写的。
专栏内容:

序号文章
1什么是隐写术
2简单学习一下字符集与编码
3快速了解摩斯密码并实现音频转换
4终于弄懂base64编码了
5UUencode和XXencode
6(当前)[图解brainfuck和Ook!]

一、Brainfuck

你见过这样的编码吗?
+++++ +++++ [->++ +++++ +++<] >++.

简介

brainfuck和OOk!编解码网站

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

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

规则

我们可以假想:
bf开了一个近乎无限长的数组,数组每个元素大小占一个字节,存储十进制整数。一个指针指向一个元素,一个数组元素能够表示0-255.
brainfuck有个很玄学的东西,0-1=255,255+1=0

bf规则
循环操作
[ 当当前指针指向的字节不是零时,会进行循环,否则跳过
] 当当前指针指向的字节非零时回到循环,否则退出
方括号中间的相当于循环体。例如:

举例

+++++ +++++ [->++ +++++ +++<] >++.   结果为  "f"

1. ++++++++++: 数组第一位先加为10,即array[0]=10
2. [:          此时指针指向的字节array[0]=10,不为零,进入循环
3. -:          数组第一位减一,即array[0]-1=9
4. >:          指针加一,此时指针指向array[1]
5. ++++++++++: 数组第二位加10,即array[1]+10
6. <:          指针减一,此时指针指向array[0]
7. ]:          array[0]=9,不为零,继续循环执行2~7步。直到array[0]=0
8. >:          指针加一,此时指针指向array[1]=100
9. ++:         array[1]+2,102.
10. 输出指针指向的字节内容的ascii,ascii(102)="f"

演示

二、Ook!

brainfuck和OOk!编解码网站

简介

Ook 语言(也称为 Ook! 语言)是一种深奥的、基于文本的编程语言,是为了有趣和挑战编程思维而创建的。它是一种 Esoteric 编程语言,这类语言通常不是为了实际的软件开发,而是作为一种智力游戏、编程艺术或者用于探索编程语言设计的边界。
Ook 语言由David Morgan-Mar创造。它是Brainfuck语言的变体,使用"Ook."、"Ook?"和"Ook!"三种符号组合来编程

原理规则

和brainfuck类似,

我们可以假想:
Ook!语言开了一个近乎无限长的数组,数组每个元素大小占一个字节,存储十进制整数。一个指针指向一个元素,一个数组元素能够表示0-255.
同样的0-1=255,255+1=0
基本语法

举例

Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook! Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook. Ook? Ook! Ook. Ook? Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. 
解码为“f”
1. Ook. Ook.(x10): 数组第一位先加为10,即array[0]=10
2. Ook! Ook?     : 此时指针指向的字节array[0]=10,不为零,进入循环
3. Ook! Ook!     : 数组第一位减一,即array[0]-1=9
4. Ook. Ook?	 : 指针加一,此时指针指向array[1]
5. Ook. Ook.(x10): 数组第二位加10,即array[1]+10
6. Ook? Ook.	 : 指针减一,此时指针指向array[0]
7. Ook? Ook!     : array[0]=9,不为零,继续循环执行2~7步。直到array[0]=0
8. Ook. Ook?     : 指针加一,此时指针指向array[1]=100
9. Ook. Ook.(x2):  array[1]+2,102.
10. 输出指针指向的字节内容的ascii,ascii(102)="f"

演示

扩展:short Ook!

Ook!所需的字符太多,利用".!?"来简化Ook,本质上是一样的,不再赘述

brainfuck和OOk!编解码网站

拜拜,下一篇打算说一说条形码。

### Brainfuck编码Ook的关系 Brainfuck 是一种极简主义编程语言,它仅使用八种符号 `>`, `<`, `+`, `-`, `.`, `,`, `[`, `]` 来完成所有的计算功能。而 Ook! 则是基于 Brainfuck 的另一种幽默化变体语言,其设计初衷是为了模仿猩猩的声音 “Ook.” Ook?”。 在 Ook! 中,每一对不同的 “Ook” 组合对应于 Brainfuck 的一个指令[^2]。这种映射关系使得任何可以用 Brainfuck 编写的程序都可以被翻译成对应的 Ook! 程序。 以下是具体的映射表: | Ook! | Brainfuck | |------------|-----------| | Ook. Ook? | > | | Ook? Ook. | < | | Ook. Ook. | + | | Ook? Ook? | - | | Ook! Ook? | . | | Ook? Ook! | , | | Ook! Ook. | [ | | Ook. Ook! | ] | ### 示例代码 下面是一个简单的示例,展示如何将一段 Brainfuck 程序转化为 Ook! 程序。假设我们有一段 Brainfuck 程序用来打印字母 'A' (`+++++[>.<-]`)。 #### 原始 Brainfuck 程序 ```brainfuck +++++[>.<-] ``` 将其逐条转换为 Ook! 形式: 1. `+++++` 对应五个 `Ook. Ook.` (即五次增加当前单元格的值)。 2. `[>` 对应 `Ook! Ook.`。 3. `.<` 对应 `Ook! Ook?` `Ook? Ook.`。 4. `-.]` 对应 `Ook? Ook?` `Ook. Ook!`。 最终得到的 Ook! 程序如下: ```plaintext Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook? Ook. Ook! Ook? Ook? Ook. Ook? Ook? Ook. Ook! ``` 这段程序的功能是在内存的第一个单元格存储数值 65(ASCII 码中的 'A'),并将其输出到屏幕上。 ### 解析过程 上述转化过程中,每个 Brainfuck 指令都被一对一地替换成相应的 Ook! 变体。由于两者本质上具有相同的语义模型,因此可以轻松实现相互之间的转换。 ### 关键技术点总结 - **映射规则**:Ook!Brainfuck 的八个基本操作重新定义为三组不同排列组合的字符串。 - **执行逻辑保持一致**:无论是 Brainfuck 还是 Ook!,它们都依赖指针移动、数据修改以及循环控制结构来构建完整的算法流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冷凌爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值