被智商检测器侮辱之后,我直接怒开PyCharm(上)

2024-02-18 10:50

本文主要是介绍被智商检测器侮辱之后,我直接怒开PyCharm(上),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

游戏玩法

  1. 开局任选一个空格翻开,作为起始点;

  2. 如果紧挨着该棋子且在同一条直线上有连续两个空格,则可以移除该棋子,把另外两个空格翻开(操作就是点一下远端的空格,再点一下该棋子,就会自动实现上述操作);

     

  3. 重复 2 的操作,直到只剩一个空格为止。

试玩体验

既然都说了是智商检测器,那对于我这种低智商的人来说必然是极具挑战性了。果然,打开游戏20分钟后,尽管已经重新开始了无数次,但依然毫无头绪。编程学习资料点击免费领取

在没有思路的情况下,即便我通过大量的尝试碰巧赢了游戏,我也不会有任何的成就感,或者对自己的智商有更多一分的信心,反而会在这种侥幸中感到空虚和迷茫。因此我很快就放弃了。

但如果就这么把游戏关了,那我岂不是彻底输了!为了在智商检测器面前挽回最后一点自尊,也不枉我20分钟的尝试,我决定写个程序暴力算出攻略。反正也好久没写代码了,就当练练手。

于是,我怒开PyCharm,新建了一个Python文件,准备暴力求解。

实现

其实这个任务最开始给我的感觉是银行家算法,每次移动前提前判断这样做之后是否存在能完成游戏的安全序列。但我仔细想想其实跟银行家算法的侧重点并不同,因为我们只要能找到一个安全序列就能完成游戏,而整个问题的核心也恰恰在于找到这个安全序列。

而从实现的角度而言,跳房子游戏的算法应该比银行家算法稍微复杂一些,如果把棋子占用格子和释放格子类比成进程占有资源和释放资源,那么棋盘中的棋子实际上是一种“常驻”的进程,这又会对后续的分配造成影响。所以直接套用银行家算法是不太合适的。

不过好在游戏规则简单,问题也没有到很复杂的程度。那么我们开始吧。

棋盘建模

首先,我们如何表示棋盘呢?

我们希望有一种模型能够体现这些空格或者棋子的相对位置关系,该模型应该包含空格的编号和属性。对于编号而言,我选择直接用整数编码,用0~14的整数来标识每一个空格,这样也对应列表的下标,较为方便。

 

但属性就值得思考了。根据游戏规则,在这些棋子的所有相对位置关系中,用到的就只有是否相邻、是否共线这两个。

我希望能给这些点设计一个属性,当我任取三个点,都能方便地判断他们是否满足相邻且共线的关系。比如,给定(0, 1, 3),返回结果True,给定(0, 1, 2),返回结果False

坐标系

我首先想到的是坐标,这也是最符合直觉的。把这个棋盘映射到平面直角坐标系中,然后建立解析几何关系,用来判断点与点之间的联系。共线关系可以直接用三点中任意两点连线的斜率来判断,而相邻关系可以用两点之间的欧氏距离。

然而,如果不对原棋盘进行变形,那么这些点的坐标中就不可避免地会出现无理数,这是我不想看到的。将等边三角形便变形成一个等腰直角三角形可以解决这个问题,但这样的话,点与点之间的距离就会各不相同,进而引起其它麻烦。

这才是整个任务的第一步,我不想在这上面花太多精力。因此,我就没有再考虑坐标系方法了。

卡诺图

卡诺图是两年在数字逻辑课程中学习的知识。既然我希望任意给出3个点,输出是或不是的判断,那不就可以通过逻辑表达式来实现吗?结合卡诺图可以对表达式进行化简并具象出来。

然而,我稍加回忆,又很快否决了这个方案。我们学习时的卡诺图是二进制的,这样即便有8个甚至更多维度,我们也能通过卡诺图进行表示、化简。然而,在这个任务中,尽管只有3个维度(即输入的3个点),但每个点都是15进制,这就意味着如果我们想要枚举所有情况,就必须画一个15x15x15的卡诺图,然后再化简。这显然是不现实的。

我数了一下,图中一共有18个三点共线相连关系,即便得到了逻辑关系,也将是一个极其冗长的表达式。

神经网络

放弃卡诺图之后,我脑海中突然又闪过了一个邪恶的念头。既然通过人力来提取逻辑表达式工作量太大,那我设计一个神经网络,让机器自己学习输入输出之间的逻辑关系,不就行了吗?

对于这样一个简单的分类任务,即便是最基本的多层感知机也绰绰有余。然而问题又来了,这样就得我自己构建一个数据集,给每一个可能的输入标注上分类结果。虽然只有16个正样本,但依然需要耽误一会儿时间,而且后面还要训练。

因此,神经网络方法也不合适。

位置嵌入(positional encoding)

我叫着玩儿的,借鉴了Embedding的概念。其实Embedding这个词用在深度学习中的应用也不是很准确,只不过大家都这样叫就约定俗成了。

既然上面一种方法已经需要我手动标注所有数据了,我何不顺势而为找一种相对简洁的方法来实现呢?最终,我选择了一种18位长的01序列来给每一个节点编码。如果我们只观察这15个节点的编码的第一位,则只有0、1、3三个节点的该位是1,其它节点该位都是0。以此类推,把18组关系全部放进编码中。这样,我们就可以直接通过位操作,把任意3个点的编码相与,如果结果不是全0,就说明符合我们想要的关系

15个点的编码分别为:

