Human Resource Machine

Human Resource Machine

Not enough ratings
全关卡治愈强迫症解法和思路分享(更新中)
By Sun45
作为一个待业在家的程序员,现在终于有空再拾起这个游戏了,以前可能玩的比较烦躁,连存档都删了,打到20关时发现必须用我觉得邪道的办法,否则达不到治愈强迫症的效率要求,带着怀疑来社区里看看,发现大家的思路跟我不太一样,于是我决定把我的解法和思路发出来分享一下,同样也是记录下来,因为这个游戏的编程IDE太不友好了,实在不适合记录(注释用手写WTF!)。为了不影响整体篇幅大小,我只会把最终满足治愈强迫症的解法记录下来,中间我是怎么尝试的就不记录了。关卡顺序按照解锁拓展关后先打拓展关后打剧情关的顺序来。
   
Award
Favorite
Favorited
Unfavorite
1 收发室(第一年)
作为引导关,这里只需要点击运行程序就行了。

因为是第一关,稍微讲下游戏的机制,之后等出现新的机制后再分别阐述。
可以看到游戏中有4个区域
  1. 输入栏
    用来获得代码运算的输入数据,调试的时候需要留意
  2. 输出栏
    代码运算的输出口,关卡的任务要求就是从这输出的内容
  3. 运行调试面板
    用来运行代码和加速中断,以及单步调试,自己稍微试一下就能明白怎么用了
  4. 代码编辑区域
    用来编辑保存代码,一共能存三套代码,还能把代码作为文本整体导入和导出,之后我的解法不仅会放截图,也会放导出文本,这个编辑器虽然能撤销,但是没有快捷键,也不能恢复,也没有部分拷贝粘贴的功能,之后的关卡难起来后还是挺别扭的

代码就是把语句连接成串,然后让机器处理(当然这里做处理的只有我们自己,苦逼的底层员工,这运行方式让我想到了三体的人形阵列计算机)。

这关新增的语句是“inbox”和"outbox"

“inbox”是从输入栏拿走一个数放在手上
"outbox"是将手中的数放入输出栏
注意这两个语句都有一个参与对象,就是我们的手,之后的很多语句都会以我们手上的数为目标,使用语句时要分清处理的对象。


第一关的代码也很简单,就是分三次从输入栏拿走一个数放入输出栏,没什么可说的。

作为新员工,我的任务就是贯彻执行主管的命令,看看我腼腆又自信的笑容,以及浓密的头发。
2 繁忙的收发室(第二年)
这关新增了语句"jump"

来看看官方的解释

正常的代码执行是从上往下一行行执行的,当运行到"jump"时可以从当前行跳到指定的任意行,也就能实现往前跳的循环执行和往后跳的跳过执行了。"jump"在起始点会占一行代码并算一步,在跳转后的位置不占代码行并不算步数。(作为java程序员,是不用跳转语句的,因为跳转语句使程序难以理解和难于维护,不过游戏中当然能用,游戏性这不就上来了吗o( ̄▽ ̄)d)。

优化诊断
优化诊断3/3——效率诊断30/25
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
INBOX
OUTBOX
JUMP a
作为新增了"jump"语句后的第一关,解法也很简单,jump包一个输入输出完事。

效率诊断
优化诊断24/3——效率诊断20/25
-- HUMAN RESOURCE MACHINE PROGRAM --

INBOX
OUTBOX
INBOX
OUTBOX
INBOX
OUTBOX
INBOX
OUTBOX
INBOX
OUTBOX
INBOX
OUTBOX
INBOX
OUTBOX
INBOX
OUTBOX
INBOX
OUTBOX
INBOX
OUTBOX
根据优化诊断的解法可以得知一共有10组数据,因为"jump"语句也算一步,所以直接简单粗暴的优化掉"jump"语句,用10对输入输出就行。

因为办事效率高,第二年我就升职了,虽然有一些同事放弃了,但我可不会放弃这么优越的工作机会。
3 复印楼层(第三年)
这关新增了一个机制,地毯区域,地毯区域是一片整齐的标有编号的格子状区域,格子内可能有初始内容,也可能为空,语句可以以格子为目标从格子里取数据或者向格子存数据。


这关新增了语句"copyfrom"

来看看官方的解释

有了"copyfrom"语句,就能拷贝获取到格子里的初始内容或者我们后来存入的内容了。

优化诊断&效率诊断
优化诊断6/6——效率诊断6/6
-- HUMAN RESOURCE MACHINE PROGRAM --

COPYFROM 4
OUTBOX
COPYFROM 0
OUTBOX
COPYFROM 3
OUTBOX
也很简单,按照要求的顺序用"copyfrom"语句将内容一个个拷贝出来输出就行,注意拷贝后原格子上的内容不会变,且"copyfrom"语句会标示出拷贝来源的格子编号。

去年收发数据太频繁了,连输入栏都bug了,还好主管及时联系了维修部,应该很快就能修好了。
4 扰码处理器(第四年)
这关新增了语句"copyto"

