Rubik Küp Mücadelesi


21

Göreviniz bir Rubik Küpünü karıştırmak için kullanılabilecek rastgele bir hamle dizisi oluşturmaktır. Böyle bir karışma tam 25 hamleden oluşur. Her hareket UDRLFBisteğe bağlı olarak son eklerden biri tarafından takip edilen harflerden oluşur '2.

Bu nota Singmaster nota adı verilir. UDRLFB6 yüzden birini temsil eder ve isteğe bağlı sonek '2dönme açısını temsil eder. Bu bilgi, görevi çözmek için hiçbir şekilde gerekli değildir.

Mücadelelerin 'iyi kalitede' olduğundan emin olmak için, aşağıdaki iki kural uygulanmalıdır:

  • İki ardışık hamle aynı harfe sahip olmamalıdır. Bu ardışık hamle yasaklayan UU, DD, RR, LL, FFve BBve benzeri opsiyonel ekleri kullanan tüm bunların kombinasyonları U2Uveya U'U'.

    Bu hareket çiftleri yasaklanmıştır, çünkü kolayca 1 veya 0 harekete düşebilirler. U2Uaynı etkiye sahiptir U', R'Raynı etkiye .

  • Ardışık üç hamle aynı harf grubundan olmamalıdır. Mektup gruplarıdır UD, RLve FB. Bu kural ayrıca ardışık hamle yasaklayan UDU, DUD, RLR, LRL, FBF, BFBve benzeri opsiyonel ekleri kullanarak tüm bunların kombinasyonları U2DU, RL'Rya B2FB'.

    Gruplar yüzleri hareket eksenlerine göre sıralar. Uve Daynı grup içindedir, çünkü her ikisi de aynı ekseni etrafında döndürür. Dolayısıyla bir Uhareket Dyüzün parçalarını etkilemez ve bir Dhareket Uyüzün parçalarını etkilemez . Bu nedenle, iki hareket değiştirilebiliyor, UDUaynı etkiye sahip UUDve bu azaltılabiliyor U2D.

Meydan okuma

Bir rastgele karıştırmak üreten bir script veya fonksiyon yazın. Giriş yok. Komut / işlev, 25 hareketi, ayırmadan veya bir boşlukla ayırarak yazdırmak veya karşılık gelen dizeyi döndürmek zorundadır.

Programınız, yukarıdaki kuralları karşılayan her bir karışıklığı yaratabilmek zorundadır. Tabii ki, rastgele sayı üretecinin gerçek rastgele olduğunu ve sahte rastgele olmadığını varsayarsak.

Bu kod golfü. En kısa kod ( bayt cinsinden sayılan ) kazanır.

Örnek çıktılar:

Komut dosyası / işlevi 3 kez çağırmak, şöyle bir şey yazdırmalı / döndürmelidir:

R'B2R2F2R2FB'R2DR2ULFB2RB'U2B'FL'BR'U'RB'
U'DBR'B2U'B'U'RUF'B'RDR2U'B'LR'B'F2D2UF2L'
BR2F'B'R'D'R'U2B'F2D2R'F2D'F'D2R2B'L2R'UB'R2L'D

Hareketleri her biri bir boşlukla ayırırsanız:

R2 L' F2 U2 D' R2 L2 F L' D2 U R B D' U2 L B2 L U B2 D U2 R' D2 U'
B R D2 F U2 B' R2 F2 B' U' L' R2 B U2 R' D B' F' U2 R' B' L R D2 R2
B2 R2 U D' B R D' R L2 D2 L2 R B2 F U' F2 B2 U' F U' D F R2 U2 B'

Tüm bu çıktıların isteğe bağlı ekler nedeniyle 25 hareketten oluştuğunu, ancak farklı uzunlukları bulunduğunu unutmayın. Sonuncusu olarak ya 2da 'soneki kullanıldığında boşluk yazdırılamaz . Yazdırabilmek zorunda L2UR2F'R'U2ya L2 U R2 F' R' U2. L2U R2F'R'U2Müsade edilmez.


Şunu mu demek istedin UR 2izin yok mu? izin U R2 verilmelidir , bence, hareketler arasındaki boşluklar anlamlı olduğu için.
mbomb007

@ mbomb007 Ben gibi şeyler demek L2U R2F'R'U2. Uisteğe bağlı bir sonek yok ve bu nedenle bir boşluk olmamalıdır. Bir boşluk, isteğe bağlı sonek için bir yedek olmamalıdır.
Jakube

Ya her hareket arasında boşluk varsa? U F2 L D2 R'...Mesela çıktı alabilir miyiz ? Bu durumda, kuralınıza göre iyi olması gerektiğini düşündüğüm fazladan bir boşluk yok.
mbomb007

