魔方上的身份序列


32

移动序列是在魔方上的一系列移动(转弯)(在下面的符号中向下查找)。除了空移动序列之外,还有许多其他移动序列,这些移动序列对多维数据集完全没有影响。我们称这些移动序列为同一性序列。

这些身份序列中的某些很明显可以确定,例如U2 R R' U2U D2 U' D2。在第一个步骤中,进行了两次随机移动U2 R,然后立即撤消R' U2。第二个类似。前两个随机动作U D2,然后撤消,但顺序相反U' D2。这仅起作用,因为U移动D2仅影响上层的片段,而移动仅影响下层的片段。您可以看到这两个移动序列的可视化。

U2 RR'U2 U D2 U'D2

其他身份序列可能一点都不明显。例如序列R' U' R' F' U F U' R' F R F' U' R U2 R。它很长,但是对多维数据集完全没有任何作用。

在此处输入图片说明

移动符号

移动描述了立方体六个面之一的一层的旋转。一个移动由一个代表面部的字母和一个可选的后缀(代表转角)组成。

字母及其对应的面是U(上-面向上的侧面),D(下-面向下的侧面),R(右-面向右侧的侧面),L(左-面向左侧的侧面) ,F(正面-面向您的一面)和B(背面- 背对您的一面)。

如果没有后缀,则将脸部顺时针旋转90度,后缀'表示将脸部逆时针旋转90度,而后缀2是指脸部顺时针旋转180度。

如果您在表示法上有任何问题,只需使用http://alg.cubing.net,您就可以在其中可视化此类移动序列。

挑战

您的任务是编写一个程序,该程序确定移动序列是否为身份。

您可以编写完整的程序或函数。它应接收一个包含移动序列(移动由空格分隔)的字符串作为输入(通过STDIN,命令行参数,提示或函数参数),并输出(通过返回值或STDOUT)布尔值或相应的整数( True-1-身份序列/ False-0-非身份序列)。

如果后缀'在编程语言中造成问题,则可以使用其他符号,但不能使用数字。R F2 U3不允许。

这是codegolf,因此最短的代码(以字节为单位)获胜。

测试用例

"" -> True
"U2 R R' U2" -> True
"U D2 U' D2" -> True
"U2 R U2 R'" -> False
"R' U' R' F' U F U' R' F R F' U' R U2 R" -> True
"L'" -> False
"B B2 B' B2" -> True
"D D2 D'" -> False
"R F' D2 U B' F2 B' U2 D2 F2 B2 U F R'" -> True
"D2 U' R2 U F2 D2 U' R2 U' B' L2 R' B' D2 U B2 L' D' R2" -> False
"R U R' U' R' F R2 U' R' U' R U R' F' R2 U R2 U' R2 U' D R2 U' R2 U R2 D'" -> True
"R U R' U' R' F R2 U' R' U' R U R' F' R2 U' R2 U R2 U' D R2 U' R2 U R2 D'" -> False
"B2 F2 U' F2 U R2 F2 U2 B D' R' D' R2 D' F2 U' F U R2 U R B D B D2 L2 D' F2 U D' R' D B R2 D2 F2 R' F2 D2" -> True
"R U2 R' U R' U2 R U2 R U R' U' R' U R U2" -> False
"U F B' R' U F' R U' F' B L U' F L'" -> False
"R2 U' R' U' R U R U R U' R" -> False
"R' F R' B2 R F' R' B2 R2" -> False

这有什么错R F2 U3
约翰·德沃夏克

2
我只想确保每个人都有相同的前提条件。如果我允许的话U3,那么您可以简单地将后缀转换为数字。
2015年

3
我更习惯于使用T-Top,B-Bottom和P-Posterior(背面)的表示法。人们可能只是喜欢看序列R2 D2
mbomb007

2
@ mbomb007我可以理解T为顶部,但我从来没有见过P为后部,如果没有您的评论,我将无法理解其含义……
John Dvorak

2
@ mbomb007我也看到过这种表示法,但是它不像原始的Singmaster表示法那样普遍或古老,而且我不知道为什么人们想弄乱原始的表示法。尽管David Singmaster(据我所知)没有提及,但我观察到,所有面孔都是完全一致的,并且如果被视为方向而不是位置,则不会发生冲突。That is F(orward), B(ackward), L(eft), R(ight), U(p), D(own)
级圣河