来看看官方的解释

有了"copyto"语句,就能将我们手上的数据覆盖到格子里了。

输出要求
每两个输入倒序后输出。

优化诊断&效率诊断
优化诊断7/7——效率诊断21/21
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
INBOX
COPYTO 0
INBOX
OUTBOX
COPYFROM 0
OUTBOX
JUMP a
单独一个一个拿出来已经满足不了要求了,所以在拿出第一个后,需要先存到格子里,然后直接拿出第二个输入并输出,这样就满足了第二个先输出,然后从格子里拿出第一个输出,这样就满足了先输出第二个后输出第一个,之后就可以进入循环了。

后之发,先之至,此用兵之要术也。——《荀子·议兵》
这关的剧情对话竟然引用了古文,我看了下英文原文,只是说了先进后出跟后进先出,说明汉化真的用心了。这部分不止在讲这关的过关要求,也一语双关点出了编程中一个很重要的思想“堆栈”,举例来说就是当把羽毛球放入球桶时,最先拿出来的一定是最后放进去的。

输入栏终于修好了,在主管的光芒指引下,我一定会再次做好数据整理的工作。
☕ 咖啡时间(第五年)
6 多雨之夏(第六年)
这关新增了语句"add"

来看看官方的解释

"add"语句实际的操作对象实际有两个,一个是我们的手,一个是指定编号的格子,该语句会把我们手上的数和格子上的数做加法,然后将和放到我们手上。

输出要求
每两个输入求和后输出。

优化诊断&效率诊断
优化诊断6/6——效率诊断24/24
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
INBOX
COPYTO 0
INBOX
ADD 0
OUTBOX
JUMP a
有了加法的概念就是引入了运算能力,要求是两个数相加再输出,跟上一关一样需要先存一个数,然后取第二个数和存下来的第一个数相加就行,之后进循环。

主管说咱两的职业前途就全靠我了,让我感觉倍受重视。
8 三倍扩大室(第八年)——拓展关
输出要求
将输入扩大三倍后输出。

优化诊断&效率诊断
优化诊断6/6——效率诊断24/24
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
INBOX
COPYTO 0
ADD 0
ADD 0
OUTBOX
JUMP a
作为第一个拓展关,这关的难度没有飙升,因为只有加法,3倍其实就是2次加上自身,只要存1个自身在格子里然后加2次就行,之后就可以进循环了。
10 八倍扩大装置(第十年)——拓展关
输出要求
将输入扩大八倍后输出。

优化诊断&效率诊断
优化诊断9/9——效率诊断36/36
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
INBOX
COPYTO 0
ADD 0
COPYTO 0
ADD 0
COPYTO 0
ADD 0
OUTBOX
JUMP a
这关在上一关的基础之上拓展了一下,3倍是加2次,那么8倍是不是加7次就可以了呢,可以是可以,但是太不优雅了。要知道一个数加自身也就是a+a=2a,相当于将该数乘以2,题目要求的8倍正好是2的3次方,也就是将一个数3次乘以2,相当于将该数加完自身后的结果再进行加自身的操作,一共重复3次,正好是将该数乘以8。于是我们获取一个数后,将该数存下来,然后加存下来的数,这样三次后就能得到获取的数的8倍,之后就可以进循环了。
12 四十倍扩大装置(第十二年)——拓展关
输出要求
将输入扩大40倍后输出。

优化诊断&效率诊断
优化诊断14/14——效率诊断56/56
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
INBOX
COPYTO 0
ADD 0
COPYTO 0
ADD 0
COPYTO 0
ADD 0
COPYTO 0
ADD 0
COPYTO 1
ADD 1
ADD 0
OUTBOX
JUMP a
有了上一关的经验,我们继续找规律,40=32+8=2^5+2^3,所以我们只要做到加3次后达到2^3存入0号格子代码:02-08,然后将第4次的相加的结果存入1号格子代码:09-10,之后再加一次1号格子的内容,使手上的数达到2^5代码:11,之后再加0号格子中的2^3代码:12,就满足了40的要求,之后就可以进循环了。
7 零扑灭行动(第七年)
这关新增了语句"jump if zero"

来看看官方的解释

"jump if zero"语句会先判断手上的数是否为0,如果是的的话和"jump"语句一个效果,如果不是则略过"jump if zero"语句并执行下一行。

输出要求
输出所有的非0输入。

优化诊断&效率诊断
优化诊断4/4——效率诊断23/23
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
b:
INBOX
JUMPZ b
OUTBOX
JUMP a
有了判断语句后,就可以实现选择略过一部分代码了,这关的基础依旧是输入输出包一个循环,但是在输入后加入"jump if zero"语句判断手上的数是否为0,为0则略过后面的输出回到循环起始点代码:02,这样就保证了只有非0数才能输出。

第七年,我终于引起了公司高层的注意,在主管告诉我这一好消息后,我感觉我快熬出头了。
9 零保护行动(第九年)
输出要求
输出所有的0输入。

