ルービックキューブを解く


38

ルービックキューブ(3 * 3 * 3)を妥当な時間内に解決する最短のプログラムを作成し、移動します(たとえば、マシン上で最大5秒、1000回未満の移動)。

入力の形式は次のとおりです。

UF UR UB UL DF DR DB DL FR FL BR BL UFR URB UBL ULF DRF DFL DLB DBR

(この特定の入力は、解決されたキューブを表します)。
最初の12個の2文字の文字列は、UF、UR、... BL位置のエッジ(U =上、F =前、R =右、B =後、L =左、D =下)であり、次の8 3文字の文字列は、UFR、URB、... DBR位置のコーナーです。

出力は、次の形式で一連の動きを示します。

D+ L2 U+ F+ D+ L+ D+ F+ U- F+

D1またはD +はD(下)面を時計回りに90度回転することを表し、L2はL面を180度回転し、U3またはU-はU面を反時計回りに90度回転することを表します。
文字は大文字と小文字を区別せず、スペースはオプションです。

たとえば、上記の出力は次の入力に対して正しいです。

RU LF UB DR DL BL UL FU BD RF BR FD LDF LBD FUL RFD UFR RDB UBL RBU

詳細については、Tomas Rokickiのキューブコンテストを参照してください。スコアリングは、通常のコードゴルフの問題のように、ファイルサイズによって直接行われます。オンラインテスターは、あまりにも含まれています。

参考までに、すでに書かれている最短のソリューションは、キューブコンテストの勝者のリストの最後のエントリです。


レイアウト形式の視覚化に苦労している人のために:

0-1 2-3 4-5 6-7 8-9 10-11 12-13 14-15 16-17 18-19 20-21 22-23 24-25-26 27-28-29 30-31-32 33-34-35 36-37-38 39-40-41 42-43-44 45-46-47
UF  UR  UB  UL  DF   DR    DB   DL    FR    FL     BR    BL     UFR      URB      UBL      ULF      DRF      DFL      DLB      DBR

Front:

                 +-------+-------+-------+
                /       /       /       /|
               /  30   /   4   /  27   / |
              +-------+-------+-------+  |
             /       /       /       /|28+
            /   6   /       /   2   / | /|
           +-------+-------+-------+  |/ |
          /       /       /       /|3 +  |
         /  33   /   0   /  24   / | /|21+
        +-------+-------+-------+  |/ | /|
        |       |       |       |26+  |/ |
        |  35   |   1   |   25  | /|  +  |
        |       |       |       |/ | /|47+
        +-------+-------+-------+  |/ | /
        |       |       |       |17+  |/
        |  18   |       |  16   | /|11+
        |       |       |       |/ | /
        +-------+-------+-------+  |/
        |       |       |       |37+
        |  40   |   9   |  38   | /
        |       |       |       |/
        +-------+-------+-------+


Hidden faces:

                 +-------+-------+-------+
                /|       |       |       |
               / |  31   |   5   |  29   |
              +  |       |       |       |
             /|32+-------+-------+-------+
            / | /|       |       |       |
           +  |/ |  22   |       |  20   |
          /|7 +  |       |       |       |
         / | /|23+-------+-------+-------+
        +  |/ | /|       |       |       |
        |34+  |/ |  44   |  13   |  46   |
        | /|  +  |       |       |       |
        |/ | /|43+-------+-------+-------+
        +  |/ | /       /       /       /
        |19+  |/  42   /  12   /  45   /
        | /|15+-------+-------+-------+
        |/ | /       /       /       /
        +  |/  14   /       /  10   /
        |41+-------+-------+-------+
        | /       /       /       /
        |/  39   /   8   /   36  /
        +-------+-------+-------+

3
C / C ++ / Java / Perl / Python以外の言語は受け入れられますか?
エゴールスクリプチュノフ

@EgorSkriptunoffここでは、はい、好きなものを使用してください。キューブ解決ライブラリは使用しないでください。
-aditsu

