Rubik Küpü mü?


25

Çok değerli bir geçiş süresi, "Rubik Küpleri" resimlerinin (tişörtler, posterler vb.) Aslında çözülemez olduğuna işaret etmektir.

Kontrol edilmesi gereken ilk şey, küpün doğru parçalardan yapılmış olmasıdır. Çözülebilir olması için bir küpün her biri dokuz kareden oluşan altı renge ihtiyacı vardır. Küpün ayrıca benzersiz olması için her bir kenar ve köşe ünitesine (küpü oluşturan daha küçük küpler) ihtiyacı vardır. Sadece benzersiz olmaları gerekmekle kalmaz, iki merkez parçası birbirinin karşısındaysa hiçbir kenar veya köşe parçası bu renklerin ikisini de içeremez.

Doğru parçalardan oluşan bir küpünüz olduğunda, çözülebilir olduğunu doğrulamanız gerekir. Burada birkaç kural var, bu yüzden onları açıklamak için bir uzmana erteleyeceğim, aşağıdaki spoyler bunu nasıl yapabileceğimizi açıklıyor. Sorunu kendi başınıza çözmekle ilgileniyorsanız, bu zorluğu anlamak veya katılmak için siteyi ziyaret etmeniz gerekmez.

Bağlantılı açıklama

Senin görevin girdi olarak bir kalıp almak ve aslında çözülebilir bir Rubik küpü olup olmadığını belirlemek. Çözülebilir olması için, küpün her yüzünde yalnızca bir renge sahip olacak şekilde küp üzerinde geçerli hareketler gerçekleştirmenin bir yolu olmalıdır (ve farklı yüzlerin farklı renkleri vardır). Rubik küplerinin çoğu standart bir renklendirmeye sahiptir (Beyaz, Sarı'nın vs.), çözme durumunun bu belirli renklendirmeyi takip ettiğini varsaymayabilirsiniz.

Geçerli bir hareket, küpün tek bir yüzünün saat yönünde veya saat yönünün tersine döndürülmesidir. Küp yüzünün dönmesiyle, yüzü çevreleyen kareler de döndürülerek, daha önce temas ettikleri yüze bağlı kalırlar.

IO

Küpü makul bir şekilde alabilirsiniz. Dilinizde yerleşik bir "küp-yüz" tipi varsa, sizin için iyi, giriş olarak gayet iyi, başka bir deyişle, küpün ağının 2B dizisini, her yüz için 1 3'e 3 sıralayabilirsiniz. Sadece mantıklı ol. Belirli bir formatın kabul edilebilir olup olmadığını bilmek veya sohbete beni atmak istiyorsanız, geçerliliğini belirtmek için mücadeleye ekleyeceğim.

Giriş biçiminizin yalnızca 9 olası rengi desteklemesi gerekir.

Çıktı için bu bir karar sorunudur, "Evet, bu geçerli bir Rubik küpü" için bir sabit değer ve "Hayır, bu geçerli bir Rubik küpü" için bir sabit değer vermelisiniz.


Bu olduğundan, cevaplar daha az byte'ın daha iyi olmasıyla byte olarak puanlanacak.

Test Kılıfları

İşte test vakaları. Her kare tek bir harf olarak bir küpün ağı olarak biçimlendirilmişlerdir. Farklı harfler farklı renkleri temsil eder. Talep üzerine daha fazla test çantası eklenebilir.

halledilebilir

   RRR
   RRR
   RRR
GGGWWWBBBOOO
GGGWWWBBBOOO
GGGWWWBBBOOO
   YYY
   YYY
   YYY


   GRR
   GRR
   ORW
WWRBWYBOOGGY
GGRBWGYBBOOO
OOGRWGYWWRBB
   WYO
   YYB
   YYB

çözümsüz

   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
Rubik'in avatarınızdaki küpünün çözülemez olduğunu belirtmek zorunda olduğumu hissediyorum. Yanımızda sadece 4 tane kare var, normal bir Rubik küpü 9 olmalıdır. Kareların üstünde garip sembollerden bahsetmiyorum.
DJMcMayhem

2
@DJMcMayhem Çocuklarımın Rubik küpleri sadece dört adet "alt küp" ile dolu.
Adam

2
@ H.PWiz Hayır, yapamazsınız. Tanımlarımda bu açıktı, ancak bunu soruda açık hale getireceğim.
Buğday Sihirbazı

2
Spesifikasyonunuz, küpün üç parite yasasının tam bir tanımını içermez. 1. Sadece 1 kenarı 180 derece döndürülmüş olması imkansızdır (belirtilen) 2. Sadece 1 köşeyi 120 derece bükülmüş olması imkansızdır (belirtilmemiştir) 3. Küplerin tuhaf bir permütasyonuna sahip olmak imkansızdır. ). Bu çözülene kadar yakın oy kullanıyorum. Bir açıklama için ryanheise.com/cube/cube_laws.html adresine bakın .
Seviye Nehri St

