#4 编程(Part.4)密码锁

这一关也是属于那种
可以很简单也可以很难的关
先上标准答案,最简单最无脑
从1开始试直到正确答案,暴力穷举法
总时钟刻1029总用时61740
很炸裂的延迟


但是就在关卡说明那里
也已经三番四次地在说
如果你猜的数字比他大就会哔哔叫(输入1,否则0)
所以很显然这关他想要的解法是要通过比较
我第一个想到的想法是二分法
先输出128,比较,然后±64,接着比较±32,±16…直到出结果
最多比较7-8次就可以出结果,延迟应该挺低的
但是我忽略了一个问题
我的代码写了将近90行
但是这是OVERTURE架构,立即数最大是63
也就是指令寻址最大不能超过63
那我63之后的代码就无法被条件跳转到
就很麻烦
(OVERTURE架构真的难用,太喜欢LEG架构了,速速学习!)
为此我决定写一个阉割版的二分法
直接上63,126,189,252
都比较一遍,然后找到小区间再-1-1-1
比如我找到数字再63-126之间
那我就126,125,124…不断地往下输出
我的二分只分两次,分到63就不分了
这样子把代码压缩到42行就能成功运行
最终时钟刻压到了323,总用时19380
缩短到了穷举法的1/3,很不错
虽然我觉得这个数字还不是很理想
但是我暂时没有什么好的想法了
我想过把一开始的二分步进改成31/32
这样子分多一次应该就可以再少一点
但是在想怎么处理溢出,给我脑袋CPU干烧了
所以就作罢
只能说OVERTURE架构,能力有限(大嘘

下面放上代码



OVERTURE架构指令集:
最高两位为操作码,00立即数模式,01算术模式,10复制模式,11条件跳转模式
立即数模式下,1-6位是立即数,写入0号寄存器
算术模式下,1-3位为算术命令,000为OR,001为NAND, 010NOR, 011为AND, 100为ADD, 101为SUB, 110和111为UNUSED
复制模式下,1-3为目的,4-6为源,000-101对应寄存器,110对应输入/输出,111UNUSED
条件跳转模式下,1-3位为条件,000为NEVER, 001为=0, 010为<0, 011为<=0, 100为ALWAYS, 101为!=0, 110为>=0, 111为>0
自定义汇编别名:
input/output: 00000110(6)
AND: 01000011(67)
add: 01000100(68)
sub: 01000101(69)
copy: 10000000(128)
equal_0: 11000001(193)
less_0: 11000010(194)
always: 11000100(196)
greater_0: 11000111(199)