优化诊断
优化诊断5/5——效率诊断28/25
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
b:
INBOX
JUMPZ c
JUMP b
c:
OUTBOX
JUMP a
这关跟上一关要求是反着来的,但是因为我们只有"jump if zero"语句,不能直接判断非0,所以要逆转一下思维,输入判断为0后跳转到后面的输出代码:01 02 04,而如果非0就会略过跳转,只要在这里回到循环开始就行代码:03

效率诊断
优化诊断7/5——效率诊断24/25
-- HUMAN RESOURCE MACHINE PROGRAM --

INBOX
JUMPZ b
JUMP c
a:
b:
OUTBOX
c:
d:
INBOX
JUMPZ a
JUMP d
效率诊断要优化掉3步运算,我们来分析下我们优化诊断算法使用的步骤,如果输入一个非0,会经过输入->判断为0->跳转,一共3步代码:01 02 03,如果输入一个0,则会经过输入->判断为0->输出->跳转,一共4步代码:01 02 04 05,看起来没有优化空间了,但是其实在输入0时我们会经过2个跳转,第一个是判断为0时的跳转,第二个是返回循环开始的跳转,做一个循环只需要一个跳转就够了,所以我们要优化的就是这部分。
第一步:我们先无视非0的情况

第二步:优化掉第二个跳转,用第一个判断加跳转实现循环,于是输出自然就到了输入上方

第三步:因为空着手不能输出,所以要在最前面再加一次输入,也就是在循环之前的一次额外处理,别忘了判断为0

第四步:把额外处理和循环里的输入为0的判断加入,就大功告成了

我们来分析下最终结果的处理步骤,因为我们在循环前加了一个额外处理步骤,所以要再分两种情况来分析
为0
非0
第一个
01 02 04
3步
01 02 03
3步
之后的
05 06 04
3步
05 06 07
3步
这样就把为0的情况优化到了3步,就能满足效率诊断了。

公司要让我负责与团体的交接工作,真是太荣幸了。这对我来说一定是一个不可多得的机遇。
11 加运算走廊(第十一年)
这关新增了语句"sub"(加运算走廊新增减法👍)

来看看官方的解释

"sub"语句跟"add"语句都是运算语句,要注意"sub"语句会以我们手上的数为被减数,格子里的数为减数,然后把差放到我们手上。

输出要求
把输入两两相减,先拿后面的减前面的,在哪前面减后面的,输出两次。

优化诊断&效率诊断
优化诊断10/10——效率诊断40/40
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
INBOX
COPYTO 0
INBOX
COPYTO 1
SUB 0
OUTBOX
COPYFROM 0
SUB 1
OUTBOX
JUMP a
分别把两个输入存入两个格子代码:01-04,这时手上的是第二个数,正好能减去格子里存的第一个数并输出代码:05-06,然后再把手上的数换成格子里存的第一个数,和格子里存的第二个数相剪后再输出代码:07-09,之后就可以循环了。

主管说他没学过减法,我笑了起来,他却没笑,难道他不是在开玩笑吗。
13 均衡之间(第十三年)
现在可以加注释了,注释不占代码行数并不算步数,是用来帮助自己理解自己的代码的,但是因为是手写的,所以我觉得不好用。

输出要求
每两个数相等就输出一个,不相等就跳过。

优化诊断
优化诊断9/9——效率诊断28/27
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
b:
INBOX
COPYTO 0
INBOX
SUB 0
JUMPZ c
JUMP b
c:
COPYFROM 0
OUTBOX
JUMP a
两个数相等也就是相减为0,取出第1个数存到格子里,然后去除第2个数和格子里存的的第一个数相减代码:01-04,如果差为0,就从格子里取出第1个数字输出回到循环开头代码:05 07 08 09,如果差不为0,直接回到循环开头代码:06

效率诊断
优化诊断14/9——效率诊断26/27
-- HUMAN RESOURCE MACHINE PROGRAM --

INBOX
COPYTO 0
INBOX
SUB 0
JUMPZ a
JUMP c
a:
b:
COPYFROM 0
OUTBOX
c:
d:
INBOX
COPYTO 0
INBOX
SUB 0
JUMPZ b
JUMP d
这关的步数优化其实和第9关是一样的,优化诊断算法在两个数相等的情况下会跳转两次,所以优化的流程和第9关也是一样的,这里就不赘述了。

公司高层派来了几个穿白大褂的人来监管工作,我偷偷瞄到他们经常埋头窃窃私语并在本子上记录着什么。
14 最大值室(第十四年)
这关新增了语句"jump if negative"

来看看官方的解释

"jump if negative"语句和"jump if zero"语句类似,只是判断方式变成了手上的数小于0的时候跳转。

输出要求
取两个数,然后输出大的。

