Turing Machines

自动寄

删除 010

创建一个图灵机,它复制二进制输入到输出,并删除所有的 010

States Start End Tape Head Position
Start Start Stop A0 0
A B0 0
B
Copy
Stop
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 处理 0 开头,转到 A
[Start; 0; SP]->[A; ANY; ANY; >; S]
// 处理 1 开头,直接复制
[Start; 1; SP]->[Start; ANY; 1; >; >]
// 为空,结束
[Start; SP; SP]->[Stop; ANY; ANY; S; S]

// 在 0 1 _ 时,转 B
[A; 1; SP]->[B; ANY; ANY; >; S]
// 在 0 0 _ 时,写入 0,转 Start
[A; 0; SP]->[Start; ANY; 0; S; >]
// 在 0 0 S 时,写入 0,结束
[A; SP; SP]->[Stop; ANY; 0; S; >]

// 在 0 1 0 时,略过,回到 Start
[B; 0; SP]->[Start; ANY; ANY; >; S]
// 在 0 1 1 时,将 0 复制,转 Copy 1
[B; 1; SP]->[Copy; ANY; 0; S; >]
// 在 0 1 S 时,将 0 复制,转 Copy 1
[B; SP; SP]->[Copy; ANY; 0; S; >]

// Copy 1
[Copy; ANY; SP]->[Start; ANY; 1; S; >]

把 00 变成 ##

但是不处理超过 2 个 0 的情况

States Start End Tape Head Position
Start Start Stop A0 0
Zero1
Zero2
FindOne
Trans
Trans2
Stop
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 0 _ 转 Zero1
[Start; 0]->[Zero1; 0; >]
// 1 _ 回到开始
[Start; 1]->[Start; 1; >]
// 为空,结束
[Start; SP]->[Stop; SP; S]

// 0 0 _ 继续计数
[Zero1; 0]->[Zero2; 0; >]
// 0 1 _ 回到开始
[Zero1; 1]->[Start; 1; >]
// 0 S 结束
[Zero1; SP]->[Stop; SP; S]

// 0 0 0 不处理
[Zero2; 0]->[FindOne; 0; >]
// 0 0 1 变换前两个为 #
[Zero2; 1]->[Trans; 1; 2*<]
// 0 0 S 变换前两个为 #
[Zero2; SP]->[Trans; SP; 2*<]

