是魔方吗?


25

敬拜的传教士经过的时间过长,是要指出“ Rubik's Cubes”(在T恤,海报等上)的图片实际上无法解决。

首先要检查的是多维数据集由正确的部分组成。要解决一个立方体需要六种颜色,每个颜色有九个正方形。多维数据集还需要每个边缘和角单元(这些是组成多维数据集的较小的多维数据集)是唯一的。它们不仅必须是唯一的,而且如果两个中心部分彼此相对,则任何边或角部分都不能包含这两种颜色。

一旦拥有由所有正确零件组成的多维数据集,您仍然需要验证它是否可以解决。这里有一些规则,所以我请专家来解释它们,下面的破坏者解释了我们如何做到这一点。如果您有兴趣自行解决问题,则无需访问该站点即可了解或参与此挑战。

链接说明

您的任务是采用一种模式作为输入,并确定它是否实际上是可解决的魔方。为了解决问题,必须有一种方法可以在多维数据集上执行有效的移动,以使多维数据集的每个面上只有一种颜色(不同的面上有不同的颜色)。大多数Rubik立方体具有标准颜色(白色与黄色相反,等等),您可能不会假定求解状态遵循该特定颜色。

有效的移动是立方体的单个面的顺时针或逆时针旋转。随着立方体表面的旋转,与该表面相邻的任何正方形也将旋转,并保持连接到它们先前接触的表面。

IO

您可以以任何合理的方式使用该多维数据集。如果您的语言具有一些内置的对您有利的“立方体面”类型,也可以作为输入,否则,您可以采用2D网格的网络,立方体的数组,每个面1 3 x 3列表。只是合理。如果您想知道某种特定格式是否可以接受,请在聊天中对我进行评论或ping我,然后我将添加挑战以说明其有效性。

您的输入格式最多只需要支持9种颜色。

对于输出,这是一个决策问题,因此您应该为“是,这是一个有效的魔方”输出一个常数,而为“否,这不是有效的魔方”则输出一个常数。


这是因此答案将以字节计分,而字节数越少越好。

测试用例

这是测试用例。它们的格式为一个立方体的网络,每个正方形为一个字母。不同的字母代表不同的颜色。可以根据要求添加更多的测试用例。

可解决的

   RRR
   RRR
   RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWWWBBBOOO
   YYY
   YYY
   YYY


   GRR
   GRR
   ORW
WWRBWYBOOGGY
GGRBWGYBBOOO
OOGRWGYWWRBB
   WYO
   YYB
   YYB

无法解决

   RRR
   RRR
   RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWYWBBBOOO
   YWY
   YYY
   YYY


   RRR
   RRR
   RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWWWBBBOOO
   YWY
   YYY
   YYY


   RRR
   RRR
   GGG
GGYWYWRBBOBO
GGYWWWROBOOO
GGYWWWRBBOOO
   BBB
   YWY
   YYY


   RRW
   RRW
   GGG
GGYWWYEOBROO
GGYWWYEBBROO
GGOWWYWBBROO
   BBB
   YYW
   YYO

14
我有义务指出,化身中的魔方无法解决。它面对我们的一侧只有4个正方形,而普通的魔方应该有9个正方形。更不用说正方形顶部的怪异符号了。
DJMcMayhem

2
@DJMcMayhem我的孩子有只有四个“子立方体”的魔方。
亚当

2
@ H.PWiz不,你不能。这在我的定义中是隐含的,但我将在问题中予以明确。
小麦巫师

2
您的规范未包含多维数据集的三个奇偶校验定律的完整描述。1.不可能只有1个边缘翻转180度(提到)2.不可能只有1个角扭曲120度(没有提到)3.不可能有立体的奇偶排列(未提及)。 )。在解决之前,我将进行密切投票。有关说明,请参见ryanheise.com/cube/cube_laws.html
级圣河在

4
@LevelRiverSt请注意,魔方是独立的,任何人都可以独立地推导数学公式和奇偶律。
user202729 '17

Answers:


14

大概1664 1631 1089 字节

