43 çeyrek milyon permütasyon


17

Rubik Küpünü bir ağ olarak şu şekilde temsil edebiliriz (çözüldüğünde):

   WWW
   WWW
   WWW
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
   YYY
   YYY
   YYY

Her harf karşılık gelen rengi temsil eder ( Wbeyaz, Gyeşil vb.)

Gösterilmiştir tam olduğu 43,252,003,274,489,856,000 (~ 43 Rubik küp içinde olabilir kentilyon) farklı permütasyon mevcuttur.

Göreviniz 1 ile 43,252,003,274,489,856,000 arasında bir tamsayı almak ve karşılık gelen permütasyonu yukarıda gösterilen şekilde çıkarmaktır . Permütasyonların nasıl sıralanacağını seçebilirsiniz, ancak olası her girdi için benzersiz ve doğru bir permütasyon oluşturmak için kullandığınız algoritmanın gösterilmesi gerekir.

Geçersiz permütasyon kuralları

Alındığı bu sayfada

Başlangıç ​​olarak, her 3x3 yüzün merkezi aynı kalmalıdır, çünkü bir Rubik Küpü üzerindeki merkez kare döndürülemez. Tüm küp, bir yüzün nerede göründüğünü değiştirerek döndürülebilir, ancak bu küpün ağını etkilemez.

Her permütasyonun, bu permütasyona ulaşmak için takas sayısının paritesine bağlı olarak bir paritesi olduğunu söylesek,

  • Her köşe parçasının üç olası yönü vardır. Doğru (0), saat yönünde (1) veya saat yönünün tersine (2) yönlendirilebilir. Köşe yönelimlerinin toplamı her zaman 3'e bölünebilir

  • Rubik Küpü üzerindeki her yasal döndürme her zaman eşit sayıda kenar döndürür, böylece tek bir parça yanlış yönlendirilemez.

  • Tüm köşelerin ve kenarların permütasyonu göz önüne alındığında, genel parite eşit olmalıdır, bu da her yasal hareketin her zaman çift sayıda takasın eşdeğerini gerçekleştirdiği anlamına gelir (yönlendirme yoksayılır)

Örneğin, aşağıdaki üç ağ geçersiz çıktılardır:

   WWW
   WWW
   WWW
GGGWWWBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
   YYY
   YYY
   YYY

(Too many whites/not enough reds)

   WRW
   WRW
   WRW
GGGRWRBBBOOO
GGGWRRBBBOOO
YYGRWROOOBBB
   YYY
   GGY
   YYY

(There are two red/green center squares and no white/yellow center squares.
 In all valid permutations, the center squares are all different colours)

   WWW
   WWW
   WWW
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBOYOO
   YYY
   YYY
   YYB

(The yellow/orange/blue corner is rotated into an impossible permutation)

kurallar

  • Bununla birlikte, algoritmanın geçerli olduğunu istediğiniz şekilde kanıtlamanız gerekir. Algoritmanızın geçerliliğini kanıtladığınız sürece, her bir permütasyonu numaralandırmanız gerekmez.
  • 143,252,003,274,489,856,000
    • 25312531
    • 27,946,105,037,114,827,095
  • Sen gerekir Yanıtınızda geçerlilik kanıtı çeşit bulunmaktadır. Bu kanıt, tüm olasılıkları numaralandırmak dışında, kabul edilen herhangi bir kanıt yönteminde geçerliliği kanıtlayabilir.
  • İsterseniz alternatif bir giriş yöntemi kullanmayı seçebilirsiniz:
    • Giriş sınırlıdır
    • Her giriş benzersiz bir çıkışa karşılık gelir
    • Girdi biçimini ve her bir çıktıya nasıl karşılık geldiğini net bir şekilde açıklıyorsunuz
  • 6 farklı ASCII karakteri kullanmak için kullanılan karakterleri değiştirmek yerine 33 ( !) ve 126 ( ~) arasında değiştirebilirsiniz.WGRBOY
  • Herhangi bir geçerli küp ağı, tek bir çizgili dize veya bir 3B oluşturma da dahil olmak üzere 6 yüzün de gösterilebildiği bir küpün net bir temsilini oluşturduğu sürece istediğiniz şekilde çıktı alabilirsiniz. Belirli bir biçimden emin değilseniz, yorumlarda sormaktan çekinmeyin.