优化诊断&效率诊断
优化诊断10/10——效率诊断34/34
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
INBOX
COPYTO 0
INBOX
SUB 0
JUMPN b
ADD 0
JUMP c
b:
COPYFROM 0
c:
OUTBOX
JUMP a
先去取第1个数,存入格子,后去取第二个数减去格子里存的第一个数代码:01-04,如果差小于0,说明第1个数大,就从格子里取出存的第1个数代码:05->08,否则说明要不相等要不第2个数大,就再把格子里存的第1个数加回来,得到第2个数代码:05->06->07,之后都输出然后进循环就行代码:09->10

主管跟我说公司会有大变故,不知道高层又要有什么动作。
☕ 斗志注入(第十五年)
17 专属休息室(第十七年)——拓展关
输出要求
取两个数,同符号输出为0,不同符号输出为1。

优化诊断
优化诊断11/12——效率诊断29/28
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
INBOX
JUMPN c
INBOX
JUMPN d
b:
COPYFROM 4
JUMP e
c:
INBOX
JUMPN b
d:
COPYFROM 5
e:
OUTBOX
JUMP a
这关运算逻辑类似异或,计算结果如下
0
1
1
0
所以得出结果前需要做两次判断,一共有4种情况,最终运算流程如下
第一个数为正
01 02
2步 跳转0次
第二个数为正
03 04 05 06 10 11
6步 跳转2次
第二个数为负
03 04 09 10 11
5步 跳转2次
第一个数为负
01 02
2步 跳转1次
第二个数为正
07 08 09 10 11
5步 跳转1次
第二个数为负
07 08 05 06 10 11
6步 跳转3次

优化诊断&效率诊断
优化诊断12/12——效率诊断28/28
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
b:
INBOX
JUMPN d
INBOX
JUMPN e
c:
COPYFROM 4
OUTBOX
JUMP a
d:
INBOX
JUMPN c
e:
COPYFROM 5
OUTBOX
JUMP b
优化诊断算法距离效率诊断只差1步,因为第一个数为负和第二个数为负的情况下占用的步数是最多的,所以从这里下手,把最后的输出分离出来,不再和另一个情况共用,调整一下就行了,最终运算流程如下
第一个数为正
01 02
2步 跳转0次
第二个数为正
03 04 05 06 07
5步 跳转1次
第二个数为负
03 04 10 11 12
5步 跳转2次
第一个数为负
01 02
2步 跳转1次
第二个数为正
08 09 10 11 12
5步 跳转1次
第二个数为负
08 09 05 06 07
5步 跳转2次
可以看到两个数符号相同的情况都优化了1步,并同时满足了优化诊断和效率诊断。
16 绝对正能量(第十六年)
输出要求
取绝对值后输出。

优化诊断
优化诊断8/8——效率诊断40/36
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
INBOX
JUMPN b
JUMP c
b:
COPYTO 0
SUB 0
SUB 0
c:
OUTBOX
JUMP a
这关关键就是小于0的输入取绝对值。先获取数据代码:01,如果小于0,就将手中的数存到格子里,然后减格子中存放的数2次即可得到负数的绝对值代码:02 04 05 06,否则不需要处理代码:03,最后都把手上的数输出回到循环开头就行代码:07 08

效率诊断
优化诊断9/8——效率诊断36/36
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
b:
INBOX
JUMPN c
OUTBOX
JUMP a
c:
COPYTO 0
SUB 0
SUB 0
OUTBOX
JUMP b
这关的步数优化其实跟第9关也类似,优化诊断算法在输入大于等于0时进行了两次跳转,只要加一个输出在第一次跳转前,把第一次跳转目标指向循环开头就行。

主管突然跟我强调要保持微笑,是因为办公室里藏着监控摄像头吗,这里只有我们两个人啊。
☕ 海滩天堂(第十八年)
19 计时器(第十九年)
这关新增了语句"bump+"和"bump-"

来看看官方的解释
"bump+"语句和"bump-"语句会将目标格子里的数加1或者减1,并将结果放入格子和手上。

输出要求
将输入的数和0之间的所有数一个个输出,包括输入自身和0。

优化诊断
优化诊断10/10——效率诊断122/82
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
INBOX
COPYTO 0
b:
OUTBOX
COPYFROM 0
JUMPZ a
JUMPN c
BUMPDN 0
JUMP d
c:
BUMPUP 0
d:
JUMP b
这关要判断大于0小于0的情况,也要考虑输入为0的情况,运算的时候要随时将手中的数存到格子里。
输入为0
01 02 03 04 05
输入大于0
01 02 {03 04 05 06 07 08 10}
输入小于0
01 02 {03 04 05 06 09 10}

效率诊断

优化诊断15/10——效率诊断79/82
-- HUMAN RESOURCE MACHINE PROGRAM --

JUMP d
a:
b:
c:
OUTBOX
d:
INBOX
JUMPZ a
COPYTO 0
JUMPN f
e:
OUTBOX
BUMPDN 0
JUMPZ b
JUMP e
f:
OUTBOX
g:
BUMPUP 0
JUMPZ c
OUTBOX
JUMP g
优化步数依旧是减少3个可能性的步数,也用了之前用过的一些优化方式,当然这关主要是优化循环内的步数,因为占很大一部分比例。
输入为0
01 03 04
输入大于0
01 03 04 05 06 {07 08 09 10}
输入小于0
01 03 04 05 06 11 {12 13 14 15}