⇒FD2F'R'D2RUR'D2RFD2F'U'
⇒Ff1F'
⇒LFf1F'L'
⇒F'f1F
⇒F2f1F2
⇒L'F2f1F2L
⇒D'F'f1FD
⇒LR'FLR'DLR'B2L'RDL'RFL'RU2
⇒LFf8F'L'
⇒R'F'f8FR
⇒Ff8F'
⇒F'f8F
⇒ULU'f8UL'U'
⇒U'R'Uf8U'RU
⇒F2f8F2
⇒Df15D'
⇒D'f15D
⇒D2f15D2
⇒UF2UF2D'L2B2U'B2DL2F2D2B2D2F2
⇒U'DL2UD'B2
⇒UF2UF2D'L2B2D'R2UR2F2D2B2U2B2
⇒BL'BU2D2F'RF'U2D2
⇒LD'F2U'B2U'RU2R'F2R2F2D'R2DF2D
⇒B2URB2D2B2RB2U'D'L2D'B2
⇒B2LF'U'B2UFL'R2B2U'D2L2D'B2U
⇒B2RB2D2B2RB2U'L2UD'F2U'F2B2
⇒D2R'FUB2U'F'RU2B2D'F2R2UF2UF2
⇒B2R2U'L'D2B2U2R'U2R2F2L2R2UR2
⇒D2L'B2U2F2RUL2U'F2R2U'R2U2F2DL2D'
⇒UB2U'L2DL2B2DB2D'B2
⇒BR'BL2B'RBL2B2
⇒UF2B2U'F2B2U'F2L2R2B2R2
⇒R2U'F2DR2UF2D'R2DF2R2D'F2
⇒U'F2DF2UL2F2DL2DF2L2D2F2
⇒U2D'L2U'F2L2U'B2L2R2U'L2B2
⇒F2D'R2U2L2B2UF2L2U2F2L2UF2R2
⇒[f1]3
⇒[f2f37]3
⇒[f3f38]3
⇒[f4f39]3
⇒[f5f40]3
⇒[f6f41]3
⇒[f7f42]3
⇒[f8f43]2
⇒[f9f44]2
⇒[f10f45]2
⇒[f11f46]2
⇒[f12f47]2
⇒[f13f48]2
⇒[f14f49]2
⇒[f15f50]2
⇒[f16f51]2
⇒[f17f52]2
⇒[f18f53]2
⇒[f19f54]2
⇒[f20f55]3
⇒[f21f56]4
⇒[f22f57]5
⇒[f23f58]6
⇒[f24f59]7
⇒[f25f60]8
⇒[f26f61]9
⇒[f27f62]9[f27f62]2
⇒[f28f63]9[f28f63]3
⇒[f29f64]9[f29f64]4
⇒[f30f65]2
⇒[f31f66]3
⇒[f32f67]4
⇒[f33f68]5
⇒[f34f69]6
⇒[f35f70]7
rs[f36f71]8

如果可解决,则Solved!输出
如果无法解决,则输出:(空,无输出)

输入应格式化为立方立方体转储(请参阅本Debug节)。OP明确允许这样做

说明

该程序采用使用魔鬼算法迭代与已解决多维数据集相同组中多维数据集的每个可能状态的方法。如果多维数据集是可解的,它将在算法完成之前的某个时候解决(假设我使用算法工作正常)。

(Cubically代码页中的0x84)开头的每一行都是一个函数定义;这些功能相互补充,构成了实际的魔鬼算法。要执行的第一行是最后一行:

rs[f36f71]8

r从stdin读取一个多维数据集并将其设置为存储多维数据集。s将解释器置于“ solvemode”,这意味着Solved!如果多维数据集在任何时候都已解决(在未解决之后),它将退出并打印。其余命令(仅重复f36f718次)对应于链接页面底部的最终算法:

(D) = (CP) = (CPT8) = [(CPC8)(CPT7)]8 (3,847,762,288,469,010,006,992 moves)

(D) is the Devil's Algorithm. If you apply it to the cube, it will be solved at some point before you have done the algorithm once. As you can see, it is terribly long, nearly a thousand times more moves than there are possible positions.

我该如何运行?

您可以在线尝试,但该链接无效。TIO几乎肯定会在此算法完成之前超时(解释器的最大运行时间为60秒)。如果多维数据集不可解,则此算法将需要多达1100万年的时间才能完成Cubically(每秒约1520万步的移动,这是我的Cloud9 IDE所能获得的)。