Bu bir bu nedenle her dilde bayt cinsinden en kısa kod kazanır.

Örnek geçerli çıktılar

   YYY
   YYY
   YYY
GGGRRRBBBOOO
GGGRRRBBBOOO
GGGRRRBBBOOO
   WWW
   WWW
   WWW

(The `W` and `Y` faces have been swapped)

   ZZZ
   +++
   +}}
+[[}77ZZ7bbb
bb[}[[7}}+Z7
bb[}++[}}+Z7
   7bb
   [7Z
   [7Z

(To start with, the colours have been mapped W -> +, G -> b, R -> [, B -> }, O -> Z and Y -> 7.
 Then, the moves L, R, U and F' have been applied, in that order.
 Notice that each centre square is different, and corresponds to the same colour as in the mapping)

Üçüncü geçersiz örnekte, yalnızca köşenin geçersiz bir yapılandırmada olması değil, r / o köşesi birbirine zıt olduğu için r / y / o köşesi imkansız bir köşedir
fəˈnɛtɪk

Üçüncü geçersiz örnek düzeltildi (CC @ fəˈnɛtɪk)
Jonathan Allan

Aynı sorun ikinci geçersiz örnek oldu ama ben fark etmedi. Renkler daha az berbat olduğu için orada daha az önemli
fəˈnɛtɪk

(a1,a2,a3,a4)a18!a237a312!/2a4211

1
@Shaggy Evet, tek bir satır dizesi iyi
caird coinheringaahing

Yanıtlar:


13

Kömür , 334297 bayt

Nθ≔׳﹪θ²¹⁸⁷ε≧⁺﹪±Σ⍘峦³ε≧÷²¹⁸⁷θ≔⁴⁰³²⁰δ≔﹪θδζ≧÷δθ≔⊗﹪θ²⁰⁴⁸η≧⁺﹪Σ⍘粦²η≧÷²⁰⁴⁸θF⪪”B"↷:μêKO″KW#})”³«J⌕α§ι⁰I§ι¹§ι²»≔⁰ω≔⪪”A‽}y≔W⊞≦≦⧴!O×➙⟧ï!Y9⁺`↙1δQ1ξzT”⁶υ≔⪪”{➙∧⊙ηr⸿ξd⊕÷M→¡$≧”³δF²«Fδ«≔§υ⎇⁼Lυ⊗ιωζδ≧÷Lυζ≧⁺⌕υδω≔Φυ¬⁼λδυFLκ«J⌕α§δ⊗⁺λεI§δ⊕⊗⁺λε§κλ»≧÷Lκε»≔⪪”A‽}R›K<≡^μ≡⟦σD⎚+πη±t¿e∧L⸿~↑�w”⁴υ≔⪪”{➙∧⊙ηr⸿ξe'→↑Þ³№¹”²δ≔θζ≔ηε

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

Nθ

Tamsayıyı değişkene girin q.

≔׳﹪θ²¹⁸⁷ε≧⁺﹪±Σ⍘峦³ε≧÷²¹⁸⁷θ

Bölün qolarak kalan koyarak, 3⁷ ile e. Daha sonra, etaban 3'te bir sayı olarak göz önüne ealındığında, rakamlarının (taban 3'te) 3'ün katlarını toplaması için bir rakam ekleyin. Bu e, köşelerin dönüşlerini tanımlamaya izin verir .

≔⁴⁰³²⁰δ≔﹪θδζ≧÷δθ

Böl qkalanını koymak !, 8 ile z. (8! dBir bayt kaydetmek için geçici olarak saklanır .) Bu zköşelerin konumlarını tanımlamayı sağlar .

≔⊗﹪θ²⁰⁴⁸η≧⁺﹪Σ⍘粦²η≧÷²⁰⁴⁸θ

Bölün qolarak kalan koyarak, 2¹¹ ile h. Daha sonra, htaban 2'de bir sayı olarak göz önüne halındığında, basamaklarının (taban 2'de) 2'nin katını ekleyeceği şekilde bir rakam ekleyin. Bu h, kenarların döndürülmesini tanımlamayı sağlar .

F⪪”B"↷:μêKO″KW#})”³