第十九年,时间过得真快,主管不知道上哪了,我的头发也明显变稀少了。
20 乘法研讨会(第二十年)
这关新增了一个机制,标签,只要点击格子区域就能自定义格子的编号显示,类似将注释贴在格子上,目标为格子的语句编号部分会自动显示自定义的内容,这个功能还是有点用的。


输出要求
将两个数相乘后输出。

优化诊断

优化诊断15/15——效率诊断147/109
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
INBOX
COPYTO 0
INBOX
COPYTO 1
JUMPZ d
COPYFROM 9
b:
ADD 0
COPYTO 5
BUMPDN 1
JUMPZ c
COPYFROM 5
JUMP b
c:
COPYFROM 5
d:
OUTBOX
JUMP a
因为没有乘法工具,做法就是以一个数为计数,用0累加另一个数后减1计数值,直到计数值减为0,在这基础上要考虑两个数都可能为0。优化诊断的算法额外处理了第二个数
为0的情况,并以第二个数为计数值。
第1个数存储
第2个数存储(计数值)
累加中间值
格子0
格子1
格子5

效率诊断




优化诊断61/15——效率诊断109/109
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
b:
c:
INBOX
JUMPZ n
COPYTO 0
INBOX
JUMPZ o
COPYTO 1
COPYTO 5
d:
BUMPDN 0
JUMPZ e
COPYFROM 1
ADD 5
COPYTO 5
BUMPDN 0
JUMPZ f
COPYFROM 1
ADD 5
COPYTO 5
BUMPDN 0
JUMPZ g
COPYFROM 1
ADD 5
COPYTO 5
BUMPDN 0
JUMPZ h
COPYFROM 1
ADD 5
COPYTO 5
BUMPDN 0
JUMPZ i
COPYFROM 1
ADD 5
COPYTO 5
BUMPDN 0
JUMPZ j
COPYFROM 1
ADD 5
COPYTO 5
BUMPDN 0
JUMPZ k
COPYFROM 1
ADD 5
COPYTO 5
BUMPDN 0
JUMPZ l
COPYFROM 1
ADD 5
COPYTO 5
BUMPDN 0
JUMPZ m
COPYFROM 1
ADD 5
COPYTO 5
JUMP d
e:
f:
g:
h:
i:
j:
k:
l:
m:
COPYFROM 5
OUTBOX
JUMP c
n:
OUTBOX
INBOX
JUMP a
o:
OUTBOX
JUMP b
缩减步数的方式依旧是优化所有可能性流程,把两个输入的为0判断都加上放在最后,然后优化成这样实在优化不下去了

优化诊断21/15——效率诊断121/109
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
b:
c:
INBOX
JUMPZ f
COPYTO 0
INBOX
JUMPZ g
COPYTO 1
COPYTO 5
d:
BUMPDN 0
JUMPZ e
COPYFROM 1
ADD 5
COPYTO 5
JUMP d
e:
COPYFROM 5
OUTBOX
JUMP c
f:
OUTBOX
INBOX
JUMP a
g:
OUTBOX
JUMP b
这个时候离目标只差12步,输入一共有5对,平均下来每次输入只需要优化2-3步就行,于是想到了一个比较邪道的办法,13行的跳转负责运算的循环,只要把这里面的内容复制需要的次数,就不用每次循环时多走一次跳转了,经过测试输入数据不会大于9,于是只要拷贝后使循环内容重复8次就行,因为循环前已经处于1倍状态,最后因为程序员的洁癖,依旧把外面的跳转保留了下来。

主管回来了,还提到了他的三明治,希望我没有无意中动了他的三明治。
22 斐波那契参上(第二十二年)——拓展关
输出要求
输出小于等于输入数的斐波那契数列
输出斐波那契数列是一个很经典的编程题,简单来说就是任意位置相邻的3个数存在前2个数相加等于第3个数的关系。
1 1 2 3 5 8 13 21 34 55

效率诊断

优化诊断23/19——效率诊断135/156
-- HUMAN RESOURCE MACHINE PROGRAM --

BUMPUP 9
a:
INBOX
COPYTO 5
COPYFROM 9
OUTBOX
COPYFROM 9
OUTBOX
COPYFROM 9
COPYTO 0
COPYTO 1
b:
ADD 0
COPYTO 2
SUB 5
JUMPZ c
JUMPN d
JUMP a
c:
d:
COPYFROM 2
OUTBOX
COPYFROM 1
COPYTO 0
COPYFROM 2
COPYTO 1
JUMP b
输入数据
第1个数
第2个数
第3个数
格子5
格子0
格子1
格子2
考虑到从第三位开始才可以循环生成,所以需要先前置处理生成开始的第一位和第二位并输出,将格子9中的0加1变成1代码:01,输入数据存入格子代码:02 03,从格子9取1输出两次代码:04 05 06 07再从格子9取1放入格子0格子1代码:08 09 10,这时候手上的是1也就是第2个数,以手上拿着第2个数的状态进循环,先加格子0里存的第1个数生成第3个数代码:11 12,然后将手中的第三个数和格子5中存的输入数据相剪,大于0说明已经超出要求范围了,回到大循环开始,不然接着往下代码:13 14 15 16,之后输出格子2里存的第3个数代码:17 18,将格子1里存的第2个数拷贝到格子0作为第1个数,格子2里存的第3个数拷贝到格子1作为第2个数代码:19 20 21 22,接下来回到循环开头就又是以手上拿着第2个数的状态进循环代码:23