NodesEmbedding = [0b100000000000000100,   # 00b110000000000010000,   # 10b000100000000000110,   # 20b111000100000100000,   # 30b000110100000011000,   # 40b000001100000000111,   # 50b011000010000000000,   # 60b000110011000100000,   # 70b000001011000011000,   # 80b000000001000000011,   # 90b001000000100000000,   # 100b000010000110000000,   # 110b000001000111100000,   # 120b000000000011001000,   # 130b000000000001000001    # 14
]
复制代码

只需定义一个极其简单的函数即可实现位置关系的判断:

def isSameRow(n1, n2, n3):return bool(NodesEmbedding[n1] & NodesEmbedding[n2] & NodesEmbedding[n3])
复制代码

小结

至此,我们完成了对棋盘的建模,完成了暴力求解任务的第一步。接下来实现核心算法。

然而,写到这里,我发现我的游戏已经下好了,我必须去玩游戏了,所以很遗憾不能一次性写完。如果大家感兴趣,欢迎持续关注,我会很快更新后续的内容。

 

 

 

 

 

这篇关于被智商检测器侮辱之后,我直接怒开PyCharm(上)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/720917

相关文章

[项目][CMP][直接向堆申请页为单位的大块内存]详细讲解

目录 1.系统调用 1.系统调用 Windows和Linux下如何直接向堆申请页为单位的大块内存: VirtualAllocbrk和mmap // 直接去堆上按页申请空间static inline void *SystemAlloc(size_t kpage){#ifdef _WIN32void *ptr = VirtualAlloc(0, kpage << 13,

win10不用anaconda安装tensorflow-cpu并导入pycharm

记录一下防止忘了 一、前提:已经安装了python3.6.4,想用tensorflow的包 二、在pycharm中File-Settings-Project Interpreter点“+”号导入很慢,所以直接在cmd中使用 pip install -i https://mirrors.aliyun.com/pypi/simple tensorflow-cpu下载好,默认下载的tensorflow

eclipse中,更新JDK之后,启动Tomcat报错:

更新到这个版本之后,启动Tomcat报错: 四月 25, 2016 10:13:20 上午 org.apache.catalina.core.AprLifecycleListener lifecycleEvent INFO: The APR based Apache Tomcat Native library which allows optimal performance in prod

PageOfficeCtrl支持直接打开服务器磁盘文件

一般来说,PageOfficeCtrl控件的WebOpen方法的第一个参数是待打开文档的URL,此URL可以是相对于当前页面的相对URL,也可以是相对于整个网站根的相对URL,还可以是http开头的完整URL,但是这个URL必须是当前网站的URL,不能跨域。 现在为了更加方便开发者编程,WebOpen支持打开服务器磁盘文件。也就是说,第一个参数可以写成服务器文件的绝对磁盘路径。例如: P

最直接显示 ubuntu 版本号的命令

有时候去看ubuntu版本号,去网上查,很多文章都列出一堆命令,复制命令运行一下,都是打印一些不相关的信息,我只是想看ubuntu版本号而已,能否直接列出版本号就可以了。 有,下面这条命令就是直接的打印出ubuntu版本号, 没有多余信息 lsb_release -a

【UVA】10651-Pebble Solitaire(直接递归或者记忆化)

不知道这个题UVA的数据是怎么的,用2个方法交了,第一次直接递归,第二次记忆化剪枝,时间竟然一样!? 直接郁闷了,简单的二进制表示状态和二进制运算。 14145176 10651 Pebble Solitaire Accepted C++ 0.009 2014-09-04 09:18:21 #include<cstdio>#include<algorithm>#inclu

Anthropic 创始人 Dario Amodei 谈:关于护城河与风险,AI 大很难直接替代人

护城河的迷思   近期,Anthropic创始人Dario Amodei与投资人Erik Torenberg进行了一场引人关注的对话。他们探讨了AI的护城河与潜在风险。话说,护城河就像酒水的保质期,过了时间就得小心别翻车。Amodei提到,AI虽有强大的潜力,但短期内难以完全替代人类的智慧。这可让很多人松了一口气,毕竟机器发热总比人心复杂,听着都觉得不舒服。 聪明与控制的博弈   Dar

GitHub:代码是程序员沟通最直接的手段

如果不是 Andreessen horowitz 的投资,估计 GitHub 很难被福布斯、CNN、纽约时报等传统媒体注意到。普通大众之前不了解这个工具,是因为它距离记者的世界太远了——GitHub 是一个程序员所使用的托管项目的服务。 但在一些程序员眼里,它不仅是托管项目的地方,还是“开源”项目的大本营,而且是提高程序员“技术水平”和“技术品味”的地方,更是一个程序员社交的地方。

Base64编码 及 在HTML中用Base编码直接显示图片或嵌入其他文件类型

1.为什么要用到BASE64编码的图片信息      Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一。Base64 主要不是加密,它主要的用途是把一些二进制数转成普通字符用于网络传输。由于一些二进制字符在传输协议中属于控制字符,不能直接传送需要转换一下。最常见的用途是作为电子邮件或WebService附件的传输编码.  2.base64编码定义    目前的internet

element-ui打包之后图标不显示,woff、ttf加载404

1、bug 起因 昨天在 vue 项目中编写 element-ui 的树形结构的表格,发现项目中无法生效,定位问题之后发现项目使用的 element-ui 的版本是 2.4.11 。看了官方最新版本是 2.15.14,然后得知 2.4.11 版本是不支持表格树形结构的。于是决定升级 element-ui 的版本,方便后续的开发。 升级之后本地简单的过了一遍系统功能,并没有发现有什么不妥,于