パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

Pythonで2x2x2のルービックキューブを解く

2018-06-13 | プログラムをマスター計画2020
2x2x2のルービックキューブを少し動かす。これがもともとの問題。

最初何をどうしていいものかサッパリ。悩んでいるとぼんやりみえてくるもので、
展開図を持たせて(右、左、前、後、上、下)の回転、時計まわりを実装。

移動前と移動後の点の位置、間違えやすいので展開図から取得させる。問題はクリア



次にせっかく作ったので解きたくなる。

ランダム移動を実装して、何面揃っているか計算させる。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


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。