0%

《程序员升职记》19.计时器

本楼层的任务是对于输入栏的每一个数字,把它和0之间的每一个数(包括它本身和0)都送入到outbox中,这其实就是一个计时器。
在这一楼层,又新增了两条指令bump+和bump-,这两条指令可以把地毯上的数字加一或者减一,然后把结果同时放回地毯和手上。

思路解析1

1. 从inbox取一个数字
2. 放入地毯0位置
3. 判断是否为负数,如果为负数,跳转到8
    4. 输出
    5. 把地毯0位置数字减1
    6. 判断是否为负数,如果为负数,跳转到1,处理下一个数字
    7. 跳转到4
8. 输出
9. 把地毯0位置数字加1
10. 判断是否为0,为0跳转到12
    11. 跳转到8
12. 输出
13. 跳转到1,处理下一个数字

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 -- HUMAN RESOURCE MACHINE PROGRAM --

a:
b:
INBOX
COPYTO 0
JUMPN d
c:
OUTBOX
BUMPDN 0
JUMPN b
JUMP c
d:
e:
OUTBOX
BUMPUP 0
JUMPZ f
JUMP e
f:
OUTBOX
JUMP a

这段代码没有达到效率最佳

思路2

1. 从inbox取一个数字
2. 放入地毯0位置
3. 判断是否为负数,如果为负数,跳转到8
    4. 输出
    5. 把地毯0位置数字减1
    6. 判断是否为负数,如果为负数,跳转到1,处理下一个数字
    7. 跳转到4
8. 输出
9. 把地毯0位置数字加1
10. 判断是否为负,为负跳转到8
11. 输出
12. 跳转到1,处理下一个数字

第二种解法和第一种的区别在于第10步,前者进行0判断,后者进行负判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

-- HUMAN RESOURCE MACHINE PROGRAM --

a:
b:
INBOX
COPYTO 0
JUMPN d
c:
OUTBOX
BUMPDN 0
JUMPN b
JUMP c
d:
e:
OUTBOX
BUMPUP 0
JUMPN e
OUTBOX
JUMP a