优化诊断

优化诊断19/19——效率诊断176/156
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
INBOX
COPYTO 5
BUMPUP 9
COPYTO 0
BUMPDN 9
COPYTO 1
b:
ADD 0
COPYTO 2
SUB 5
JUMPZ c
JUMPN d
JUMP a
c:
d:
COPYFROM 2
OUTBOX
COPYFROM 1
COPYTO 0
COPYFROM 2
COPYTO 1
JUMP b
先满足了效率诊断,优化诊断的满足就看哪块代码行数比较多进行优化,前置处理部分感觉有点占地方,能不能不用前置的额外输出,完全靠计算结果输出呢。看看斐波那契数列的前几个数
1 1 2 3
如果往前回溯的话就是
0 1 1 2 3
再往前回溯就是
1 0 1 1 2 3
所以我们只要以第一个数为1,第二个数为0进入运算循环就能自动生成完整的斐波那契数列。
前置处理部分改成将格子9中的数加1代码:03,这时格子9和手上都为1,将1也就是第一个数存入格子0代码:04,然后将格子9中的数减1代码:05,这时格子9和手上都为0,格子9回到了0,手上也拿着第二个数0,将手上的第二个数存入格子1代码:06,之后的循环不用变。
24 模运算(第二十四年)——拓展关
输出要求
输出以第一个数为被除数第二个数为除数的余数

优化诊断&效率诊断
优化诊断12/12——效率诊断57/57
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
INBOX
COPYTO 0
INBOX
COPYTO 1
COPYFROM 0
b:
SUB 1
JUMPN c
COPYTO 0
JUMP b
c:
COPYFROM 0
OUTBOX
JUMP a
求余的思路就是拿第一个数不停减去第二个数,在差变为负数时的上一个数就是所要的数。获取第一个输入存入格子0代码:01 02,获取第二个输入存入格子1代码:03 04,取出格子0中存的第一个输入代码:05,减去格子1里存的第二个数,如果差大于等于0,存到格子0里,回到循环开始代码:06 07 08 09,如果差小于0,取出格子0里存的这次减之前的数输出,回到大循环开始代码:06 07 10 11 12
26 小试除法(第二十六年)——拓展关
输出要求
输出第一个数除以第二个数的商

效率诊断

优化诊断16/15——效率诊断76/76
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
COPYFROM 9
COPYTO 2
INBOX
COPYTO 0
INBOX
COPYTO 1
COPYFROM 0
b:
SUB 1
JUMPN c
COPYTO 0
BUMPUP 2
COPYFROM 0
JUMP b
c:
COPYFROM 2
OUTBOX
JUMP a
这关题目已经提醒了,可以把上一关的解法拷贝过来修改,上一关只需要获得最终的余数,这关要求商,只要减的的时候记录下剪的次数就行。开始时把格子9里的0初始化给格子2代码:01 02,进入循环后每减1次将格子2里的数加1,别忘了再从格子0里把数拿回手里给下次循环用代码:11 12,最后输出的时候把格子2里的次数输出就行代码:14

优化诊断&效率诊断
优化诊断15/15——效率诊断76/76
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
COPYFROM 9
COPYTO 2
INBOX
COPYTO 0
INBOX
COPYTO 1
b:
COPYFROM 0
SUB 1
JUMPN c
COPYTO 0
BUMPUP 2
JUMP b
c:
COPYFROM 2
OUTBOX
JUMP a
优化代码行数的话因为循环之前做了一次从格子0拷贝,思路是和循环体中的从格子0拷贝合并,然后整理下就行。
28 三排序(第二十八年)——拓展关
输出要求
每三个输入按照从小到大的顺序输出。

优化诊断


优化诊断33/34——效率诊断87/78
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
b:
INBOX
COPYTO 5
COPYTO 6
INBOX
SUB 5
JUMPN c
ADD 5
COPYTO 6
JUMP d
c:
ADD 5
COPYTO 5
d:
INBOX
COPYTO 2
SUB 5
JUMPN e
COPYFROM 5
OUTBOX
COPYFROM 2
COPYTO 5
SUB 6
JUMPN f
COPYFROM 6
OUTBOX
COPYFROM 5
OUTBOX
JUMP a
e:
COPYFROM 2
OUTBOX
f:
COPYFROM 5
OUTBOX
COPYFROM 6
OUTBOX
JUMP b
3个数排序一共有6种可能的情况,我的解法是先比对前2个,找出小的,然后拿小的和第3个比对,找出最小的,输出最小的后剩下的2个数比对下按顺序输出就行,完成后如下。