Merkezlerin bir dize temsili üzerinde döngü.

«J⌕α§ι⁰I§ι¹§ι²»

Her merkezin konumuna atlayın ve yazdırın.

≔⁰ω

Değişkendeki köşe konumlarının paritesini takip edin w.

≔⪪”A‽}y≔W⊞≦≦⧴!O×➙⟧ï!Y9⁺`↙1δQ1ξzT”⁶υ

Bir dizi köşe konumu oluşturun.

≔⪪”{➙∧⊙ηr⸿ξd⊕÷M→¡$≧”³δ

Bir dizi köşe rengi oluşturun.

F²«

İki kez, bir kez köşeler için, bir kez kenarlar için, bundan sonra "küp" olarak anılacaktır.

Fδ«

Küp renk dizisi üzerinde döngü.

≔§υ⎇⁼Lυ⊗ιωζδ≧÷Lυζ≧⁺⌕υδω≔Φυ¬⁼λδυ

Pariteyi zgüncelleyerek bir sonraki küp konumunu çıkartın w. Bu pariteyi son fakat bir kenar için kullanın. Bu, kenarların ve köşelerin parite toplamının eşit olmasını sağlar.

FLκ«J⌕α§δ⊗⁺λεI§δ⊕⊗⁺λε§κλ»

Bir sonraki dönüş için ayarlanmış olan küpü o konumda yazdırın veya uygun şekilde çevirin.

≧÷Lκε»

Döndürmeyi çıkarın veya konumundan çevirin e.

≔⪪”A‽}R›K<≡^μ≡⟦σD⎚+πη±t¿e∧L⸿~↑�w”⁴υ

Kenar konumları dizisi oluşturun. Bu döngü boyunca ikinci kez kullanılacaktır.

≔⪪”{➙∧⊙ηr⸿ξe'→↑Þ³№¹”²δ

Kenar renkleri dizisi oluşturun.

≔θζ≔ηε

Köşe değişkenlerinin zve ekarşılık gelen kenar değişkenlerinin üzerine yazın q, hböylece kenarlara ilmiğin ikinci geçişi sırasında izin verilir ve döndürülür.


Kendime tavsiye et: Kömürde golf oynayan bir şey 330 bayt ise, PHP'de denemeyin!
Night2

@ Night2 Ne yazık ki 334, bir hata düzeltme nedeniyle (yanlış parite hesaplama).
Neil

8

Yakut , 570 408 bayt

->g,h{z=[]
c=a="\x19)!$'%\x177\x1F495.)@7g~yp"
20.times{|i|z<<a[k=g%r=12+i/12*8-i];a[k]="";g/=r}
19.times{|i|z[0..i].map{|j|j>z[i+1]&&c=!c}}
c||(z[19],z[18]=z[18,2])
h+=h+("%b"%(h%2048)).sum%2
j=0
b="023451"
20.times{|i|b<<("%0*o"%[r=2+i/12,z[i].ord-20]*2)[h%r+i/19*j%3,r];j-=r/3*h;h/=r}
s=(t="...
"*3)+(?.*12+$/)*3+t
54.times{|i|s["<QTWZo;MP[ngD@RS^k=GVUpaJ8XYdsAFE?CN7LK9IHl_`jh]reftbc"[i].ord-55]=b[i]}
s}

Çevrimiçi deneyin!

Sihirli dizeler yerine sihirli sayı dizileri içeren orijinal sürüm

