Steam编程区解谜游戏A=B全解(一)

这是一款以“A=B”这门编程语言(esolang?)为依托的解密游戏,这里我假定你已经玩过一点这个游戏了,如果没有,后面有游戏规则以及一些背景故事。

第一章(A=B)

1-1

1-1 A到B

简单的入门教程,甚至不用你自己动手写。

1-2

1-2 大写

入门教程+1。

1-3

1-3去重

这道开始就多少有点意思了,aa=a这句话的作用实际上是把连续的若干个a全部变成单个的a。这三行原理非常简单,不过还是非常实用的,可以用来简化问题,过滤掉无关的信息。

具体在什么情况下简化题目呢?大概就是当我们比较关心不同字母之间的交互而不是单个字母的数量之类的时候,这个后面我们还会用到。

1-4

1-4 去重 2(1)

这道题初见多少就有点棘手了,图(1)是我初步的不讲武德的想法,在题目中给定输入长度<=7的情况下也是很容易想到切切实可行的,不过或许可以思考一下为什么要把长的a序列放在前面而不是从“aa=”开始,依次递增。

然后显而易见这种解法只适合限定长度切较短的序列,而且挑战目标也是最多两行,所以说肯定会存在更简单且更具有普遍性的解法。

1-4 去重 2(2)

如图(2)所示,稍加思考我们就可以注意到,我们想要处理的对象是长度>=2的a序列。假如使用1-3的去重方法的话最终所有的a序列都会变成单个的a,那么我们就损失了关于其长度的信息,也就无法分辨开a是否是连续的。所以说有没有什么办法能够在去重的同时将对a序列的下限控制在2(这样就可以通过“aa= ”一步将其删去了)呢?

那自然是有的,我们只要把替换语句的启动条件改变一下即可——“aaa=aa”,通过这个语句,我们就避免了对长度小于3的a序列的改变,也就使得在这一步执行完之后,得到的序列里面只剩下1和2两种长度的a序列。显然,前者是母胎单身的a,后者则是历经大浪淘沙留存下来的cp,那自然是要用“aa= ”除之而后快。

然后这个结论其实还可以简单拓展到删除长度大于x的连续的a,有兴趣不妨仔细想想。

1-5

1-5 排序

荷兰国旗问题!这道题就可以看出来我们这门“A=B”语言的优越性(大病性)了,用c语言啥的少说几十行的才能解决的问题,我们的“A=B”语言三行就搞定了(确实简单)!

过程没啥好解释的,就其实这段程序实际上也是很有用的,具体一点说就是当字母的排列顺序不重要或者我们不关注不同字母之间的交互时,这会是一个很好的简化手段

1-6

1-6 比较

这个题目比较有意思,比较嘛我们肯定首先想到数字。然而只有一个运算符的“A=B”语言显然是没有办法计数的,那要怎么去比较哪个字母出现得更多呢?我们说,计数比较其实是一种理性的,更加文明的比较方式。

子墨子解带为城,以牒为械。公输盘九设攻城之机变,子墨子九距之。

有没有这味儿?我就是先纸上谈兵各自清点一下人数,就可以看出来谁人多了不是吗?不过前面也说过了,这门优雅(扯淡)的语言显然没法很简单地计数,那么咱们(a和b)好好谈谈不拢,我们要怎么办呢?那自然是直接开战

大家可以看看前两行,既然咱们开战了,那就自然有伤亡,为了达成比较大小的目的,我们自然就最好不要让a和b的人数差发生变化,那么身为战争幕后主使的我们就可以规定让a和b成对升天。(顺便还帮他们解决了单身问题不是吗)

显然,在这两行结束之后,人数少的那一方就一个不剩了,只剩下清一色的a或者清一色的b(自然可能是一切归于平静,一个人都没有了,不过这里不考虑)。败者食尘,但胜利者的代价是损失了等量的字符,所以猛虎王(慢羊羊)说的好呀:

战争没有胜利者,只有失败者!

不过还没有结束,拿“aaaabbbaaaaaa”这个序列举例,前两行结束后剩下的字符是“aaaaaaa”。就好比说是十个囚徒合力打败了三个看守(其中三个囚徒极其有奉献精神),但是走到逃生艇前面才发现友谊的小船只容得下一个人(我们只要求输出一个字符),所以可怕的内斗开始了,在经历了1-3中的去重之后,一个或许是真正勇敢且残酷的人奔向了新的世界。

规则

注释1是:“是的,以上是全部指令”。

……

这个执行流程还是需要注意一下子的,有别于通常编程的顺序执行方式,这门语言相当于是在外面隐藏了一个while循环,就学过编程的有时候可能会被这种独特的执行方式给绕进去(怎么知道的就不要问了),不过似乎是大多情况只需要调整一下代码块的顺序就可以解决。

剧情

好了,扯了半天第一章六道题也是浅浅解析了一下,附上一些剧情。(对的,这游戏还有剧情,而且我觉得作者非常具有幽默感)

“自创的编程语言”,“不可避免”

“广泛的应用前景”

自知者明

我觉得有道理

“根据定义”,“没有限制”

确实是真的输出不了

不过这最后一张图多多少少也留下了一点悬念,因为第二章里面加入的新的指令,也就可以实现“输出helloworld”的功能了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值