Boşta Rubik küpümü etrafında döndürürken, oğlum çözüldü durumuna geri döndüğünü fark etti. İlk başta bunun bir çeşit vudu büyüsü olduğunu düşündüğünden eminim ama aynı hamle sırasını tekrarlamaya devam edersen her zaman orijinal durumuna geri döneceğini açıkladım. Sonuçta.
Elbette, çocukken, kendisi için denemek zorunda kaldı ve aldatıcı olacağını düşündüğü "rastgele" bir diziyi seçti. On defa tekrarladıktan sonra izini kaybetti ve kaç kez tekrar etmesi gerektiğini sordu. Kullandığı sırayı bilmeden ona bilmediğimi söyledim, ancak bunu bulmak için bir program yazabileceğimizi söyledim.
Sen devreye giriyorsun Bu benim, tabii ki. Olduğu could sadece kırbaç birşeyler ama kendi başına bunu yazın istiyorum. Yine de çok hızlı bir daktilo değildir, bu yüzden mümkün olan en kısa programa ihtiyacım var .
Amaç
Bir sıra sırası göz önüne alındığında, küpü orijinal durumuna döndürmek için yapılması gereken en az sayıda çıktı alın. Bu kod golf, yani en az bayt kazanıyor. Bir program veya işlev yazabilirsiniz ve diğer tüm varsayılan ayarlar uygulanır.
Giriş
Giriş, dize, liste veya dilinize uygun başka bir biçim olarak alınan bir hareketler dizisidir. Dize biçimindeyse, hareketler arasında bir ayırıcı (veya kullanmamak) kullanmaktan çekinmeyin.
Dikkatleri ile birlikte dikkate alınması gereken altı "temel" hareket vardır:
R - Turn the right face clockwise
L - Turn the left face clockwise
U - Turn the up (top) face clockwise
D - Turn the down (bottom) face clockwise
F - Turn the front face clockwise
B - Turn the back face clockwise
Ters çevrmeler '
, harften sonra bir ana işaret eklenerek gösterilir . Bu, o yüzü saatin tersi yönünde çevirdiğinizi, bu nedenle F'
ön yüzü saatin tersi yönünde çevirdiğinizi ve F F'
hemen orijinal durumuna döndüreceğinizi gösterir.
İlgilenenler için bu zorluk sınırlı sayıda Singmaster Notation kullanıyor . Ruwix'in güzel animasyonları var, eğer görmek istiyorsan.
Çıktı
Çıkış, giriş sırasının gerçekleştirilmesi gereken minimum sayıdır.
Örnekler
Input Output
FF' -> 1
R -> 4
RUR'U' -> 6
LLUUFFUURRUU -> 12
LUFFRDRBF -> 56
LF -> 105
UFFR'DBBRL' -> 120
FRBL -> 315
İşte Java ile yazılmış cevaplarınızı karşılaştırmak için (saf) bir çözücü. Aynı zamanda 2
çift hamle kabul eder (bu yüzden dördüncü durum eşittir L2U2F2U2R2U2
).
import java.util.ArrayList;
import java.util.List;
public class CycleCounter{
public static void main(String[] args){
int[] cube = new int[54];
for(int i=0;i<54;i++)
cube[i] = i;
String test = args.length > 0 ? args[0] : "RUR'U'";
List<Rotation> steps = parse(test);
System.out.println(steps.toString());
int count = 0;
do{
for(Rotation step : steps)
cube = step.getRotated(cube);
count++;
}while(!isSorted(cube));
System.out.println("Cycle length for " + test + " is " + count);
}
static List<Rotation> parse(String in){
List<Rotation> steps = new ArrayList<Rotation>();
for(char c : in.toUpperCase().toCharArray())
switch(c){
case 'R':steps.add(Rotation.R);break;
case 'L':steps.add(Rotation.L);break;
case 'U':steps.add(Rotation.U);break;
case 'D':steps.add(Rotation.D);break;
case 'F':steps.add(Rotation.F);break;
case 'B':steps.add(Rotation.B);break;
case '\'':
steps.add(steps.get(steps.size()-1));
case '2':
steps.add(steps.get(steps.size()-1));
break;
}
return steps;
}
static boolean isSorted(int[] in){for(int i=0;i<in.length-1;i++)if(in[i]>in[i+1])return false;return true;}
enum Rotation{
R(new int[]{-1,-1,42,-1,-1,39,-1,-1,36, -1,-1,2,-1,-1,5,-1,-1,8, 20,23,26,19,-1,25,18,21,24, -1,-1,11,-1,-1,14,-1,-1,17, 35,-1,-1,32,-1,-1,29,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1}),
L(new int[]{9,-1,-1,12,-1,-1,15,-1,-1, 27,-1,-1,30,-1,-1,33,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1, 44,-1,-1,41,-1,-1,38,-1,-1, -1,-1,6,-1,-1,3,-1,-1,0, 47,50,53,46,-1,52,45,48,51}),
U(new int[]{2,5,8,1,-1,7,0,3,6, 45,46,47,-1,-1,-1,-1,-1,-1, 9,10,11,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1, 18,19,20,-1,-1,-1,-1,-1,-1, 36,37,38,-1,-1,-1,-1,-1,-1}),
D(new int[]{-1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,24,25,26, -1,-1,-1,-1,-1,-1,42,43,44, 29,32,35,28,-1,34,27,30,33, -1,-1,-1,-1,-1,-1,51,52,53, -1,-1,-1,-1,-1,-1,15,16,17}),
F(new int[]{-1,-1,-1,-1,-1,-1,18,21,24, 11,14,17,10,-1,16,9,12,15, 29,-1,-1,28,-1,-1,27,-1,-1, 47,50,53,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,8,-1,-1,7,-1,-1,6}),
B(new int[]{51,48,45,-1,-1,-1,-1,-1,-1, -1,-1,-1,-1,-1,-1,-1,-1,-1, -1,-1,0,-1,-1,1,-1,-1,2, -1,-1,-1,-1,-1,-1,26,23,20, 38,41,44,37,-1,43,36,39,42, 33,-1,-1,34,-1,-1,35,-1,-1});
private final int[] moves;
Rotation(int[] moves){
this.moves = moves;
}
public int[] getRotated(int[] cube){
int[] newCube = new int[54];
for(int i=0;i<54;i++)
if(moves[i]<0)
newCube[i] = cube[i];
else
newCube[moves[i]] = cube[i];
return newCube;
}
}
}