2x2x2のルービックキューブを少し動かす。これがもともとの問題。
最初何をどうしていいものかサッパリ。悩んでいるとぼんやりみえてくるもので、
展開図を持たせて(右、左、前、後、上、下)の回転、時計まわりを実装。
移動前と移動後の点の位置、間違えやすいので展開図から取得させる。問題はクリア
次にせっかく作ったので解きたくなる。
ランダム移動を実装して、何面揃っているか計算させる。6面揃った所で終了
なかなか解けないので高速化
1移動前後の点だけをリスト化
2展開図をリストから文字列一つに
100万回移動が17秒ぐらい
サブ関数を上にもってきて展開、
ループを減らすなど調整して12秒台
これで1億回やっても解けない
3x3x3のルービックキューブを購入
ネットの解法をみながら解く。解法のアルゴリズム進化してる?
2x2x2の解法アルゴリズムをプログラム化して行った所、一面もクリアできない。
おかしい?移動の展開図を確認してみると左まわりのバグが判明。修正後、ランダム1000万回前後ぐらいで解けました。
作りかけの解法アルゴリズムを取って終了です。
最初何をどうしていいものかサッパリ。悩んでいるとぼんやりみえてくるもので、
展開図を持たせて(右、左、前、後、上、下)の回転、時計まわりを実装。
移動前と移動後の点の位置、間違えやすいので展開図から取得させる。問題はクリア
次にせっかく作ったので解きたくなる。
ランダム移動を実装して、何面揃っているか計算させる。6面揃った所で終了
なかなか解けないので高速化
1移動前後の点だけをリスト化
2展開図をリストから文字列一つに
100万回移動が17秒ぐらい
サブ関数を上にもってきて展開、
ループを減らすなど調整して12秒台
これで1億回やっても解けない
3x3x3のルービックキューブを購入
ネットの解法をみながら解く。解法のアルゴリズム進化してる?
2x2x2の解法アルゴリズムをプログラム化して行った所、一面もクリアできない。
おかしい?移動の展開図を確認してみると左まわりのバグが判明。修正後、ランダム1000万回前後ぐらいで解けました。
作りかけの解法アルゴリズムを取って終了です。
import copy import random import time class Cube: def __init__(self): self.bd="" self.cp="" self.bf=["" for i in range(8)] self.af=["" for i in range(8)] self.bd+=" BB " self.bd+=" BB " self.bd+=" UU " self.bd+=" UU " self.bd+="LLFFRR" self.bd+="LLFFRR" self.bd+=" DD " self.bd+=" DD " self.mv=[] self.set_mv() def countface(self): r=0 if self.bd[2]==self.bd[3]==self.bd[8]==self.bd[9]:r+=1 if self.bd[14]==self.bd[15]==self.bd[20]==self.bd[21]:r+=1 if self.bd[26]==self.bd[27]==self.bd[32]==self.bd[33]:r+=1 if self.bd[38]==self.bd[39]==self.bd[44]==self.bd[45]:r+=1 if r==0:return 0 if self.bd[24]==self.bd[25]==self.bd[30]==self.bd[31]:r+=1 if self.bd[28]==self.bd[29]==self.bd[34]==self.bd[35]:r+=1 return r def write(self): for i in range(8): print(self.bd[i*6:i*6+6]) def search(self,arr,s): for x in range(6): for y in range(8): if arr[y][x]==s:return (x,y) def movedataset(self): arr=["1","2","3","4","5","6","7","8","9","A","B","C"] t=[] for s in arr: x,y=self.search(self.bf,s) tx,ty=self.search(self.af,s) t.append((x+y*6,tx+ty*6)) self.mv.append(t) def turn(self,rt): self.cp=self.bd for p in self.mv[rt]: p0,p1=p self.move(p0,p1) self.bd=self.cp def move(self,p,p1): self.cp=self.cp[:p1]+self.bd[p]+self.cp[p1+1:] def randmove(self): rt=random.randint(0,5) self.turn(rt) def set_mv(self): #r self.bf[0]=" .1 " self.bf[1]=" .2 " self.bf[2]=" .3 " self.bf[3]=" .4 " self.bf[4]="...59A" self.bf[5]="...6CB" self.bf[6]=" .7 " self.bf[7]=" .8 " self.af[0]=" .3 " self.af[1]=" .4 " self.af[2]=" .5 " self.af[3]=" .6 " self.af[4]="...7C9" self.af[5]="...8BA" self.af[6]=" .1 " self.af[7]=" .2 " self.movedataset() #l self.bf[0]=" 1. " self.bf[1]=" 2. " self.bf[2]=" 3. " self.bf[3]=" 4. " self.bf[4]="9A5..." self.bf[5]="CB6..." self.bf[6]=" 7. " self.bf[7]=" 8. " self.af[0]=" 7. " self.af[1]=" 8. " self.af[2]=" 1. " self.af[3]=" 2. " self.af[4]="C93..." self.af[5]="BA4..." self.af[6]=" 5. " self.af[7]=" 6. " self.movedataset() #f self.bf[0]=" .. " self.bf[1]=" .. " self.bf[2]=" .. " self.bf[3]=" 12 " self.bf[4]=".89A3." self.bf[5]=".7CB4." self.bf[6]=" 65 " self.bf[7]=" .. " self.af[0]=" .. " self.af[1]=" .. " self.af[2]=" .. " self.af[3]=" 78 " self.af[4]=".6C91." self.af[5]=".5BA2." self.af[6]=" 43 " self.af[7]=" .. " self.movedataset() #b self.bf[0]=" 9A " self.bf[1]=" CB " self.bf[2]=" 12 " self.bf[3]=" .. " self.bf[4]="8....3" self.bf[5]="7....4" self.bf[6]=" .. " self.bf[7]=" 65 " self.af[0]=" C9 " self.af[1]=" BA " self.af[2]=" 34 " self.af[3]=" .. " self.af[4]="2....5" self.af[5]="1....6" self.af[6]=" .. " self.af[7]=" 87 " self.movedataset() #u self.bf[0]=" .. " self.bf[1]=" 12 " self.bf[2]=" 9A " self.bf[3]=" CB " self.bf[4]="876543" self.bf[5]="......" self.bf[6]=" .. " self.bf[7]=" .. " self.af[0]=" .. " self.af[1]=" 78 " self.af[2]=" C9 " self.af[3]=" BA " self.af[4]="654321" self.af[5]="......" self.af[6]=" .. " self.af[7]=" .. " self.movedataset() #d self.bf[0]=" 87 " self.bf[1]=" .. " self.bf[2]=" .. " self.bf[3]=" .. " self.bf[4]="......" self.bf[5]="123456" self.bf[6]=" 9A " self.bf[7]=" CB " self.af[0]=" 65 " self.af[1]=" .. " self.af[2]=" .. " self.af[3]=" .. " self.af[4]="......" self.af[5]="781234" self.af[6]=" C9 " self.af[7]=" BA " self.movedataset() q=Cube() for i in range(10000): q.randmove() c=0 st=time.time() while True: c+=1 if c%1000000==0: print(str(c)+":"+str(time.time()-st)) st=time.time() q.randmove() if q.countface()>=3: print(c) q.write() print("") if q.countface()==6: break