スライド検索


9

おかげで、叔父(物語)

私の少し気違いの叔父は最近スペースコロニーに向けて出発し、彼のパレット商品事業を私に渡しました。長方形の倉庫には、ドアの横にある1つの正方形を除いて、商品のパレットがたくさんあります。今日、顧客から注文されたパレットの最初のリストが届きました。

幸いにも、各パレットの場所を注意深く書いた地図があり、私の狂った叔父は、スライドする15パズルのように、パレットを隣接するスペースに移動できるいくつかのミニロボットを設計しました。パレットがどこに行き着くかは気にしませんが、リストにあるパレットがドアの順に到着するようにしたいだけです。

問題は、必要なパレットを取得するために、ロボットにどのような一連のコマンドを与えなければならないかです。

チャレンジ

与えられた

  • グリッドのサイズ(行、列)
  • 順番に取得するパレットのリスト(現在の場所別)

移動する位置と方向に対応するグリッド位置のリストを出力する必要があります。利用できる方向が1つしかない場合は、オプションで省略できます。パレットはドアのそばに到着するとすぐに削除されます(1つのコーナー、例ではインデックスN)。

働いた例

01 02   label the contents  A B
03 04                       C D
05[  ]                      E _

Request: 03 (contents is C)

Command 0: 04
D moves into the (only) adjacent space at index 06
Result: A B
        C _
        E D

Command 1: 03
C moves into the (only) adjacent space at index 04
Result: A B
        _ C
        E D

Command 2: 05
        A B
        E C
        _ D
Command 3: 06  
        A B
        E C
        D _
Command 4: 04
        A B
        E _
        D[C]
(C removed having arrived by the door)

制限と自由

  • 最大グリッドサイズは100x100です
  • 挑戦はコードゴルフ
  • ソリューションは、実際のマシンで2分以内に実行する必要があります
  • 一貫性がある限り、インデックス、コマンド構文、入力構造などを選択できます。
  • コマンドにはグリッドの場所を使用することを選択しましたが、要素が一意であるため、代わりに要素に値を加えることができます(方向もプラス)。
  • 状態のアニメーション(特に大きなグリッドの場合)を作成したい場合は、きっと面白いでしょう。

A:3x2、1パレット

01  02
03  04
05 [__]

Request: pallet at 03

Valid solution: 05,03,04,06,05

This leaves the following state:

01  02
04  05
__ [03]

B:15パズル、1箱

01 02 03 04 05
06 07 08 09 10
11 12 13 14[  ]

Request: box 01

Valid solution: 14,13,12,11,06,01,02,07,12,11,06,07,12,11,06,07,08,13,12,11,06,07,08,09,14,13,08,09,10,15,14

02 07 03 04 05
08 12 13 10 14
06 11 09 __[01]

C:3x2、4ボックス

01 02
03 04
05[  ]

Request: 02,04,01,05

Valid solution: 04,02,01,03,05,06,04,05,02,06,03S,05E
Pallet taken at:                    ^  ^     ^       ^

Indicating directions with NSEW

Final state:

03 __
__ __
__ __

D:10x10、2ボックス

10x10, request boxes at 13,12 (row 1, cols 2 & 1 with 0-index)

Valid solution: (90,80..20, 19,18..12, 22,32..92, 93,94..100) x 15, 90.

E:4x1、すべて

4x1: 01 02 03 [ ]
Req: 03,02,01 (only valid order)
Optimal solution: 03,02,03E,01,02E,03E

F:100x100、ドアの近くに3つ

100x100
Req: 9900,9899,9898
Result: 9000,9989,9000S,9898,9898E,9000S

サンドボックスリンク


ボックス2と3が要求された場合、ドアに向かって2を移動しているときに3がドアを通過することは違法ですか?
ジョナ

1
@ジョナ:いいえ、または最初のボックスがn-1またはncでない限り、シナリオは解決できません。ドアのそばの特別な唯一のことは、リストの次のパレットがそこに到着したとき、それは私の風変わりなフォークリフトのオペレーターによってすぐに取り除かれるということです。
Phil H

回答:


3

JavaScript(Node.js)-425 424 420 395

(n,m,L)=>(s=Math.sign,G=[...Array(n*m).keys()],i=k=n*m-1,G[k]=-1,R=[],M=j=>{-G[j]-1&&R.push([j,i]);[G[i],G[j]]=[G[j],G[i]];i=j},X=j=>{while(i%n-j%n)M(i+s(j%n-i%n))},Y=j=>{while(y(i)-y(j))M(i+n*s(y(j)-y(i)))},y=i=>(i-i%n)/n,L.map(e=>{J=()=>j=G.indexOf(e);while(J()%n-n+1){m>1&&y(j)-y(i)||M(y(i)?i-n:i+n);X(j+1);Y(j);M(j);m<2?i=k:0}while(J()+1-n*m){X(n-2);Y(j+n);X(n-1);M(j);n<2?i=k:0}G[k]=-1}),R)

オンラインでお試しください!

n、mとパレットの配列を受け取り、コマンドのリストを返します。各コマンドは、移動するパレットの場所と移動先のスペースの場所の2要素の配列です。

おそらく私が使用したものよりも優れた戦略があるでしょうが、今のところはそのまま投稿します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.