Answers:


14

哈斯克尔,263个 261 247 243字符

c[x]=[x]
c(x:"2")=[x,x]
c(x:_)=[x,x,x]
s!a@[x,y,z]=case s of
 'R'|x>0->[x,-z,y]
 'B'|y>0->[z,y,-x]
 'U'|z>0->[-y,x,z]
 'L'|x<0->[x,z,-y]
 'F'|y<0->[-z,y,x]
 'D'|z<0->[y,-x,z]
 _->a
r=[-2..2]
i=mapM id[r,r,r]
f w=i==foldr(map.(!))i(c=<<words w)

更直接的算法;每个立方体由编码其位置和方向的1、2、4或8个块组成;每个边缘立方体4个块,每个角落立方体8个,静止的7个立方体。

c c将输入的每个单词均按CW转弯序列进行,并!根据转弯发送每个块。i dentity位置。f是主要˚F结。

我对chomp函数不太满意,但是我似乎也找不到缩短它的方法(但是@Nimi做到了)


怎么样c(x:"2")=[x,x]c(x:_)=[x,x,x]。节省2个字节。
nimi 2015年

如果您使用i=sequence[s,s,s],并将所有元组更改为列表(即(x,y,z)变为[x,y,z])-它将节省约9个字符。内联可节省4个以上的时间。删除的_情况下,从!节省另一个11
MtnViewMark

@MtnViewMark完成并改进i,谢谢。不确定内联是什么意思i-请注意,它在中的定义中出现了两次f。不知道删除_大小写是什么意思- _->a完全省略或将其移到顶部都会产生非穷尽的模式异常,而将其移到顶部则不会保存任何字符。但是,我确实设法在其中保存了5个字符。
John Dvorak

很好的解决方案。我检查了所有测试用例。
雅库布2015年

再次祝贺您的解决方案。由于您提供的代码最短,因此您将获得价值100美金的奖励。
2015年

4

大概6 4个字节

¶=8%

我赢了:P

¶=8%
¶     read a string, evaluate as Cubically code
 =8   set notepad to (notepad == 8th face)
   %  print notepad

记事本初始化为零。如果多维数据集未解决,则第8个“面”包含1,否则包含0。

在线尝试!


3
看起来像一种有趣的语言。但是由于该语言是在发布挑战后创建的,因此不符合获奖资格。
雅库布

2
@Jakube我同意不应该接受它,只是因为这是Rubik的Cube内置语言发布的一种语言,在挑战之后很晚才发布,因此完全推翻了其他答案。但是从技术上讲,它有资格按元获胜(非竞争性规则已被撤销)。
MD XF

3

的J - 232,220,381,315个 296字节

该解决方案将所有操作编码为面部排列,并基于在整个立方体旋转的情况下所有面部扭曲实际上都相同的事实进行工作。

编辑:更多打高尔夫球

