Rubik Küpündeki kimlik dizileri


32

Bir hamle dizisi, bir Rubik Küpünde bir hamle dizisidir (aşağıya bakınız). Boş hareket dizisinin yanında, küp üzerinde hiçbir etkisi olmayan diğer birçok hareket dizisi vardır. Bu hareket dizilerine kimlik dizileri diyoruz.

Bu kimlik dizilerinin bir kısmının U2 R R' U2veya olduğu belirlenir U D2 U' D2. İlki, iki rasgele hamle yapılır U2 Rve ardından hemen geri alınır R' U2. İkincisi benzer. İlk iki rasgele hamle U D2ve daha sonra geri alınmaz, ancak ters sırada yapılır U' D2. Bu sadece işe yarar, çünkü hareket Uyalnızca üst katmanın D2parçalarını etkiler ve hareket yalnızca alt katmanın parçalarını etkiler. Bu iki hareket dizisinin görselleştirmesini görebilirsiniz.

U2 RR 'U2 U D2 U 'D2

Diğer kimlik dizileri hiç açık olmayabilir. Örneğin dizi R' U' R' F' U F U' R' F R F' U' R U2 R. Oldukça uzun, ama aynı zamanda küp üzerinde hiçbir etkisi yoktur.

görüntü tanımını buraya girin

Notasyonu Taşı

Bir hareket, küpün altı yüzünden birinin bir katmanının dönüşünü açıklar. Bir hareket, yüzü temsil eden bir harften sonra dönüş açısını temsil eden isteğe bağlı bir sonekten oluşur.

Harfler ve karşılık gelen yüzleri U (Yukarı - yukarı bakan taraf), D (Aşağı - aşağı bakan taraf), R (Sağ - sola bakan taraf ), L (Sol - sola bakan taraf) , F (Ön - size bakan taraf) ve B (Arka - size bakan taraf).

Son ek yoksa, yüz saat yönünde 90 derece, son ek 'aracı, yüz saat yönünün tersine 90 derece ve son ek 2aracı yüz saat yönünde 90 derece döndürülür.

Bu notasyon ile ilgili herhangi bir probleminiz varsa, sadece bu gibi hareket dizilerini görselleştirebileceğiniz http://alg.cubing.net adresini kullanın .

Meydan okuma

Göreviniz, bir hamle dizisinin bir kimlik olup olmadığını belirleyen bir program yazmaktır.

Tam bir program veya bir fonksiyon yazabilirsiniz. Girdi (STDIN, komut satırı argümanı, bilgi istemi veya işlev argümanı) ve çıkış (dönüş değeri veya STDOUT yoluyla) bir Boolean değeri veya karşılık gelen bir tamsayı (çıkış) olarak bir hareket dizisi içeren (hareketler boşluklarla ayrı) bir dize almalıdır. Doğru - 1 - kimlik sırası / Yanlış - 0 - kimlik sırası değil).

Son ekiniz 'programlama dilinizde sorun yaratırsa, farklı bir simge kullanabilirsiniz, ancak rakam kullanamazsınız. R F2 U3Müsade edilmez.

Bu kod kodludur, bu nedenle en kısa kod (bayt cinsinden) kazanır.

Test Kılıfları

"" -> 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

Neyin var R F2 U3?
John Dvorak

2
Sadece herkesin aynı önkoşullara sahip olduğundan emin olmak istiyorum. Eğer izin verirsem U3, son ekini basitçe bir rakama çevirebilirsin.
Jakube,

3
Ben daha çok T-Top, B-Bottom ve P-Posterior (arka) kullanan gösterime alışkınım. İnsanlar muhtemelen diziyi görmekten hoşlanıyorlardı R2 D2.
mbomb007

2
@ mbomb007 En üste T'yi anlayabiliyorum, ama posterior için P'yi hiç görmedim ve anlamının sizin yorumunuz için olmadığını anlayamadım ...
John Dvorak

2
@ mbomb007 Bu notasyonu da gördüm, ancak orijinal Singmaster notasyonu kadar yaygın veya eski değil ve insanların neden orijinalleri karıştırmak istediklerini bilmiyorum. David Singmaster (bildiğim kadarıyla) bahsetmese de, tüm yüzlerin kusursuz bir şekilde tutarlı olduğunu ve konumlardan ziyade yön olarak kabul edilirse çatışma olmadığını gördüm. That is F(orward), B(ackward), L(eft), R(ight), U(p), D(own)
Seviye Nehri St

Yanıtlar:


14

Haskell, 263 261 247 243 karakter

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)

Oldukça düz dünya algoritması; her bir küp, konumunu ve yönünü kodlayan 1,2,4 veya 8 parçadan oluşur; Kenar küp küp başına 4 topak, köşe küp küp başına 8, 7 küp sabit.

c c, girişin her kelimesini CW dönüşleri sekansına yerleştirir! bir dönüşe göre gönderir. iolduğu i dentity konumu. fana olduğunu f fonksiyonu.

cHomp işlevinden çok memnun değilim , ancak kısaltmanın bir yolunu da bulamıyorum (@Nimi, ancak)