採点はどうですか?通常のコードゴルフスコアリング(プログラムのバイト数)または2004年のコンテストのような複雑なスコアリング?
エゴールスクリプチュノフ

2
@jdstankosky、図を追加しました。
ピーターテイラー

7
ステッカーをはがして移動させることはできますか?
Iszi

回答:


25

C ++-1123

今のところ誰も答えを出していないので、2004年のソリューションを簡素化してゴルフすることにしました。それは私が質問で言及した最も短いものにまだ大きく遅れています。

#include<iostream>
#include<vector>
#define G(i,x,y)for(int i=x;i^y;i++)
#define h(x)s[a[x]/q*q+(a[x]+j)%q-42]
#define B(x)D=x;E=O.substr(j*3,3);G(i,0,3)E+=F[5-F.find(E[2-i])];G(i,0,D.length())D[i]=E[F.find(D[i++])];m.push_back(D);
#define P(a,b)G(i,0,6)G(k,49,52){e[0]=F[i];e[1]=k;m.push_back(e);}G(j,0,24){B(a)B(b)}
#define T C();z=m.size();for(b=c;b;){d=s;G(i,o=w=1,4){w*=z;if(o)G(j,0,w)if(o){s=d;u=j;G(k,0,i){f=m[u%z];G(x,0,f.length()){a=M[F.find(f[x++])];G(i,0,f[x]-48)G(l,0,2){q=3-l;p=4*l;G(j,0,q){t=h(p+3);G(k,-3,0)h(p-k)=h(p-1-k);h(p)=t;}}}u/=z;}C();if(c<b){u=j;G(k,0,i){std::cout<<m[u%z];u/=z;}b=c;o=0;}}}}
std::string s,a,D,E,d,f,e="  ",S="UFURUBULDFDRDBDLFRFLBRBLUFRURBUBLULFDRFDFLDLBDBR",F="ULFBRD",M[]={"KHEB*0.,","KRTI0<8@","KDNS*;2=","IVXG/@7>","BGWP,>4:","QNWT2468"},O=S.substr(24)+"FDRFRUFULFLDRDBRBURUFRFDBDLBLUBURBRDLDFLFULUBLBD";std::vector<std::string>m;int
w,X=8,Y=16,o,c,u,b,z,p,q,t;void C(){c=0;G(i,X,Y)c+=s[i]!=S[i];}main(int
g,char**v){G(i,1,g)s+=v[i];P("U2F1R1L3U2L1R3F1U2","L3R1F3L1R3D2L3R1F3L1R3");T;Y=24;T;X=0;T;m.clear();P("R3D3R1D3R3D2R1L1D1L3D1L1D2L3","R1F3L3F1R3F3L1F1");G(I,5,9){Y=I*6;T}}

ランダムではありませんが、簡単に進むこともできません。最初にエッジを解決し、次にコーナーを解決します。各ステップで、最大4つのアルゴリズムと単純なフェイスターン(ランダムではなく)のさまざまな組み合わせを試行し、解決されたピースの数の改善を見つけ、解決されるまで繰り返します。すべてのキューブ位置に変換される、エッジに2つのアルゴリズム、コーナーに2つのアルゴリズムを使用します。

の出力例RU LF UB DR DL BL UL FU BD RF BR FD LDF LBD FUL RFD UFR RDB UBL RBU

L2F3B2F3B1U3F1B3R2F3B1U3F1B3D2F2L3D2L1U2B1L1R3U2R1L3B1U2R1U2L1F1B3U2B1F3L1U2L3R1D3L1R3B2L3R1D3L1R3L3R1D3L1R3B2L3R1D3L1R3B3F1D3B1F3R2B3F1D3B1F3U2F3L3R1B3L1R3U2L3R1B3L1R3F1D2F1L1R3D2R1L3F1D2F3L2U1B1F3L2F1B3U1L2R3L1F3R1L3U2R3L1F3R1L3U1F2U1L1R3F2R1L3U1F2U3L3U3L1U3L3U2L1R1U1R3U1R1U2R3F3U3F1U3F3U2F1B1U1B3U1B1U2B3L1B3R3B1L3B3R1B1B3D3B1D3B3D2B1F1D1F3D1F1D2F3R1F3L3F1R3F3L1F1R3B3R1B3R3B2R1L1B1L3B1L1B2L3R1D3L3D1R3D3L1D1B3D3B1D3B3D2B1F1D1F3D1F1D2F3U3R3U1R3U3R2U1D1R1D3R1D1R2D3