优化诊断36/34——效率诊断91/78
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
b:
INBOX
COPYTO 0
INBOX
SUB 0
JUMPN c
ADD 0
COPYTO 6
COPYFROM 0
COPYTO 5
JUMP d
c:
ADD 0
COPYTO 5
COPYFROM 0
COPYTO 6
d:
INBOX
COPYTO 2
SUB 5
JUMPN e
COPYFROM 5
OUTBOX
COPYFROM 2
COPYTO 5
SUB 6
JUMPN f
COPYFROM 6
OUTBOX
COPYFROM 5
OUTBOX
JUMP a
e:
COPYFROM 2
OUTBOX
f:
COPYFROM 5
OUTBOX
COPYFROM 6
OUTBOX
JUMP b
第1个输入
2个数中的小数
2个数中的大数
第3个输入
格子0
格子5
格子6
格子2
距离优化诊断要求只有几行代码,根据分析,格子0只有在第一次对比的时候用到了,于是从这里入手。第一次比对这块代码的功能其实就是把前两个输入中的小数放入格子5,大数放入格子6。最终优化流程是将第1个数同时存入格子5和格子6,取第2个数和格子5中的第一个数比对,根据比对结果把第2个数存入格子5或格子6。

效率诊断
因为太长了,就不上截屏了
优化诊断58/34——效率诊断75/78
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
b:
c:
d:
e:
f:
INBOX
COPYTO 0
INBOX
COPYTO 1
SUB 0
JUMPN i
COMMENT 1
INBOX
COPYTO 2
SUB 0
JUMPN h
COPYFROM 0
OUTBOX
COPYFROM 2
SUB 1
JUMPN g
COPYFROM 1
OUTBOX
COPYFROM 2
OUTBOX
JUMP a
g:
COPYFROM 2
OUTBOX
COPYFROM 1
OUTBOX
JUMP b
h:
COPYFROM 2
OUTBOX
COPYFROM 0
OUTBOX
COPYFROM 1
OUTBOX
JUMP c
i:
COMMENT 0
INBOX
COPYTO 2
SUB 1
JUMPN k
COPYFROM 1
OUTBOX
COPYFROM 2
SUB 0
JUMPN j
COPYFROM 0
OUTBOX
COPYFROM 2
OUTBOX
JUMP d
j:
COPYFROM 2
OUTBOX
COPYFROM 0
OUTBOX
JUMP e
k:
COPYFROM 2
OUTBOX
COPYFROM 1
OUTBOX
COPYFROM 0
OUTBOX
JUMP f


DEFINE COMMENT 0
eJwTZWBg+LXqqPPmtWaWOhveG8/dmqJzaedi7apDRmZLTrm7Mtz4nCLzdEn7vCdaPfn3nOfFn/lzrPTI
pWsLtph/DN75+d3Ei4VvgUYwLDm15mXS6T9f3M/+/88wCkbBKBgyAADT9S5S;

DEFINE COMMENT 1
eJxjZWBg4F+sZ+y/2N3178ofh3es/v+fYRSMglEwYgAADpcJWQ;
第1个输入
第2个输入
第3个输入
格子0
格子1
格子2
优化代码运行步数只要减少跳转,并只用3个格子存输入数据,然后根据情况一步步处理就行,这样就不能复用代码了,要一点点手动拷贝。
21 零结尾字符串(第二十一年)
输出要求
把零结尾字符串累加输出(把输入内容累加,直到输入为0时输出并清空)。

优化诊断
优化诊断10/10——效率诊断92/72
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
COPYFROM 5
COPYTO 0
b:
INBOX
JUMPZ c
ADD 0
COPYTO 0
JUMP b
c:
COPYFROM 0
OUTBOX
JUMP a
这关的难度比较低,按照需求一步步来就能满足优化诊断了。

效率诊断
优化诊断11/10——效率诊断70/72
-- HUMAN RESOURCE MACHINE PROGRAM --

JUMP c
a:
COPYFROM 0
b:
OUTBOX
c:
INBOX
COPYTO 0
JUMPZ b
d:
INBOX
JUMPZ a
ADD 0
COPYTO 0
JUMP d
运行步数优化从输出前置和减少格子使用入手。因为最后都是从格子0里获得输出数据,所以第一个输入不管是0还是非0都可以直接拷贝到格子0,这样就少了一步从格子5获取0来初始化格子0的步骤,然后把流程理清就行了。

新来的主管感觉不太好相处。
23 最小的数字(第二十三年)
输出要求
把每个零结尾字符串里的最小数输出。

优化诊断&效率诊断
优化诊断13/13——效率诊断75/75
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
INBOX
COPYTO 0
b:
c:
INBOX
JUMPZ e
SUB 0
JUMPN d
JUMP c
d:
ADD 0
COPYTO 0
JUMP b
e:
COPYFROM 0
OUTBOX
JUMP a
先从上一关拷代码过来,需要修改的是初始化和中间操作,取第一个输入作为初始数据放入格子0,中间循环判断输入小于格子0中存的数就覆盖就行。