@ mbomb007 Evet, açıklamaya ekleyeceğim.
Jakube

Mektuptan önceki 2 değil mi? oO
Oliver Ni

Yanıtlar:


6

CJam, 47 45 bayt

Bu çözüm, şu ana kadar yayınlananlardan farklı bir yaklaşım kullanıyor. Mevcut hareket listesini oluşturmak ve her yinelemede rastgele birini seçmek, CJam'ın özlü liste işlemlerinden faydalanır. Değiştiriciler basitçe bağımsız olarak üretilir.

Çevrimiçi deneyin.

{BA^2/6,_B-?A:B-mr0=:A"UDRLFB"=3mr[L2'']=}25*

açıklama

{               "Loop...";
  BA^2/           "If the two previous moves were not from the same group, ...";
  6,              "... then produce the available move list [0 1 2 3 4 5], ...";
  _B-             "... else produce the available move list [0 1 2 3 4 5] with
                   the second previous move removed";
  ?
  A:B             "Save the previous move as the second previous move";
  -               "Remove the previous move from the available move list";
  mr0=            "Randomly select an available move";
  :A              "Save this move as the previous move";
  "UDRLFB"=       "Map this move to its character (implicitly printed)";
  3mr[L2'']=      "Randomly select a modifier (implicitly printed)";
}25*            "... 25 times";

9

C 129

f(){int i,n,m,r,s,t;for(i=26;i--;i<25&&printf("%c%c","URFDLB"[s%6],"'2"[r%3])){for(n=m,t=1;t;t=m*n==9)m=(r=rand()%15)/3+1;s+=m;}}

İç halka , modulo 6'ya eklenip alındığında, küpün aynı tarafında iki ardışık hareket olmamasını sağlayan maralıkta bir değer oluşturur . Eski değer depolanan ve test olmasını sağlar bu değer = 3 (karşılıklı yüzleri arka arkaya iki kez alınamaz böylece., Not dize yüzlerin sırası) arka arkaya iki kez üretilen asla1..5smnm*n==9m

En önemli bir bölümü rolan eki (karar vermek için kullanılır ', 2sonunda boş karakter yararlanarak, kullanımına veya null) "'2".

Dış döngü 26 kez çalışır. İlk kez, Uasla seçilemez, bu yüzden printfilk yineleme için bastırılır.

Test programında kodlanmamış kod

Netlik için her hareket arasında ungolfed kod koyar bir boşluk (golfed kod bir bayt kurtarmak için bunu dikkate almaz.) Ayrıca golfed kod taşındıktan tarafından noktalı virgül kaydeder printfiçinde forparantez.

f(){
  int i,n,m,r,s,t;
  for(i=26;i--;){
    for(n=m,t=1;t;t=m*n==9)m=(r=rand()%15)/3+1;
    s+=m;
    i<25&&printf("%c%c ","URFDLB"[s%6],"'2"[r%3]);
  }
}

main(){
  int j;
  srand(time(0));
  for(j=0;j<5;j++)f(), puts("");
}

Tipik çıkış

U' B D2 B' R' L F' D2 B D2 B2 R' B2 U D2 F' R U R' L B' L R2 B2 F'
U B U B F L2 D2 B' U' L B L R' D B U' D R D' B' F2 D' B D R
L D F2 B2 R' U F B' D2 L U R' L' U2 F' R F D U2 B L' B' U L2 F'
R2 B' F2 R2 L2 F' U2 L U' B' F R' D' F2 D F' L2 U2 R' D' B2 D F R2 L'
U2 F2 B2 D' F D F R L2 U' B D2 L' R D R F2 R' F2 U2 D R' D2 L F2



4

Pyth, 65 66

Pyth'ta hiç golf oynamam, belki bir ya da iki program yazdım. Bu temelde @ steveverrill'in Pyth'e çevirdiği çözümdür. İyileştirme önerileri açıktır.

Güncelleme: karıştırmak için 1 bayt da eklendi U. Belki C çözümü işe yaraması için tanımsız davranışa güveniyordur ...

=YO6V25JZK1WK=GO15=Z/+3G3=Kq9*ZJ)~YZpd+@"URFDLB"%Y6?@"'2"%G3>2%G3k

Bunun daha az atama ile yapılması gerektiğine inanıyorum, ancak algoritmayı çok değiştirmem gerekiyor. (Şey, deneyebilir.)

İşte C kodunu temel alan bir açıklama:

=YO6           s = random.choice(range(6))
V25            for i in range(25):
  JZ               n = m
  K1               t = 1
  WK               while t:
    =GO15              r = random.choice(range(15))
    =Z/+3G3            m = (r + 3) / 3
    =Kq9*ZJ            t = 9 == m * n
  )
  ~YZ              s += m
  pd               print(..., end = " ")
  +                ... + ...
  @"URFDLB"%Y6     "URFDLB"[s % 6]
  ?@"'2"%G3>2%G3k  "'2"[G % 3] if 2 > G % 3 else ""

