程序员升职记吧 关注:131贴子:358
  • 2回复贴,共1

第36关 字母排序 30行 还有优化空间吗?

只看楼主收藏回复

本关给两个单词,然后判断哪个词在词典前面,放入outbox就行。
最开始思路:想着把2个词都放在中间,因为每个词都没超过5个字母,右下脚又是0和10,想着第一个词放0-4格里,第二个词放10-14格里,然后一个字母对一个字母做减法,差额小的在前面就行了。程序跑通了,但是不给过关,说不能应付所有情况(第一次碰到的正好两个词都是5个字母)
然后我有跑了一次,第二次出现第二个单词是2个字母的,程序报错。
在网上找了其他人的方法(照着输入进去也是提示无法覆盖所有情况),发现两个关键点:
1、第二个词不用排列出来,抽取第二个词的每一个字母,依次减第一个词的对应字母就好了;
2、inbox里面每个词后面的0(有2个)都是很重要的终止判定。
ok,那么就开始优化代码。
思路是这样,
1)先把第一个词排列出来,把0放在第一个词后面,作为终止判定记号
2)然后拿第二个词的第一个字母放在地板上,拿第一个词的第一个字母和它作比较
结果为正,说明第一个词的字母靠后,直接输出第二个词的这个字母,以及后面在inbox里的所有字母,拿到0就终止程序;
结果为负,直接输出第一个词的这个字母,以及后面已经排列出来的字母,拿到0就终止程序
结果为0,把该字母输出outbox,然后比较第二个字母。
3)为什么不从inbox里直接拿第二个词直接和第一个词的对应字母做比较呢?可以省一行代码。主要是会出现第一个词字母比第二个词少,如果用第二个词直接减第一个词,会出现字母减0的情况,程序报错。

(话说代码标签真好用,各种jump用标签隔开,思路就很清晰了)
-- HUMAN RESOURCE MACHINE PROGRAM --
COPYFROM 23 /复制第23格的数字0
COPYTO 20 /复制数字0到第20格,作为辅助计数格
a: /开始将第一个单词放在0-4个内
INBOX /去inbox里拿一个字母
JUMPZ b /如果是0的话就跳转到b步骤
COPYTO [23] /拿完以后放在第23格显示的数字编号那一格里
BUMPUP 23 /将第23格数字编号增加1
JUMP a /重复a步骤,直到拿到0跳转b
b: /拿到0以后,做终止标记
COPYTO [23] /第一个单词后的0放在第一个单词后面格子里
c: /开始做比较
INBOX /去inbox里拿第二个单词的第一个字母
JUMPZ g /如果拿到0,就终止程序
COPYTO 19 /放到第19格
COPYFROM [20] /拿取20格数字对应格数的字母(第一次的话就是第0格,第一个单词的第一个字母)
JUMPZ h /如果拿到0终止程序
SUB 19 /减去第19格的字母
JUMPN e /结果为负数,跳转到e步骤
JUMPZ f /结果为0,跳转到f步骤
COPYFROM 19 /结果为正,输出第二个词对应字母及后面字母输出,先复制对应字母
d: /输出第二个词
OUTBOX /放入outbox
INBOX /去inbox里拿字母
JUMPZ i /拿到0就结束程序
JUMP d /重复d步骤
e:
COPYFROM [20] /c步骤比较的结果为负数,则将第一个词对应字母及后面字母输出,先复制对应字母
JUMPZ j /如果是0就结束程序
OUTBOX /放入outbox
BUMPUP 20 /将20格数字编号加1
JUMP e /重复e步骤
f: /比较结果为0,说明对应位置字母相同,则输出该字母,并且比较下一个字母
COPYFROM 19 /比较后手上是数字,要重新拿一下比较的这个字母
OUTBOX /放入outbox
BUMPUP 20 /将20格数字编号加1
JUMP c /重复C步骤,比较下一个字母
g:
h:
i:
j:
话说我现在也不习惯看这种代码,还是截图比较直观一些

最后双星一次达成,远远小于强迫症指标

不知道有没有大佬能再优化的?我总觉得这个方法特别笨


IP属地:云南1楼2024-01-04 23:32回复
    好吧,自己跑了一遍可以再优化一行。
    前两部可以不用,从第一个0终止时候复制到第20格就可以了
    然后总的29行代码


    IP属地:云南2楼2024-01-05 00:32
    回复
      第四行零终止后面又接一个拷贝到23,那为什么不直接把零终止和第五行拷贝到23换个位置,不是又省一行


      IP属地:浙江来自Android客户端3楼2024-02-21 21:15
      回复