f=:+/~6&*
r=:4 :'y f&.>(]{^:x~)&.C.;/i.2 4'"0
t=:((r~0),_4<\44#.inv 1478253772705907911x)&C.&.
Y=:(C.(,0 2 r 4 5),;/4 f&i.8)&{^:t
X=:((,1 1 0 2 r 2 4 3 1)C.C.;/0 4 2 5 f i.8)&{^:t
61".@A."1'=: ',"#~6 3$'D0XR1YF1XU2YB3XL3Y'
T=:[:(_2".@}.'(i.48)-:'&(,,[))[:(,'^:',])/&.>@|.&.;:[:''''&=@{.`]},:&'3'

除了以前的尝试,这确实考虑了角旋转。

f只是一个辅助功能。r旋转一张脸。脸部编码如下:

  1. 所有角点均为6
  2. 所有边缘以六步为单位

此顺序有助于旋转和扭曲的编码。 t是副词,可在一定的立方体旋转下扭曲面部,从而选择面部。

XY是副词,它以整个多维数据集在该方向上的数字作为左参数。

下一行定义了所有旋转:每旋转3个字符:名称,旋转数和方向。

最后一行定义测试动词T,将3转换'为Power表示法,翻转附加测试向量的操作顺序,最后对整个事物进行演绎。

根据要求提供更多细节。

tests =: (] ;. _2) 0 : 0

 U2 R R' U2
 U D2 U' D2
 U2 R2 R'
 R' U' R' F' U F U' R' F R F' U' R U2 R
 L'
 B B2 B' B2
 D D2 D'
 R F' D2 U B' F2 B' U2 D2 F2 B2 U F R'
 D2 U' R2 U F2 D2 U' R2 U' B' L2 R' B' D2 U B2 L' D' R2
 R U R' U' R' F R2 U' R' U' R U R' F' R2 U R2 U' R2 U' D R2 U' R2 U R2 D'
 R U R' U' R' F R2 U' R' U' R U R' F' R2 U' R2 U R2 U' D R2 U' R2 U R2 D'
 B2 F2 U' F2 U R2 F2 U2 B D' R' D' R2 D' F2 U' F U R2 U R B D B D2 L2 D' F2 U D' R' D B R2 D2 F2 R' F2 D2
 R U2 R' U R' U2 R U2 R U R' U' R' U R U2
 U F B' R' U F' R U' F' B L U' F L'
 R2 U' R' U' R U R U R U' R
 R' F R' B2 R F' R' B2 R2
)
res =: 1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0
res ([,],:=) T"1 tests NB. passes all tests.
1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0
1 1 1 0 1 0 1 0 1 0 1 0 1 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

NB. some handy display methods:
dispOrig=: (". ;._2) 0 :0
   _   _   _   5  29  11   _   _   _   _   _   _
   _   _   _  47  _1  35   _   _   _   _   _   _
   _   _   _  23  41  17   _   _   _   _   _   _
   3  27   9   0  24   6   1  25   7   2  26   8
  45  _3  33  42  _6  30  43  _5  31  44  _4  32
  21  39  15  18  36  12  19  37  13  20  38  14
   _   _   _   4  28  10   _   _   _   _   _   _
   _   _   _  46  _2  34   _   _   _   _   _   _
   _   _   _  22  40  16   _   _   _   _   _   _
)
ind =: dispOrig i.&, i. 48 NB. indices of i.48 in the original display

disp =: (9 12$(,dispOrig) ind}~ ])
changed =: 1 : '(u ~:&disp ]) i.48' NB. use to debug permutation verbs: L ch
vch =: 1 :'disp  ((]+_*=) u)'
NB. viewmat integration RGB
cm =: 255 * 1 0 0 , 1 1 1, 0 1 0, 1 1 0, 1 0.5 0, 0 0 1,: 0 0 0 NB. colormap
NB. use as:  "cube i. 48" for seeing a nice folded out cube.
cube =: cm viewmat (>&7 + >&15 + >&23 + >&31 + >& 39 + >&47)@|@disp@]

11
“因为我的测试结果与给定的结果不符……”,那么您的解决方案不起作用吗?那我就不会发布...
John Dvorak

你是对的。立即修复。
jpjacobs

我添加了4个其他测试用例。其中两个仍然返回错误结果。好像您忽略了角的方向。
雅库布2015年

@jpjacobs现在有100个问题的赏金。想更正您的代码吗?
雅库布2015年

瞧,完成了。现在只是减少它。
jpjacobs 2015年

2

Python 3:280个字符

这不是挑战的参与者。首先是因为我自己问挑战,其次是因为这不是我的代码。所有荣誉归Stefan Pochmann所有,他发现了这种模拟魔方的绝佳方法。在挑战方面,我只打了些高尔夫球,并做了一些小改动。

def f(a):
 s=t="UF UR UB UL DF DR DB DL FR FL BR BL UFR URB UBL ULF DRF DFL DLB DBR".split()
 for m in a.split():q="FLBR FRBL FDBU FUBD URDL ULDR".split()['UDLRFB'.index(m[0])];n=2+"2'".find(m[-1]);s=[[p,p.translate(str.maketrans(q,q[n:]+q[:n]))][m[0]in p]for p in s]
 return s==t

其背后的想法如下。s代表的片的位置UFUR等。例如:s = ['DF', 'BL', ...]表示件UF位于位置DF,件UR位于位置BL,...。

进行移动时,棋子的位置如何变化。如果进行U-move操作,U则面向正面的-layer的所有贴纸(颜色)将移至左侧。左面的贴纸向后移动,向右,向正面移动。由编码FLBR。例如:UF移至ULUFR移至ULF等等。因此,应用移动只是在相应层中平移碎片的表面。

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.