Peki ya c(x:"2")=[x,x]ve c(x:_)=[x,x,x]. 2 bayt kaydeder.
nimi

Eğer kullanırsanız i=sequence[s,s,s]ve listelere bütün dizilerini değiştirmek (yani: (x,y,z)olur [x,y,z]) - bu ~ 9 karakterleri kaydedeceğiz. İçinde 4 daha tasarruf sağlar. _Davayı bırakmak, bir !diğerinden tasarruf etti 11.
MtnViewMark

@ MTNViewMark yapılır ve geliştirildi i, teşekkürler. iİçinde ne yazdığınızdan emin değilsiniz - lütfen tanımında iki kez göründüğünü unutmayın f. Kasayı bırakarak ne demek istediğinizi tam olarak bilmiyoruz - tamamen dışarıda _bırakmak _->aveya en üste taşımak, yorucu olmayan bir desen istisnası verir ve en üste taşımak hiçbir şekilde karakter kaydetmez. Ancak orada 5 karakter kaydetmeyi başardım.
John Dvorak

Harika bir çözüm. Tüm test durumlarını kontrol ettim.
Jakube

Yine, çözümünüzü tebrik ederim. En kısa kodu verdiğinizden beri, 100 itibarı olan ödül alırsınız.
Jakube

4

Kübik olarak , 6 4 bayt

¶=8%

Kazandım: P

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

Not defteri sıfıra başlatılır. 8. "yüz", küp çözülmezse 1, aksi takdirde 0 içerir.

Çevrimiçi deneyin!


3
İlginç bir dile benziyor. Ancak, meydan okuma yayınlandıktan sonra dil oluşturulduğundan, kazanmaya uygun değildir.
Jakube

2
@Jakube Sadece Rubik Küpü yerleşiklerinin bir dilden gelmesi ve diğer cevapları tam olarak reddetmesi nedeniyle kabul edilmemesi gerektiğine katılıyorum. Ancak teknik olarak meta başına göre kazanmak için uygundur (rekabet etmeyen kural biraz iptal edildi).
MD XF

3

J - 232, 220, 381, 315 296 bayt

Bu çözüm, tüm işlemleri yüz izinleri olarak kodlar ve tüm yüz bükülmelerinin tüm küpün dönüşü altında gerçekte aynı olduğu gerçeğine dayanarak çalışır.

Düzenleme : biraz daha golf

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'

Diğer önceki denemeden daha bu mu dikkate köşe dönüşünü almak.

fsadece bir yardımcı fonksiyondur. rbir yüzün dönüşünü yapar. bir yüz aşağıdaki gibi kodlanır:

  1. 6 adımda tüm köşeler
  2. altı adımda tüm kenarlar

bu sıra, dönüşlerin ve bükülmelerin kodlanmasını kolaylaştırır. tyüzü seçerek, belirli bir küp dönüşünün altında yüzü çeviren bir yüzdür.

Xve Ysol argüman olarak tüm küpün o yönündeki sayısını belirten zarflardır.

Bir sonraki satır tüm dönüşleri tanımlar: dönüş başına 3 karakter: ad, dönüş sayısı ve yön.

Son satır, test fiilini ( T3) ve 'Güç notasyonuna dönüştürerek , test vektörünü ekleyen ve her şeyi son olarak kesen işlem sırasını çeviren fiili tanımlar.

İstek üzerine daha fazla bilgi.

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
"Test sonuçlarım verilenlerle uyuşmadığından ..." olduğu gibi, çözümünüz çalışmıyor mu? O zaman göndermedim ...
John Dvorak

Haklısın. Şimdi düzeltildi.
jpjacobs

4 ek test vakası ekledim. İkisi hala yanlış sonuç verir. Köşelerin yönünü yok sayıyor gibisin.
Jakube,

@jpjacobs Şu an soru üzerine 100 tekrarlayan ödül var. Kodunu düzeltmek ister misin?
Jakube,

Voila, bitti. Şimdi sadece azaltıyorum.
jpjacobs

2

Python 3: 280 karakter

Bu, mücadeleye katılan bir katılımcı değil. Öncelikle meydan okumayı kendim sordum ve ikincisi benim kodum değil çünkü. Tüm krediler , Rubik Küpü simüle etmenin bu harika yolunu keşfeden Stefan Pochmann'a aittir . Meydan okuma konusunda sadece biraz golf oynadım ve bazı küçük değişiklikler yaptım.

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

Bunun arkasındaki fikir şudur. sparçalarının konumunu temsil eder UF, URve bu kadar. Örneğin: s = ['DF', 'BL', ...]anlamına gelir, parça UFpozisyonda DF, parça URpozisyonda BL...

Bir hamle yaparken, bir parçanın konumu nasıl değişir? Bir U-move yaparsanız U, ön yüze bakan tabakanın tüm etiketleri (renkleri) sol yüze gider. Sol yüzün etiketleri arkaya, bunlar sağa ve ön yüze doğru hareket eder. Tarafından kodlanmış FLBR. Bazı örnekler: UFiçin hamle UL, UFRhamle etmek ULFvb. Bu nedenle, bir hareket uygulamak, karşılık gelen katmandaki parçaların yüzlerini çevirmektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.