此外,您需要大量的内存来执行3兆兆移动。通常,每秒可以执行约4百万次移动,但是该过程很可能会由于内存过量使用而被终止。它在具有512MB内存的VM上运行15秒后便消失了。为什么要在已分配的平面阵列上执行移动要消耗内存?发现一个内存泄漏(或二十个)并修复

是一种更具可读性的版本,其行为方式相同。

但是我真的很想看到它有效!

此恶魔算法执行的第一个实际举动是F2,因此要解决的最快多维数据集将被扰乱F2

   000
   000
   555
113222133444
113222133444
113222133444
   000
   555
   555

这确实在TIO上执行了0.007秒。

如何改善呢?

当然,还有更多的恶魔算法。我发现一个使用的动作少于此动作的三十分之一。但是,这将花费数千个字节(约100MB以上)和将复杂的汉密尔顿电路转换为Cubically代码需要数十个小时。

也可以删除某些功能,并将其直接放在底部的循环中。但是,为了牺牲可读性,我将牺牲一些字节。

另外,我正在考虑修改Cubically的循环行为,以便可以更轻松地重复执行7或8次算法(而不仅仅是在源代码中使用重复7或8次的函数调用对它们进行硬编码)。或者,我将用记事本解决一些魔术问题,并使用更多循环来打高尔夫球。

请注意,我将继续优化解释器中的所有可能功能,因此将来可能会在普通PC上运行!


大概是2个字节

r▦

我更喜欢上面的答案,所以我将其添加为替代解决方案。这是在一秒钟内完成的,而不是几百万年。

r    read cube from standard in
 ▦   and solve it

如果多维数据集可解,则输出:(无)
如果多维数据集不可解,则输出: Error: The cube has reached an unsolvable state.


如果我们交换双方,这行得通吗?例如,多维数据集转储中2与4相对,如果2与5相对且4与0相对,它是否起作用?
小麦巫师

1
@WheatWizard是的,solvemode检查每个面是否具有唯一的整数,以及该整数是否是面上唯一的整数。
MD XF

好的,应该的。我对Cubic的熟悉程度不足以从您的描述中了解情况是否如此。
小麦巫师

@WheatWizard只要确保我能正确理解您的意思,就是您所指的(是),对吗?
MD XF

是。而且应该可以解决。
小麦巫师

4

APL(Dyalog经典)190个 174字节

{∧/~∊(×1 2 3|+.-⌿↑⊃∘⍋¨¨¨a)({2|≢∪{⍵⌊⍵[⍵]}⍣≡⍵,0}¨⍳⌿↑⌽b)((∪≢∩)¨/b←(⊃∘⍋⌽⊢)¨¨¨a),6≢≢∪⊃⊃a←{c4⍴⊂⍬⋄c[+/1≠i],←(≠/×i←↑⍳33){⊂⌽⍣⍺⊢⍵~' '}¨,⌿(3|∘.+⍨⍳3)⍉⍤¯11 0 1\⍵1c}¨⍵(3 3∘⍴¨1 1∘⌷¨⍵)}

在线尝试!

参数是3x3字符矩阵的3x2矩阵(行0:前后,行1:左,右,行2:上下)。对于可解决的魔方,返回1,否则返回0。

在TIO链接中,t不包含在字符计数中的function 读取9行输入,将其从默认输入格式(网络)转换为所需的3x2 x 3x3矩阵,调用解决方案,如果结果显示OK符合预期。

该算法将给定的多维数据集分为26个小块-长度为3(角),2(边)和1(中心)的字符串。它还会生成具有相同6个中心立方的已解决多维数据集的26个立方。必须满足以下所有条件:

  • 6个中心之间没有重复

  • 给定/已解决cubic的集合匹配,直到旋转-例如,考虑'WBR''BRW'相同cubie,但不匹配'BWR'

  • 拐角置换和边缘置换的奇偶性是偶数

  • 转角旋转指数的模3和(例如以“最小的”信B作为一个参考点,我们有:'BRW'→0'WBR'→1'RWB'→2)给定的,解决多维数据集之间的匹配; 拐角模2相同

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.