4
@LevelRiverSt Rubik küpünün bağımsız olduğunu, herkesin matematiksel formülasyondan ve eşitlik yasalarından bağımsız olarak elde edebileceğini not edin.
user202729

Yanıtlar:


14

Kübik olarak , 1664 1631 1089 bayt

⇒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

Çözülebilir ise çıktı: Solved!
Çözülemez ise çıktı: (boş, çıktı yok)

Girdi, küp küp dökümü şeklinde biçimlendirilmelidir ( Debugbölüme bakın). Buna OP tarafından açıkça izin verildi.

açıklama

Bu program , çözülen küple aynı gruptaki küpün olası her bir durumunu tekrarlamak için bir Şeytan Algoritması kullanma yaklaşımını kullanır . Küp çözülebilir ise, algoritma bitmeden bir noktada çözülecektir ( kullandığım algoritmanın düzgün çalıştığını varsayarsak ).

(Cubically kod sayfasında 0x84) ile başlayan her satır bir fonksiyon tanımıdır; bu fonksiyonlar, gerçek Şeytanın Algoritmasını oluşturmak için birbirlerini oluştururlar. Yürütülecek ilk satır sonuncudur:

rs[f36f71]8

rstdin'den bir küp okur ve bellek küpünü ona ayarlar. stercümanı "solvemode" a yerleştirir, yani Solved!küp herhangi bir noktada (çözüldükten sonra) çözülürse çıkar ve yazdırır . Komutların geri kalanı (sadece f36f718 kez tekrarlanır ), linklenmiş sayfanın altındaki son algoritmaya karşılık gelir:

(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.

Nasıl çalıştırabilirim?

Şunları yapabilirsiniz çevrimiçi denemek , ama bu bağlantı çalışmıyor. Bu algoritma sona ermeden TIO neredeyse kesinlikle zaman aşımına uğrar (tercüman için maksimum çalışma süresi 60 saniyedir). Küp çözülemiyorsa, bu algoritma Cubically'in bitirmesi için 11 milyon yıl alacaktır (saniyede ~ 15,2 milyon hamle, Cloud9 IDE'm ne alır).

Ek olarak, 3 sextillion hareketi gerçekleştirmek için çok fazla belleğe ihtiyacınız var . Kübik saniyede yaklaşık 4 milyon hamle yapabilir, ancak aşırı bellek kullanımı nedeniyle bu süreç büyük olasılıkla öldürülecek . VM'imde 512 MB bellekle 15 saniye sonra ölüyor. Neden zaten tahsis edilmiş bir düz dizilim maliyet hafızasında hamleler yapmalı? Bir bellek sızıntısı bulundu (veya yirmi) ve düzeltti .

İşte aynı şekilde davranan çok daha okunaklı bir versiyon.

Ama gerçekten işe yaradığını görmek istiyorum!

Bu şeytanın algoritmasında yürütülen ilk hareket, F2çözülmesi gereken en hızlı küpün F2:

   000
   000
   555
113222133444
113222133444
113222133444
   000
   555
   555

Bu gerçekten TIO'da 0.007 saniyede yürütülür .

Bu nasıl geliştirilebilir?