(234移動、ここでは0.3秒)


2
あなたは何を知っていますか...別の答えが数秒以内に投稿されました:)
aditsu

これはRubyソリューションよりも長いですが、「妥当な時間と動きの範囲内で」問題の基準によりよく適合すると思います。ただし、平均で50移動未満のソリューションを探しています。
プリモ

2
@primoありがとう:)私の元のコードは平均して50を超える動きでした。50未満の場合、より多くの(キューブ)アルゴリズムまたはThistlethwaiteの方法などの別のアプローチが必要だと思います。ただし、効率(移動回数)はゴルフとはあまり互換性がありません。とにかく、代替ソリューションについては、Tomas Rokickiのコンテストの勝者をチェックしてください。
aditsu

23

Python 1166バイト

読みやすくするために、かなりの量の空白が残されています。サイズは、この空白を削除した後に測定、およびに様々なインデントレベルを変更しているTabTab SpaceTab Tab、など私は、あまりにも大幅にパフォーマンスが影響を受けるすべてのゴルフを避けてきました。

T=[]
S=[0]*20,'QTRXadbhEIFJUVZYeijf',0
I='FBRLUD'

G=[(~i%8,i/8-4)for i in map(ord,'ouf|/[bPcU`Dkqbx-Y:(+=P4cyrh=I;-(:R6')]
R=range

def M(o,s,p):
 z=~p/2%-3;k=1
 for i,j in G[p::6]:i*=k;j*=k;o[i],o[j]=o[j]-z,o[i]+z;s[i],s[j]=s[j],s[i];k=-k

N=lambda p:sum([i<<i for i in R(4)for j in R(i)if p[j]<p[i]])

def H(i,t,s,n=0,d=()):
 if i>4:n=N(s[2-i::2]+s[7+i::2])*84+N(s[i&1::2])*6+divmod(N(s[8:]),24)[i&1]
 elif i>3:
  for j in s:l='UZifVYje'.find(j);t[l]=i;d+=(l-4,)[l<4:];n-=~i<<i;i+=l<4
  n+=N([t[j]^t[d[3]]for j in d])
 elif i>1:
  for j in s:n+=n+[j<'K',j in'QRab'][i&1]
 for j in t[13*i:][:11]:n+=j%(2+i)-n*~i
 return n

def P(i,m,t,s,l=''):
 for j in~-i,i:
  if T[j][H(j,t,s)]<m:return
 if~m<0:print l;return t,s
 for p in R(6):
  u=t[:];v=s[:]
  for n in 1,2,3:
   M(u,v,p);r=p<n%2*i or P(i,m+1,u,v,l+I[p]+`n`)
   if r>1:return r

s=raw_input().split()
o=[-(p[-1]in'UD')or p[0]in'RL'or p[1]in'UD'for p in s]
s=[chr(64+sum(1<<I.find(a)for a in x))for x in s]

for i in R(7):
 m=0;C={};T+=C,;x=[S]
 for j,k,d in x:
  h=H(i,j,k)
  for p in R(C.get(h,6)):
   C[h]=d;u=j[:];v=list(k)
   for n in i,0,i:M(u,v,p);x+=[(u[:],v[:],d-1)]*(p|1>n)
 if~i&1:
  while[]>d:d=P(i,m,o,s);m-=1
  o,s=d

サンプル使用法:

$ more in.dat
RU LF UB DR DL BL UL FU BD RF BR FD LDF LBD FUL RFD UFR RDB UBL RBU

