差不多暴力破解过去的一道题,很有《最强大脑》的风格,分几个步骤:

根据题目确定A是 xy 平面后,需要把其他五个平面中点的坐标映射到以A面为参考系的坐标中。方法是将每个平面的边和A的四条边匹配,这样就能确定包括A在内的五个平面,然后第六个平面也出来了。匹配的过程是对B-F平面做等效变换,可以避免对四条边的匹配顺序无从下手。一共使用了八种变换,分别是:无旋转、水平翻转、垂直翻转、顺时针旋转90、180、270度、沿主对角线翻转、副对角线翻转。实现时用了一些函数式编程的特性,如lambda、reduce等。

确定了每个点的坐标后,就是找出特殊的7个数字,题目给出了两条规则,奇偶和是否质数,其实第五题有另外一条隐藏规则:有7个数字是9位数,其他都是10位数,也很容易找到这个规则。这一步就能确定7个特殊点的坐标了。

最后要找出符合要求的两条直线,7个点两两配对能够得到21条直线,这里我用的表示方法是空间直线的点斜式,记录一个方向向量和一个过该直线的点(实际上两个点都记录了),回忆下高数的知识,应该不难。先找两条直线是否垂直,用点乘等于0判断。最后一步很坑,要找的是两条直线共同经过的方块,而不是相交的,没找到定量的方法计算,只用了近似的算法,也因此挺多回答是错误的,但暴力多跑几遍总能有一次五道题全过的(实际上大概跑了10次吧23333)。

近似的算法是枚举内部的 53=125个点,计算它们到这两条直线的距离之和,把值最小的那一个点作为答案。这里涉及到计算点到空间直线的距离,例如点C到直线AB的距离,等于两倍三角形ABC的面积除以AB的长度,实际上代码用了其他计算方法。

直接贴代码,代码中用到了思考过程中的自定义变量,可能不是很直观,有希望详细了解的可以来直接找我(虽然应该是没有的233333)。

  1. from pwn import *
  2. from hashlib import sha256
  3. from string import *
  4. from math import sqrt
  5. from itertools import pro