hello,我是冷凌爱,我又来发笔记了,这篇笔记是最早遇到brainfuck和Ook!时写的。
专栏内容:
序号 | 文章 |
---|---|
1 | 什么是隐写术 |
2 | 简单学习一下字符集与编码 |
3 | 快速了解摩斯密码并实现音频转换 |
4 | 终于弄懂base64编码了 |
5 | UUencode和XXencode |
6(当前) | [图解brainfuck和Ook!] |
一、Brainfuck
你见过这样的编码吗?
+++++ +++++ [->++ +++++ +++<] >++.
简介
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
循环操作
[ 当当前指针指向的字节不是零时,会进行循环,否则跳过
] 当当前指针指向的字节非零时回到循环,否则退出
方括号中间的相当于循环体。例如:
举例
+++++ +++++ [->++ +++++ +++<] >++. 结果为 "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!
简介
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,本质上是一样的,不再赘述
拜拜,下一篇打算说一说条形码。