$ pypy rubiks.py < in.dat
F3R1U3D3B1
F2R1F2R3F2U1R1L1
R2U3F2U3F2U1R2U3R2U1
F2L2B2R2U2L2D2L2F2

これは、Thistlethwaiteのアルゴリズムの実装であり、IDA *検索を使用して各ステップを解決します。ヒューリスティックテーブルはすべてオンザフライで計算する必要があるため、いくつかの妥協が行われ、通常、ヒューリスティックは2つ以上のかなり等しいサイズの部分に分割されます。これにより、ヒューリスティックテーブルの計算が何百倍も高速になり、検索フェーズは通常わずかに遅くなりますが、初期キューブの状態によっては大きくなる場合があります。

可変インデックス

  • T -メインのヒューリスティックテーブル。
  • S-解決されたキューブの状態。個々のピースはビットマスクとして保存され、文字として表されます。解決された方向ベクトルは、ゼロベクトルとして定義されます。
  • I -探索空間から削除される順番でのさまざまなねじれ。
  • G-ツイスト順列のグループ。スワップされるペアとして保存されます。圧縮された文字列の各バイトは、1つのペアをエンコードします。各ツイストには6つのスワップが必要です。3つはエッジサイクル用、3つはコーナーサイクル用です。圧縮された文字列には、印刷可能なASCII(char 32〜126)のみが含まれます。
  • M -Gで指定された移動を実行する関数
  • N -エンコードのために、4つのオブジェクトの順列を数値に変換します。
  • H -指定されたキューブ状態のヒューリスティック値を計算し、Tから移動深度をルックアップするために使用されます。
  • P -アルゴリズムの単一フェーズの単一の深さで検索を実行します。
  • s -入力キューブの順列状態。
  • o -入力キューブの方向ベクトル。

性能

Tomas Rokickiのデータセットを使用して、このスクリプトは平均472ms(i5-3330 CPU @ 3.0 Ghz、PyPy 1.9.0)で、1解決あたり平均16.02ツイスト(最大35)でした。最小解析時間は233msで、最大2.97秒、標準偏差0.488でした。コンテストのスコアガイドラインを使用すると(空白はカウントされず、キーワードと識別子は870の長さで1バイトとしてカウントされます)、全体のスコアは13,549になります。

最後の46のケース(ランダムな状態)では、平均721ミリ秒で、1回の解決あたり平均30.83のツイストがありました。


Thistlethwaiteのアルゴリズムに関する注意

Thistlethwaiteのアルゴリズムの実装を試みたいと思う人のために、ここに簡単な説明があります。

このアルゴリズムは、非常に単純なソリューションスペース削減の原則に基づいて機能します。つまり、キューブを解くためにツイストのサブセットが不要な状態にキューブを縮小し、小さな解空間に縮小し、残りのツイストのみを使用して残りを解決します。

Thistlethwaiteはもともと提案します<L,R,F,B,U,D><L,R,F,B,U2,D2><L,R,F2,B2,U2,D2><L2,R2,F2,B2,U2,D2>。ただし、入力形式を考えると、最初に<L,R,F2,B2,U,D>(4分の1回転FまたはB)に減らしてから、<L2,R2,F2,B2,U,D>最後に半回転状態に到達する前に減らす方が簡単だと思います。この理由を正確に説明する代わりに、各州の基準を定義した後に明らかになると思います。

<L,R,F,B,U,D><L,R,F2,B2,U,D>

解消するためにFBターンを四半期、唯一のエッジが正しい向きにする必要があります。ジル・ルーは、彼のサイトで「正しい」方向と「間違った」方向が何であるかを非常によく説明しているので、説明は彼に任せます。しかし、基本的に(そして、これがこの入力形式が非常に説得力がFあり、B除去される理由です)、エッジキュービーは次の正規表現に一致する場合、正しい向きになります[^RL][^UD]。通常、正しい方向はで示され、0間違った方向はで示され1ます。基本的にUDステッカーは、面RL顔、またはany UまたはDedge cubiesの端に表示されない場合があります。Fまたは、B クォーターツイスト。