公司高层又开始搞表面文章,我只在乎我银行卡里的数字。
25 累加的倒计时(第二十五年)
输出要求
把输入数据和0之间的所有数相加并输出,包括输入的数和0。

优化诊断&效率诊断
优化诊断12/12——效率诊断82/82
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
INBOX
JUMPZ d
COPYTO 0
COPYTO 3
b:
BUMPDN 0
JUMPZ c
ADD 3
COPYTO 3
JUMP b
c:
COPYFROM 3
d:
OUTBOX
JUMP a
倒计时
累加结果
格子0
给自3
这关相较于之前的变化就是既要做倒计时又要做累加,其实难度不高,理清流程就行。

二十五年了,在这个岗位上我已经连续做了二十五年,我不知道这样做下去有什么意义,甚至连主管都给不了我满意的答案。
☕ 午夜惊魂(第二十七年)
29 存储楼层(第二十九年)
这关新增了一个机制,使用格子里的数。什么叫做使用格子里的数呢,我们一直在用格子存取数据,但是其实并没有让这个数字产生意义,只是一个单纯的数而已。使用格子里的数是指用这个数来表示某个我们想要指定的格子的编号,这是一种叫做地址的概念。举个例子来说,101住户的人家一直订牛奶,但是有几天要出门,于是写个条子让送奶员把牛奶交给102住户的人,于是当送奶员打开101的格子看到102时,102就是一个地址,表示目标是编号102的格子。


输出要求
输出输入地址对应的格子的内容。

优化诊断&效率诊断
优化诊断5/5——效率诊断25/25
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
INBOX
COPYTO 10
COPYFROM [10]
OUTBOX
JUMP a
把输入存入格子10,然后从格子10里地址指向的格子里取出内容输出就行,注意要以空格子存储地址。

30 串存储楼层(第三十年)
输出要求
把输入地址对应的格子以及之后一直到0为止的内容输出。

优化诊断&效率诊断
优化诊断7/7——效率诊断203/203
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
INBOX
COPYTO 24
b:
COPYFROM [24]
JUMPZ a
OUTBOX
BUMPUP 24
JUMP b
将格子24作为输入存储,然后循环取格子24中地址的格子内容后将格子24数值加1,直到地址指向内容为0的格子。

31 反转字符串(第三十一年)
输出要求
反转0结尾字符串后输出。

优化诊断&效率诊断
优化诊断11/11——效率诊断115/122
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
b:
BUMPUP 14
INBOX
JUMPZ c
COPYTO [14]
JUMP b
c:
BUMPDN 14
d:
COPYFROM [14]
OUTBOX
BUMPDN 14
JUMPZ a
JUMP d
思想就是以格子14为地址存储,然后获得输入后格子14加1,指向下一个地址,直到输入0为止,这时从格子14中地址指向的格子里取数据后输出,然后格子14减1,指向上一个地址,直到指向初始地址0为止。

32 库存报告(第三十二年)
输出要求
输出与输入相等的地毯上的值的个数。

优化诊断

优化诊断16/16——效率诊断432/393
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
INBOX
COPYTO 15
COPYFROM 14
COPYTO 18
COPYTO 19
b:
COPYFROM [18]
JUMPZ e
SUB 15
JUMPZ c
JUMP d
c:
BUMPUP 19
d:
BUMPUP 18
JUMP b
e:
COPYFROM 19
OUTBOX
JUMP a
输入值
当前比对地址
相等个数
格子15
格子18
格子19
根据处理流程做就行,比较简单。

效率诊断

优化诊断17/16——效率诊断392/393
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
INBOX
COPYTO 15
COPYFROM 14
COPYTO 18
COPYTO 19
BUMPDN 18
BUMPDN 19
b:
BUMPUP 19
c:
BUMPUP 18
COPYFROM [18]
JUMPZ d
SUB 15
JUMPZ b
JUMP c
d:
COPYFROM 19
OUTBOX
JUMP a
运行步骤优化就是将复用的部分提取出来单独以减少跳转次数,然后整理下就行。

☕ 王五去哪(第三十三年)
34 删除元音字母(第三十四年)
输出要求
把地毯上没有的输入数据输出。

优化诊断&效率诊断
优化诊断13/13——效率诊断323/323
-- HUMAN RESOURCE MACHINE PROGRAM --

a:
b:
COPYFROM 5
COPYTO 9
INBOX
COPYTO 8
c:
COPYFROM [9]
JUMPZ d
SUB 8
JUMPZ b
BUMPUP 9
JUMP c
d:
COPYFROM 8
OUTBOX
JUMP a
输入值
当前比对地址
格子8
格子9
以格子9为地址存储,格子9的值加1来获取指向的格子中的值一个个比对,如果比对到相等的值则略过,比对到值为0则输出。