// 第一次写入
[Trans; 0]->[Trans2; #; >]
// 第二次写入
[Trans2; 0]->[Start; #; >]

// 找到下一个 1
[FindOne; 1]->[Start; 1; >]
// 仍然是 0
[FindOne; 0]->[FindOne; 0; >]
// 结束
[FindOne; SP]->[Stop; SP; S]

011 变 ABCD

States Start End Tape Head Position
Start Start Stop A0 0
Zero B0 0
One
Copy
BCD
CD
D
Stop
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 0 _ 计数
[Start; 0; SP]->[Zero; 0; SP; >; S]
// 1 _ 复制
[Start; 1; SP]->[Start; 1; 1; >; >]
// 为空,结束
[Start; SP; SP]->[Stop; SP; SP; S; S]

// 0 1 _ 计数
[Zero; 1; SP]->[One; 1; SP; >; S]
// 0 0 _ 复制 0,回到开始
[Zero; 0; SP]->[Start; 0; 0; S; >]
// 0 S 复制 0,停止
[Zero; SP; SP]->[Stop; SP; 0; S; >]

// 0 1 1 变换,写入 A
[One; 1; SP]->[BCD; 1; A; S; >]
// 0 1 0 复制 0,转 Copy 1
[One; 0; SP]->[Copy; 0; 0; <; >]
// 0 1 S 复制 0,转 Copy 1
[One; SP; SP]->[Copy; SP; 0; <; >]

// 写入 B
[BCD; ANY; SP]->[CD; ANY; B; S; >]
// 写入 C
[CD; ANY; SP]->[D; ANY; C; S; >]
// 写入 D,回到开始
[D; ANY; SP]->[Start; ANY; D; >; >]

// Copy 0
[Copy; 0; SP]->[Start; 0; 0; >; >]
// Copy 1
[Copy; 1; SP]->[Start; 1; 1; >; >]

多个 1 变一个 1

States Start End Tape Head Position
Start Start Stop A0 0
One B0 0
Stop
1
2
3
4
5
6
7
8
9
10
11
12
13
// 0 复制
[Start; 0; SP]->[Start; 0; 0; >; >]
// 1 复制并计数
[Start; 1; SP]->[One; 1; 1; >; >]
// 为空,停止
[Start; SP; SP]->[Stop; SP; SP; S; S]

// 1 0 复制,回到开始
[One; 0; SP]->[Start; 0; 0; >; >]
// 1 1 找到下一个 0
[One; 1; SP]->[One; 1; ANY; >; S]
// 1 S 停止
[One; SP; SP]->[Stop; SP; SP; S; S]

11 变 112

States Start End Tape Head Position
Start Start Stop A0 0
One B0 0
Two
Stop
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 0 复制
[Start; 0; SP]->[Start; 0; 0; >; >]
// 1 复制并计数
[Start; 1; SP]->[One; 1; 1; >; >]
// 为空,停止
[Start; SP; SP]->[Stop; SP; SP; S; S]

// 1 1 添加 2
[One; 1; SP]->[Two; 1; 1; S; >]
// 1 0 复制并回到开始
[One; 0; SP]->[Start; 0; 0; >; >]
// 1 S 停止
[One; SP; SP]->[Stop; SP; SP; S; S]

// +2s
[Two; ANY; SP]->[Start; ANY; 2; >; >]

0000… 变 4444…

States Start End Tape Head Position
Start Start Stop A0 0
One
Two
Three
Trans
Stop
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 0,计数
[Start; 0]->[One; 0; >]
// 1,跳过
[Start; 1]->[Start; 1; >]
// 为空,停止
[Start; SP]->[Stop; SP; S]

// 0 0
[One; 0]->[Two; 0; >]
// 0 1 回
[One; 1]->[Start; 1; >]
// 0 S 停止
[One; SP]->[Stop; SP; S]

// 0 0 0
[Two; 0]->[Three; 0; >]
// 0 0 1
[Two; 1]->[Start; 1; >]
// 0 0 S 停止
[Two; SP]->[Stop; SP; S]

// 0 0 0 0,转换
[Three; 0]->[Trans; 4; 3*<]
// 0 0 0 1 回
[Three; 1]->[Start; 1; >]
// 0 0 0 S 停止
[Three; SP]->[Stop; SP; S]

// 4 0 0 4
[Trans; 0]->[Trans; 4; >]
// Stop Trans
[Trans; 4]->[Start; ANY; >]

二进制乘 3

States Start End Tape Head Position
Start Start Stop A0 0
X
Non
Carry
Stop
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 在结果最前加一个 0
[Start; 0; SP]->[X; 0; 0; S; >]
[Start; 1; SP]->[X; 1; 0; S; >]

// 复制
[X; 0; SP]->[X; 0; 0; >; >]
[X; 1; SP]->[X; 1; 1; >; >]
// 在输入最后加一个 0
[X; SP; SP]->[Non; 0; SP; S; <]

// 不进位
[Non; 0; 0]->[Non; 0; 0; <; <]
[Non; 0; 1]->[Non; 0; 1; <; <]
[Non; 1; 0]->[Non; 1; 1; <; <]
[Non; 1; 1]->[Carry; 1; 0; <; <]
[Non; SP; SP]->[Stop; SP; SP; S; S]

// 进位
[Carry; 0; 0]->[Non; 0; 1; <; <]
[Carry; 0; 1]->[Carry; 0; 0; <; <]
[Carry; 1; 0]->[Carry; 1; 0; <; <]
[Carry; 1; 1]->[Carry; 1; 1; <; <]
[Carry; SP; SP]->[Stop; SP; 1; S; S]
Author

Aloento

Posted on

2022-12-15

Updated on

2024-04-04

Licensed under

CC BY-NC-SA 4.0

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×