欢迎光临散文网 会员登陆 & 注册

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

2023-08-04 00:02 作者:-郭两岁  | 我要投稿


这一关也是属于那种

可以很简单也可以很难的关

先上标准答案,最简单最无脑

从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)


#4 编程(Part.4)密码锁的评论 (共 条)

分享到微博请遵守国家法律