->g,h{z=[]
a=[05,025,015,020,023,021,03,043,013,040,045,041,   032,025,054,043,0123,0152,0145,0134]
#PERMUTE
20.times{|i|r=12+i/12*8-i;z<<a.delete_at(g%r);g/=r}
c=1
19.times{|i|z[0..i].map{|j|j>z[i+1]&&c=!c}}
c||(z[19],z[18]=z[18],z[19])
#ROTATE
h+=h+(h%2048).to_s(2).sum%2
j=0
b="023451"
20.times{|i|r=2+i/12;b<<("%0*o"%[r,z[i]]*2)[h%r+i/19*j%3,r];j-=r/3*h;h/=r}
#DISPLAY
s=(t="...
"*3)+(?.*12+$/)*3+t
54.times{|i|s[
[5,26,29,32,35,56,
4,22,25,36,55,48, 
13,9,27,28,39,52,
6,16,31,30,57,42,
19,1,33,34,45,60,
10,15,14,8,12,23,0,21,20,2,18,17,
53,40,41,51,49,38,59,46,47,61,43,44][i]]=b[i]}
s}

Çevrimiçi deneyin!

Şu anki biçiminde, iki tamsayı girilen ve izin verilmiş gibi görünen anonim bir işlev: "alternatif bir giriş yöntemi seçebilirsiniz." Birincisi 0 ila aralığı arasındaki permütasyon 12!*8!/2 - 1ve ikincisi 0 ila aralığı arasındaki parçaların oryantasyonu 2**11 * 3*7 - 1. Çözülmüş durumdaki çıktı aşağıdaki dizedir:

000
000
000
222333444555
222333444555
222333444555
111
111
111

Daha fazla golf

Çıktı biçimini aşağıdaki şekle ayarlayarak kaydedilecek yaklaşık 10 karakter daha vardır. Ancak bu, okunabilirliği azaltacaktır, bu yüzden şu anda yapmayacağım

      #########
      #########
      #########
#########
#########
#########

açıklama

permutasyon

Dahili olarak, çözülen durum dizideki sekizli sayı dizisi ile temsil edilir a. Giriş gnumaraları ile ayrılmıştır 12..1modülü almak ve bir kenar kaldırmak için kullanılmakta olan ave içine yerleştirin z. Bu yapıldıktan sonra, yalnızca köşeler kalır a, bu nedenle bir köşeyi çıkarmak ve yerleştirmek için kullanılan modülün gbulunduğu sayılara bölünür .8..1az

Son iki köşenin sırasını belirlemek için yeterli bilgi olmadığından, değeri gonlara ulaştığında sıfıra bölünmüş olacaktır, bu yüzden her zaman zorada orijinal sırayla eklenecektir . Daha sonra toplam permütasyonun çift mi yoksa tek mi olduğunu belirlemek için bir kontrol yapılır ve gerekirse son iki köşe, permütasyonu yapmak için değiştirilir.

Oryantasyon

Bir köşenin veya kenarın, çözülmüş konumunda değilse doğru yönde olup olmadığına karar vermenin çeşitli farklı yolları vardır. Bu cevabın amacı için, bir köşe gösteriliyorsa 0veya 1üst veya alt yüzünde doğru yönünde düşünülür . Bu nedenle, üst veya alt yüzün döndürülmesi köşe yönünü değiştirmez. Diğer yüzleri döndürmek yönü değiştirir, ancak toplam parite toplamı değişmeden kalır. Kenarlar, bir 2veya 4ön / arka veya a 3veya 5sola / sağa gösteriliyorsa doğru yönde düşünülür . Bu, üst veya alt kısmın çeyrek tur döndürülmesinin dört kenarı çevirdiği, ancak diğer yüzlerin dönüşünün kapak durumunu değiştirmediği anlamına gelir.

Giriş, ilk kenar ve son köşe dışındaki herkes için açık bilgiler içerir. En az önemli olan 11 bit h%2048toplanır ve modül, birinci kenarın yönünü belirlemek için kullanılır. hkendisine eklenerek 2 ile çarpılır ve birinci kenarın oryantasyon değeri en az anlamlı bit olarak eklenir. Son köşenin yönü, diğer köşelerin yönünü kademeli olarak çıkararak bulunur j. En son köşe için (burada i/19= 1) değeri ( sıfıra düşürülecek ) değerine j%3eklenir hve bu son köşenin yönünü belirler.

Dize b, yüzlerin merkezleri için metinle önceden başlatılır. parçaların yönünü belirlemek için kullanılan modüller ile on iki kez, sonra sekiz kez hbölünür . Her durumda, içindeki sayı uygun sayıda basamak (2 veya 3) olan bir dizeye dönüştürülür ve sonra dize çoğaltılır. Bu, modulo tarafından bulunan basamakların dizine eklenerek dizeden çıkartılacağı ve23zb

Görüntüle

Son olarak, ham etiketler dizin tablosundaki sihirli sayılar kullanılarak bdaha insan tarafından okunabilir bir biçime kopyalanır s.

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.