撰写了文章 发布于 2019-04-22 11:35:40
程序员升职记/人力资源机器(Human Resource Machine)伪·指南
前言
首先说一下,我对代码什么的并不是很了解,大一大二学过的大计基、Java什么的也基本忘光了,顶多记得什么if、while,至于代码怎么写,对不起,我不会。因此这个指南中充满了个人理解,可能很不专业,有些可能是“啊??我也不知道为什么这样就可以了减少运算步数了?”,望读者谅解。
不过一路玩下来可以发现,这个游戏并不需要你会写代码,更多的是考验你的逻辑能力,游戏的难点也不在于过关,而在于简化代码和减少运算次数。所谓写码5分钟,报错修改优化20小时。
小提示:有时候和主管讲讲话会得到很多有用的信息哦~
注:为什么说是伪·指南呢?原因有四:
- 部分代码有参考steam指南Perfect Game - Human Resource Machine。毕竟有的关卡逻辑好想,但是写出来的代码疯狂报错,而大佬的代码真的简单又漂亮~没有它我大概就秃了。
- 很多关卡都不是只有唯一解,我更多是在描述自己解该关卡的思路,所以可能会有很多我还没有想到的地方(这也是有几关怎么优化都不行的原因,陷入思维定式了)。
- 因为是边玩边写,所以这个文章解法顺序不是严格按照1~41来的(日常先清支路)。
- 还有几个成就我还没研究呢!
所以欢迎各位大佬指教呀~
第一年~第六年
1.收发室
这一关可能就是负责告诉你“不要两手空空去执行outbox”吧...非常基础
6行6步
2.繁忙的收发室
所谓jump,其实就是增加了循环功能。
(不过我不理解为什么多加一组inbox、outbox运算步数就减少了)
3行30步
5行25步
3.复印楼层
6行6步
4.扰码处理器
7行21步
6.多雨之夏
6行24步
支路:第8年、第10年、第12年
8.三倍扩大室
所谓3倍就是A*3=A+A+A
6行24步
10.八倍扩大装置
8倍,但只让你用3个Add,那可以这么想↓
8*A= | A+A(=2A) | 2A+2A(=4A) | 4A+4A(=8A) | 也即是23倍 |
1个Add | 2个Add | 3个Add |
9行36步
12.四十倍扩大器
40倍的道理是和上面的8倍类似的,但如果要节省行数、减少运算次数,事实上你能发现加到第5轮的时候就是A的32倍(25),那么只需再加上一个8倍的A就能得到40*A
14行56步
主路线:第7年~第14年
7.零扑灭行动
这次我们拥有的新命令:“0跳转”,也即当小人手上拿着0的时候,跳转到你指定的步骤,那不想要0,就只要当手中是0的时候再重新去inbox拿一个新的非0数字放到outbox就好啦
4行23步
9.零保护行动
这关减少步数的方式就是把图一的小循环多复制2个塞进大循环里
5行28步
13行25步
11.加运算走廊
本关又多了一个新运算:Sub(减运算),意思是当小人手上拿着A时,如果你的命令是Sub 0(比如说0这个位置现在是B),那么得到的结果就是A-B=C
例:copyfrom 0(A) Sub 1(B) | 0 | 1 | 结果:A-B=C |
A | B |
10行40步
13.均衡之间
这一关的思路是相等的数相减等于0,然后使用jump if 0进行接下来的操作。将outbox提前则可以在某次循环中提前结束,,以节省运算步数(应该是这样...)
9行27步
14.最大值室
本关新增功能:jump if negative(当为负数时跳转)
那么在比大小时,就有如下思路:
10行34步(最佳)
11行32步
分支:第17年
17.专属休息室
本关的输出结构不是1就是0,而它要你比较正负数,那就肯定要运用“负数时跳转”这个条件了,思路如下:
当然,在游戏中,负数时使用jump if negative即可
12行28步
主路线:第16年~第20年
16.绝对正能量
去掉负号:A=(- A)-(- A)-(- A)
9行36步
8行39步
19.计时器
本关的意思就是当你拿到A(假设A为正数),那么就要输入A、A-1、A-2、......、2、1、0
一开始的大致思路如下:
10行87步
17行80步
20.乘法研讨会(运算步数优化还在研究)
这关怎么优化到≤109步我还没有研究出来,希望有大佬可以提示一下hhh
虽然说是乘法,但其实A*B等于A个B相加,那么大致思路如下:
0(数字1) | 1(数字1) | 2(计数器) | |
输入A到0、1 | A | A | |
输入B到2 | A | A | B |
dump - 2;0+1 | 2A | A | B-1 |
dump - 2;0+1 | 3A | A | B-2 |
...... | |||
dump - 2;0+1 | B*A | A | 0 |
输入0(即B*A) |
15行139步
20行110步
分支“第22年、第24年、第26年、第28年
22.斐波那契参上
斐波那契数列的公式估计考过高数数列的人都会很眼熟:Fn=Fn-1+Fn-2,然后就可以开始一系列操作,粗略思路如下:
位置→ | 0 | 1 | 2 | 3 | 4 | |
输入A到位置0; 复制位置4的0并输入到位置1、2 | A | 0 | 0 | 0 | ||
dump + 2并输出 | A | 0 | 1 | 0 | 输出数字1 | |
复制位置2的数到位置3 | A | 0 | 1 | 1 | 0 | |
add 1并复制到位置2 | A | 0 | 1 | 1 | 0 | |
用位置0的A减去位置2的数,小于0就结束循环回到开头,否则继续 | ||||||
复制位置3的数到位置1;复制位置2的数并输出 | A | 1 | 1 | 1 | 0 | 输出数字1 |
复制位置2的数到位置3 | A | 1 | 1 | 1 | 0 | |
add 1并复制到位置2 | A | 1 | 2 | 1 | 0 | |
用位置0的A减去位置2的数,小于0就结束循环回到开头,否则继续 | ||||||
复制位置3的数到位置1;复制位置2的数并输出 | A | 1 | 2 | 1 | 0 | 输出数字2 |
......以此类推 |
位置4的0相当于只是提供数列开头那个1的工具(也即下图中位置9的0)
19行156步
24.模运算
这个题...不,这一关的意思是A=n*B+C,那么你要输出的就是那个C,那么可以这么想:
- A-B
- A-B-B
- A-B-B-B
- ......
- A-B*n
- A-B*(n+1) 👈哇什么它是一个负数!
- 输出A-B*(n+1)+B(即A-B*n)
12行54步
26.小试除法
这一关和上一关(第26关)很像,区别在于最后输出的是那个n,
那么再额外加一个Dump+计数就好啦~
15行73步
28.三排序
老实说这关卡了我很久,倒不是因为难,而是jump来jump去很容易出错,所以可以勤用标签来写注释
思路1:3个数比大小会有6种结果,这也是最容易想到的思路:
58行75步
思路2:堆出6种结果好麻烦!outbox那么多,眼睛都花了!能不能只保留3个输入、3个输出啊?!当然可以:将3个数输入到地板上后,两两比大小,按照从小到大的顺序依次排列,最后依次输出即可(不过中间复制来复制去也足够让你眼花缭乱hhh)
34行140步
主路线:第21年~25年
21.零结尾字符串
不知道什么是零结尾字符串?让我们先来看看主管的解释:
什么是字符串?字符串的形式如下:
- 159346
- 61548646462956
那怎么判断字符串的结束/开始呢?找一个特殊的东西来标记就好,比如0:
- 13154803188390
还有一种情况是字符串为空串,比如:
- 65201230020
- 1230000000001230
那么这关的思路就很明了了:
10行72步
23.最小的数字
是零结尾字符串与比大小的结合,但不难,思路如下:
13行75步
25.累加的倒计时
本关灵活应用Dump-功能即可,思路如下(有时候不要被地板上多出来的东西迷惑哦):
11行82步
优化,将outbox提前,12行79步
主路线:第29年~第34年
29.存储楼层
到了这一关,你发现地毯的颜色变了,没错,它现在变成了存储器,现在你输入的数字表示地毯上的位置,比如:
- 输入数字2
- 到位置2上取走上面的字符A
- 输出字符A
注意,从本关开始,copy to、copy from、add.......后面的数字是可以切换模式的:
点击后面的数字即可,加上“[ ]”表示位置10上的字符的作用是指示地址
5行25步
30.串存储楼层
存储器与零结尾字符串的结合,只不过现在零结尾字符串被放在了存储器中。
7行203步
题外话:机密是”The target xx is awake,xxx take this xxx.” 糟了我要被开除了!
31.反转字符串
要反转一个字符串怎么办?朴素的想法:先按照顺序摆放,再反着拿走。那本关之这样朴素吗?没错,它就是这么朴素~
地毯上的14号位置就是给你来定位的,但是你要注意:
- 如果你省略了第一步的dump+,那么等输完一串字符后,定位格上的数字就是-1,然而并没有这样的格子
- 如果你这么做了,那么恭喜你,你将解锁一个成就哈哈哈
11行121步
优化了一下,现在是10行121步了
32.库存报告(运算步数优化还在研究)
本关的存储器里有一长串零结尾字符串,每输入一个字符,就要从存储器中找有多少个相同的字符,最后输出相同字符的个数。
这一关要注意的事如下:
- 首先你需要一个计数器和一个定位器(来吧copy那个0吧)
- 你可以将字母想象成数字,比如A=1、B=2、......、Z=26
- 那么相同字母相减等于0,此时就可以使用jump if 0条件,在计数器上dump+
- 当你拿到存储器中的0时,字符串结束,可以输出结果了
设置定位器与计数器
当字符相同时,计数器+1
字符不同时,接着找
拿到0时,计数结束,输出计数结果
16行404步
34.删除元音字母
部分思路其实和第32关相似:
- 也即是如果你输入了元音字母,那么和地毯上其中一个元音字母的差一定是0,此时使用jump if 0条件。
- 地毯上的0既是零结尾字符串的标志,也是提供定位器的元件
13行323步
分支:第36年、第38年、第40年
36.字母排序
这一关分为两部分:
- 将两个单词分别列出来
- 比较单词顺序
那么我们就需要2组定位器,copy一份地毯上的即可,再将两个词分别列出来
列出单词
T-I=11>0,因此判断第一排的单词先出现,输出第一排单词
在位置12拿到0,说明第二排的单词已经结束,会先出现,输出第二排单词
33行106步
38.数位炸弹(运算步数优化还在研究)
本关的思路其实很简单,假设有一个数字321,它能减3个100、2个10,那么最后输出3、2、1即可。
但这一关最坑的地方其实在于假如这个数是301,如果你只是简单地用jump if 0,那么你最后输出的可能就是3、1了,那么怎么避免这样的状况呢?思路如下:
- 当百位数非0时(三位数),选择输出路线1
- 当百位数为0时(二位数),选择输出路线2
简而言之就是要准备两种copy十位数的方式
还有一个建议是按照个位数→十位数→百位数的顺序来编写程序(用注释做做标记最好)
29行209步
40.质数工厂
所谓质因数就是一个数的因数为质数,比如:
- 6=2*3(输出2、3)
- 8=2*2*2(输出2、2、2)
- 17=1*17(输出17)
其实这一关的思路好想,但是代码难写(我记得当初的Java考试写过这玩意!!!明明不难的!),我改来改去改了很久最后都会报错,后来看了大佬写的代码之后才知道自己疏漏了哪里。那么一开始我的大致思路是这样的(有瑕疵,可以跳过不看):
- 输入质数k,然后输入数字m
- 那么当m-k=0(m=k)时,说明可以输出m;
- 若m-k>0,那么就继续减:如果m-n*k<0,说明这个k不是它的因数,k+1,再重新减;若m-n*k=0,那么即可输出k,再让那个n成为新的m,继续循环
然后我就循着这个思路写了很久,最后陷入了k不断增大,甚至大过m的死循环,因为我忘记了一件事,那就给k设置一个上限。那么要解开这个题一关,大致思路如下:
- 先设置一个最小因数1(k1),输入数字m,再设置1个最小质数k=2(k2)
- 开始m-k的循环,此时有2种情况,①m-n*k=0;②m-n*k<0
- 若m-n*k=0,说明k=2是m的最小质因数,输出即可
- 若m-n*k<0,说明k=2不是m的因数,执行k+1,再进行m-k循环,直到得到m-n*k=0的结果,便可输出m的最小质因数
12的最小质因数为2
3的最小质因数为3
- 现在我们就需要得到m/k的结果,也即新的m
- 那么就可运用m-n*k,最终输出那个n(计数),让其成为新的m。
- 对这个m进行大小检验,只要m>1(k1),说明它还有因数存在
12÷2=6,因为6-1=5>0,因此还有因数存在
- 接下来就和之前一样,对新m进行m-k循环,寻找其质因数即可
- 直到m=1(k1)时,说明质因数已经寻找完毕,可以输入新的数字了
当m-1=0时,结束循环,最终输出12的质因数:2、2、3
28行365步(但其实第一次跑出来的是357步,谜)
主路线:第35年~第41年
35.删除重复项
这一关依旧要用到相同字母相减=0这个条件,大致思路如下:
- 首先输入的第一个字母一定不会有重复,将它copy到地毯上之后,输出
- 输入的第二个字母就要和前一个字母对比,若不同,copy到地毯上,输出;如果相同,那么就去输入第三个字母,依次类推。
17行159步
37.数据链
本关非常简单(简直都不像是后面的关卡呢),大致思路如下:
- 输入数字A到指定位置(比如位置1),即地址a
- 按照这个地址a去取存储器中的字符,输出
- dump+位置1,copy from [位置1],即可获得另一组数据的地址b
- 按照地址b去取存储器中的字符,输出
- ......依此类推
8行63步
39.重设坐标
乍一看这一关很玄乎,坐标?输出坐标???但只要细心观察,就可以发现规律,没错,这关你得先找规律,大致思路如下:
- 首先你发现地板上有0、4这两个数字,仔细推算就能发现用途
- 举个
很多例子:数字 坐标 0 0=0+0×4 (0,0) 4 4=0+1×4 (0,1) 6 6=2+1×4 (2,1) 11 11=3+2×4 (3,2) - 没错就是这么简单呢~
- 那么接下来就好办了,copy一个0当作计数器,每减去一个4就给它dump+,直到最后一次减去4为负数时,加回一个4,就是列坐标了
- 然后再copy计数器上的数(即行坐标),输出,即可得到坐标
14行73步
41.排序楼层
显然本关分为两部分:
- 是之前我们做过的,将字符串在地板上列出
- 对字符串内的字符进行排序,由小到大输出
part 1现在对我们来说很简单,不会的可以去复习一下第36关。现在要思考的是怎么运作part 2。排序其实我们也熟悉,比如28关的三排序、第36关的字母排序等等(不如说这个就是第36关的变种)。那我们的大致思路如下:
- 现在一串字符已经摆放在了地毯上
- 在dump-23后,位置23上的数字现在代表字符串长度,再将其复制到位置21、22
- dump-21
- 位置22的数字表示现在你想要用来和其他字符进行比较的那个字符的位置
- 位置21则表示要与位置22上数字所指向的地址内的字符相减的字符的位置
- 现在字母D开始和位置3的U进行比较,相减小于0,说明D更小,继续循环比较,直到与位置0的C相减大于零,将C所处的位置copy到位置22
- 由于C正好是这串字符的第一位,那么输出即可
- 现在将位置4的D复制到位置0上,同时dump-23,得到3,表明现在字符串已经缩短了一位,现在我们要排列的字符串即为DLOU
- 接下来的步骤就和之前一样了,那就是不断地比较~
27行637步
结语
恭喜你完成游戏!在工作了42年后,你被开除了!发现自己还有很多头发!!!
以及老板每天暗示你996,甚至想让你007,最后还开了你,虽然是几年前的游戏,但是一点也不过时呢 :(
总而言之,这是一款适合在闲暇时光考验自己逻辑能力的游戏,有兴趣还是可以玩一玩的~
最后再次感谢大佬的指南,它真的给我提供了很大帮助。
目录
太阳家的猫 1年前
发布