【发布时间】:2011-11-29 22:30:13
【问题描述】:
我想知道以下问题。我显然不希望有任何实际的解决方案,但我会感谢任何开发人员对此的想法:
理论上是否有可能让一个程序打开其他程序(为了论证,假设它打开 .exe 文件),并确定执行时是否特定可执行文件(具有固定输入和机器状态) ,下国际象棋(在它可能执行的任何其他任务中)。
对于“下棋”,我的意思是对棋盘和棋子进行一些表示,然后应用源自内置国际象棋 AI 引擎的黑白棋步。
这种理论上的“国际象棋检测程序”可能包含虚拟机或 PC 模拟器或其他任何东西,以便在必要时实际模拟扫描的可执行文件。我们可以假设它在具有同上 ram 的任意速度的计算机上运行。
(编辑)关于停机问题,我可以这样解决:
将程序加载到具有 N 位(硬盘和内存空间以及 CPU 寄存器)的虚拟机中。这个虚拟机最多可以假设 2^N 种不同的状态。
逐步执行VM中的程序。在每一步之后,检查它是否停止。 如果是:问题已解决(结果:是,它停止了)。 如果否:获取虚拟机的当前状态,并查看该状态是否存在于我们之前已经遇到的状态列表中。如果是:问题已解决(结果:否,它将永远运行)。如果否:将此状态添加到列表中并继续。
由于最多可以出现 2^N 种不同的状态,因此该算法将在有限时间内确定程序是否停止。
(Edit2) 扫描的可执行文件或运行它的(虚拟)机器的(无限)有限性似乎有些模棱两可。假设要扫描的可执行文件最多为 1 GB(这应该足够了,因为大多数国际象棋程序要小得多),并且它们应该在具有 10 GB 内存的 PC(或 VM)上运行。
我们理论上的国际象棋检测程序可以使用任意数量的 ram。
【问题讨论】:
-
编写一个程序,检测可以检测象棋程序的程序。然后在您的任意速度的计算机上创建随机 .exe 文件,并等待它检测到您正在寻找的 exe。 (不,这是不可能的)
-
为什么不呢? (尽管国际象棋检测器检测器很可能比国际象棋检测器更难)
-
IF 你想要做的是抓住作弊者,那么你为什么要关心弄清楚“exe”可执行文件是否可以下棋。相反,扫描内存中的当前运行程序,它可以为您提供每个程序的快照,并且更容易处理并且不会减少到停止问题。
-
这不是我的想法,但听起来很有趣。您将如何确定当前正在运行的程序是否正在下棋? (确实不管它是否会停止)
-
你可以做一些事情,比如在内存中寻找一个位板表示。 en.wikipedia.org/wiki/Bitboard 这样做的好处是,位板通常占用相当大的连续内存块,每块 64 位(板上每方格 1 位),其中一些移动编码在 64 位字中。
标签: algorithm executable theory detect chess