Değişkenleri Yve Z. Z0 ile önceden başlatılır, böylece ilk 3 karakteri kaydedersiniz.
Jakube

@Jakube Ama sonra sete ihtiyacım n = mdemek olmalı ki, (3 açıklama hattı) n = 0sırayla gerektirecektir ilk defa, Y0. olmak
PurkkaKoodari

Yboş bir liste ile önceden başlatılmış []. Ve nilk yinelemedeki hususların değerini düşünmüyorum .
Jakube

BTW, kodunuz ile başlayan karışıklıklar üretmez U.
Jakube

@Jakube teşekkürler, düzeltildi.
PurkkaKoodari

4

JavaScript (ES6) 175 178 204

Düzenleme 3 yollu bayt değiştirerek kodu ve 2 değiştirerek, daha az 1 bayt sayılır (hariç F=)

Tekrarlamalardan kaçınma kodu @stevemiller'den alınmıştır. Mektup gruplarını yönetme şekli daha da iyi, ama onu çalmayacağım.

Bonus: İsteğe bağlı olarak hamle sayısını belirleyebilirsiniz.

(n=25,R=n=>Math.random()*n|0)=>(r=>{for(N=_=>'UDRLFB'[(r-=~R(5))%6],b=N(a=N(s=''));n;~(a+b+c).search('^([UD]*|[RL]*|[FB]*)$')?0:s+=(--n,a=b,b=c)+["","'",2][R(3)])c=N()})(0)||s

Daha az golf oynadı

(n = 25) => 
{
  R = n => Math.random()*n | 0;
  N = _ => 'UDRLFB'[(r += 1+R(5)) % 6];
  r = 0;
  b = N();
  a = N();
  for(s = '' ; n; )
     c = N(),
     ~(a+b+c).search('^([UD]*|[RL]*|[FB]*)$')
       ? 0
       : s += (--n, a=b, b=c) + ["","'",2][R(3)];
  return s
}

Ölçek

var F=
(n=25,R=n=>Math.random()*n|0)=>(r=>{for(N=_=>'UDRLFB'[(r-=~R(5))%6],b=N(a=N(s=''));n;~(a+b+c).search('^([UD]*|[RL]*|[FB]*)$')?0:s+=(--n,a=b,b=c)+["","'",2][R(3)])c=N()})(0)||s

function go() {
  console.log(F(+M.value))
}

go()
Moves <input type=number min=1 id=M value=25 max=999>
<button onclick='go()'>Test</button>


2

Javascript - 112

for(c=b=j=25,r=Math.random;j;c+b-5|c-m&&b-m?document.write("URFBLD"[j--,c=b,b=m]+" 2'"[0|r()*3]+" "):0)m=0|r()*6

2

Java 8, 189 183 bayt

v->{for(int i=26,n,m=0,r=0,s=0,t;i-->0;){for(n=m,t=1;t>0;t=m*n==9?1:0)m=(r=(int)(Math.random()*15))/3+1;s+=m;if(i<25)System.out.print("URFDLB".charAt(s%6)+(r%3<1?"'":r%3<2?"2":""));}}

Port @LevelRiverSt 'ın C cevap . Bazı şeyleri kendim denedim, ama bu sahip olduklarımdan daha kısaydı.

Çevrimiçi deneyin.



1

Clojure, 223 bayt

(let[R(range)F(fn[f p c](apply concat(filter f(partition-by p c))))](apply str(map str(take 25(F(fn[p](<(count p)3))(zipmap"UDLF""1122")(F(fn[p](=(count p)1))int(for[_ R](rand-nth"UDRLFB")))))(for[_ R](rand-nth[""\'\2])))))

Bu, "dizi -> bölümleme -> filtre -> concat" desenine büyük ölçüde dayanır, yüzlerin "yasadışı" dizilerini filtrelemek için kullanılır. Bu sekans daha sonra rastgele bir postfix ile birlikte (boş string dahil) string ile eşleştirilir.

Ungolfed başlangıç ​​noktası:

(->> (for[_(range)](rand-nth"UDRLFB"))
     (partition-by int)           ; "identity" would be the correct fn to use here
     (filter(fn[p](=(count p)1))) ; Only one identical value in partition
     (apply concat)
     (partition-by(zipmap"UDLF""1122")) ; R & B are in the implicit nil group
     (filter(fn[p](<(count p)3)))       ; Only 1 or 2 consecutive faces from a group
     (apply concat)
     (take 25))
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.