Kesinlikle daha fazla şeytanın algoritması var; Bunun yaptığı hareketlerin otuzda birinden daha azını kullanan birini buldum. Bununla birlikte, bu, birkaç bin byte (yaklaşık 100 MB daha fazla) ve karmaşık bir Hamiltonian devresini Cubically koda dönüştürmek için birkaç düzine saatlik ücrete tabi olacaktır.

Ayrıca, bazı işlevlerin kaldırılması ve alt kısımdaki dümenin içine doğrudan yerleştirilmesi de mümkündür. Ancak bazı okunabilirlik için bazı baytları feda edeceğim.

Ek olarak, Cubically'ın döngü davranışının bir modifikasyonunu düşünüyorum, böylece algoritmaları 7 veya 8 kez daha kolay tekrarlayabilirim (sadece kaynakta 7 veya 8 kez tekrarlanan fonksiyon çağrıları ile kodlama yerine). Ya da not defteri ile biraz sihir çalışacağım ve bunu daha fazla döngü kullanarak golf oynayacağım.

Tercümandaki olası her şeyi optimize etmeye devam edeceğime dikkat edin, bu nedenle gelecekte ortalama bir bilgisayarda çalışabilir!


Kübik olarak, 2 bayt

r▦

Yukarıdaki cevabı daha çok seviyorum, bu yüzden alternatif bir çözüm olarak ekliyorum. Bu, birkaç milyon yıl yerine, bir saniyenin altında gerçekleşiyor.

r    read cube from standard in
 ▦   and solve it

Küp çözülebilir ise çıktı: (hiçbir şey)
Küp çözülemez ise çıktı: Error: The cube has reached an unsolvable state.


Taraf değiştirirsek bu işe yarar mı? Örneğin 2, küp dökümü için 4'ün karşısında, 2'nin 5 ve 4'ün 0 olması durumunda işe yarıyor mu?
Buğday Sihirbazı,

1
@WheatWizard Evet, solvemode her yüzün benzersiz bir tamsayı olup olmadığını ve bu tamsayı yüzündeki tek olup olmadığını kontrol eder.
MD XF

Tamam olması gerektiği gibi. Bunun sizin durumunuz için geçerli olup olmadığını bilmek için Kübik olarak yeterli değildim.
Buğday Sihirbazı

@WheatWizard Sadece seni doğru anladığımdan emin olmak - bu (sıraları boyunca) kastettiğin şey, doğru mu?
MD XF

Evet. Ve çözülebilir olmalıdır.
Buğday Sihirbazı,

4

APL (Dyalog Classic) , 190 174 bayt

{∧/~∊(×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∘⌷¨⍵)}

Çevrimiçi deneyin!

Argüman 3x2 matristir (satır0: ön arka, satır1: sol sağ, satır2: yukarı) 3x3 karakter matrisleri. Çözülebilir bir Rubik küpü için 1, aksi takdirde 0 döndürür.

TIO bağlantısında, tkarakter sayısına dahil edilmeyen işlev , 9 satır girdi okur, bunları varsayılan giriş biçiminden (net) istenen 3x2 x 3x3 matrisine dönüştürür, çözümü çağırır ve sonuç Tamam beklendiği gibi.

Algoritma, verilen küpü 26 küp şeklinde böler - uzunluk 3 dizisi (köşeler), 2 (kenarlar) ve 1 (merkezler). Ayrıca, aynı 6 merkez küp ile birlikte 26 küp çözülmüş bir küp oluşturur. Aşağıdaki kriterlerin tümü karşılanmalıdır:

  • 6 merkez arasında yinelenen kişi yok

  • verilen / çözülen küplerin kümeleri, rotasyona kadar eşleşir - örneğin düşünün 'WBR've 'BRW'aynı küpü, ancak'BWR'

  • Hem köşe hem de kenar permütasyonunun pariteleri eşit

  • Köşe dönme endeksleri Modülo-3 toplamı (örneğin, "en küçük" harfi alarak BElimizdeki bir referans noktası olarak: 'BRW'→0, 'WBR'→1, 'RWB'→2) verildi ve çözülmüş küp arasındaki uyum; köşeleri için aynı modulo 2

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.