<L,R,F2,B2,U,D><L2,R2,F2,B2,U,D>

ここに2つの基準。まず、すべてのコーナーを正しく配向させる必要があり、そして第二に、中間層cubies用のそれぞれは、( 、FRFLBRBL中間層のどこかでなければなりません。角の向きは、入力形式(最初のUまたはの位置)を指定すると非常に簡単に定義されますD。たとえば、URBオリエンテーション0(正しい向き)、LDFオリエンテーション1、オリエンテーションをLFU持ってい2ます。

<L2,R2,F2,B2,U,D><L2,R2,F2,B2,U2,D2>

ここでの基準は次のとおりです。各顔には、その顔のステッカー、またはその反対側の顔のステッカーのみを含めることができます。例えば、上のU顔だけが存在してもよいUし、Dステッカー、上R面のみが存在し得るRLステッカーは、上のF顔だけが存在してもよいFし、Bその他、ステッカーこれを保証する最も簡単な方法は、各エッジ部分がであるかどうかを確認することですその「スライス」、および「軌道」の各コーナーピース。さらに、エッジコーナーパリティにも注意を払う必要があります。ただし、コーナーパリティのみをチェックすると、エッジパリティも保証されます。逆も同様です。

ねじれが方向に与える影響

UそしてDねじれは、エッジの向き、またコーナーの向きでもない影響を与えます。ピースは、方向ベクトルを更新せずに直接交換できます。

RそしてLねじれは、エッジの向きに影響を与えませんが、コーナーの向きに影響を及ぼします。サイクルをどのように定義するかに応じて、コーナーの向きの変更は+1, +2, +1, +2またはであり+2, +1, +2, +1、すべてモジュロ3です。ことを注意R2してL2とねじれが、コーナーの向きに影響を与えません+1+2ゼロを法では3、などです+2+1

FそしてB、エッジの向きとコーナーの向きの両方に影響を与えます。エッジ方向となっ+1, +1, +1, +1(MOD 2)、およびコーナーの向きと同じであるRL。なお、F2及びB2エッジの向き、またコーナーの向きでもない影響を与えます。


すばらしい記事。Kociembaのアルゴリズムについて聞いたことがありますか?
マイル

私が持っています。原則として、4つのフェーズの代わりに2つのフェーズのみを使用することを除いて、同じアルゴリズムです<L,R,F,B,U,D>-> <L2,R2,F2,B2,U,D>-> <I>。キューブを解くには最大29回のツイストが必要です(Thistlethwaiteの場合は52回ではありません)が、非常に大きなルックアップテーブルも必要です。
プリモ

@ P0W入力形式は少しわかりにくいですが、エラーがあるかもしれません。ソリューションで結果を検証したすべてのケース。
プリモ

@primoもしあれば、ゴルフ以外のコードへのリンクを公開してもいいですか?
ビロウ

12

ルビー、742文字

r=->y{y.split.map{|x|[*x.chars]}}
G=r['UF UR UB UL DF DR DB DL FR FL BR BL UFR URB UBL ULF DRF DFL DLB DBR']
o=r[gets]
x=[];[[%w{U UU UUU L LL LLL}+D=%w{D DD DDD},0],[%w{FDFFF RFDFFFRRR}+D,12],[%w{DDDRRRDRDFDDDFFF DLDDDLLLDDDFFFDF}+D,8],[%w{DFLDLLLDDDFFF RDUUUFDUUULDUUUBDUUU}+D,4],[%w{LDDDRRRDLLLDDDRD RRRDLDDDRDLLLDDD LFFFLLLFLFFFLLLF},16]].map{|q,y|x+=[*y..y+3]
3.times{q.map{|e|q|=[e.tr('LFRB','FRBL')]}}
w=->u{x.count{|t|u[t]!=G[t]}}
s=w[o]
(c=(0..rand(12)).map{q.sample}*''
z=o
c.chars{|m|z="=$'*:036\".?BOHKVGRWZ!$@*-0C69<4(E\\INQTMX!$'B-03<9*?6EHYLQPUZ!9'*-?360<$BSFKN[TWJ$'*!-0369<?BHKNEQTWZ!$'*6-039<?BEHKNTWZQ"[20*('FBLRUD'=~/#{m}/),20].bytes.map{|e|z[e/3-11].rotate e%3}}
t=w[z]
(c.chars{|e|$><<e<<'1 '};o=z;s=t)if s>t
)until s<1}

上記のルビーコードはまだ完全にはゴルフされていません。コードをさらに改善する可能性はまだあります(ただし、スターターとしてはすでに十分です)。

レイヤーごとにキューブを解決しますが、特定のアルゴリズムは使用せず、代わりにキューブが解決されるまでランダムな一連の動きを実行します。

確率的性質のため、キューブを解くのに5秒以上かかる場合があり、まれに1000回以上移動することもあります。

出力例(入力 'RU LF UB DR DL BL UL FU BD RF BR FD LDF LBD FUL RFD UFR RDB UBL RBU')は757移動です:

F1 R1 R1 F1 F1 F1 R1 R1 R1 L1 L1 L1 F1 D1 L1 L1 D1 D1 D1 D1 L1 B1 D1 
B1 B1 B1 L1 L1 L1 F1 D1 F1 F1 F1 L1 D1 L1 L1 L1 B1 D1 B1 B1 B1 R1 D1 
R1 R1 R1 L1 B1 D1 B1 B1 B1 L1 L1 L1 D1 D1 B1 D1 B1 B1 B1 B1 D1 B1 B1 
B1 L1 D1 L1 L1 L1 D1 D1 D1 D1 D1 R1 D1 R1 R1 R1 R1 F1 D1 F1 F1 F1 R1 
R1 R1 R1 D1 R1 R1 R1 F1 L1 D1 L1 L1 L1 F1 F1 F1 D1 D1 D1 D1 L1 D1 L1 
L1 L1 F1 L1 D1 L1 L1 L1 F1 F1 F1 D1 D1 L1 D1 L1 L1 L1 D1 L1 D1 L1 L1 
L1 L1 D1 L1 L1 L1 D1 R1 D1 D1 D1 R1 R1 R1 D1 D1 D1 B1 B1 B1 D1 B1 D1 
L1 D1 D1 D1 L1 L1 L1 D1 D1 D1 F1 F1 F1 D1 F1 D1 D1 D1 B1 B1 B1 D1 B1 
D1 R1 D1 D1 D1 R1 R1 R1 D1 D1 D1 B1 B1 B1 D1 B1 D1 R1 D1 D1 D1 R1 R1 
R1 D1 B1 D1 D1 D1 B1 B1 B1 D1 D1 D1 L1 L1 L1 D1 L1 D1 B1 D1 D1 D1 B1 
B1 B1 D1 D1 D1 L1 L1 L1 D1 L1 D1 D1 F1 D1 D1 D1 F1 F1 F1 D1 D1 D1 R1 
R1 R1 D1 R1 D1 D1 D1 R1 R1 R1 D1 R1 D1 F1 D1 D1 D1 F1 F1 F1 D1 B1 D1 
D1 D1 B1 B1 B1 D1 D1 D1 L1 L1 L1 D1 L1 D1 D1 D1 F1 F1 F1 D1 F1 D1 L1 
D1 D1 D1 L1 L1 L1 D1 D1 D1 D1 D1 D1 F1 F1 F1 D1 F1 D1 L1 D1 D1 D1 L1 
L1 L1 D1 D1 D1 F1 F1 F1 D1 F1 D1 L1 D1 D1 D1 L1 L1 L1 D1 F1 D1 D1 D1 
F1 F1 F1 D1 D1 D1 R1 R1 R1 D1 R1 D1 D1 D1 F1 F1 F1 D1 F1 D1 L1 D1 D1 
D1 L1 L1 L1 D1 D1 D1 F1 F1 F1 D1 F1 D1 L1 D1 D1 D1 L1 L1 L1 D1 D1 D1 
D1 D1 F1 F1 F1 D1 F1 D1 L1 D1 D1 D1 L1 L1 L1 D1 D1 D1 D1 D1 D1 R1 F1 
D1 F1 F1 F1 D1 D1 D1 R1 R1 R1 D1 F1 L1 D1 L1 L1 L1 D1 D1 D1 F1 F1 F1 
D1 B1 R1 D1 R1 R1 R1 D1 D1 D1 B1 B1 B1 D1 B1 R1 D1 R1 R1 R1 D1 D1 D1 
B1 B1 B1 D1 D1 D1 D1 B1 R1 D1 R1 R1 R1 D1 D1 D1 B1 B1 B1 D1 D1 D1 D1 
D1 D1 B1 B1 B1 D1 F1 D1 D1 D1 B1 D1 F1 F1 F1 D1 D1 D1 R1 R1 R1 D1 L1 
D1 D1 D1 R1 D1 L1 L1 L1 D1 D1 D1 B1 D1 D1 D1 F1 F1 F1 D1 B1 B1 B1 D1 
D1 D1 F1 D1 B1 B1 B1 D1 F1 D1 D1 D1 B1 D1 F1 F1 F1 D1 D1 D1 L1 D1 D1 
D1 R1 R1 R1 D1 L1 L1 L1 D1 D1 D1 R1 D1 F1 R1 R1 R1 F1 F1 F1 R1 F1 R1 
R1 R1 F1 F1 F1 R1 R1 R1 R1 D1 L1 D1 D1 D1 R1 D1 L1 L1 L1 D1 D1 D1 B1 
B1 B1 D1 F1 D1 D1 D1 B1 D1 F1 F1 F1 D1 D1 D1 F1 R1 R1 R1 F1 F1 F1 R1 
F1 R1 R1 R1 F1 F1 F1 R1 F1 D1 D1 D1 B1 B1 B1 D1 F1 F1 F1 D1 D1 D1 B1 
D1 F1 R1 R1 R1 F1 F1 F1 R1 F1 R1 R1 R1 F1 F1 F1 R1 F1 F1 F1 D1 B1 D1 
D1 D1 F1 D1 B1 B1 B1 D1 D1 D1 R1 D1 D1 D1 L1 L1 L1 D1 R1 R1 R1 D1 D1 
D1 L1 D1 R1 R1 R1 D1 L1 D1 D1 D1 R1 D1 L1 L1 L1 D1 D1 D1 R1 D1 D1 D1 
L1 L1 L1 D1 R1 R1 R1 D1 D1 D1 L1 D1 F1 F1 F1 D1 B1 D1 D1 D1 F1 D1 B1 
B1 B1 D1 D1 D1 L1 L1 L1 D1 R1 D1 D1 D1 L1 D1 R1 R1 R1 D1 D1 D1 

同じ動きをグループ化すると、移動回数を大幅に減らすことができます。したがって、次のように出力を置き換えることができます

(c.gsub(/(.)\1*/){j=$&.size%4;$><<$1<<j<<' 'if j>0};o=z;s=t)if s>t

いいですが、コンピューターで20秒以上かかることもあります。1つのケースでは48.7秒で終了しました
-aditsu

@aditsuはい。しかし、使用するルビーインタープリターにも強く依存します。私のマシンでは、通常5秒未満で完了します。
ハワード

現在、ルビー 1.9.3_p392 を使用しています。5秒未満であることがよくありますが、「通常」とは言えません
-aditsu

この入力を試してくださいFU FR RU BR DB LD LU LB LF RD DF BU FRU BUR FDR DLB DFL LUB FUL DBR
。– aditsu

一つの要求:あなたが様配列を統合できU1 U1 U1、単一の中にU3
primo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.