Pengambilan slide

9

Terima kasih, Paman (ceritanya)

Paman saya yang sedikit gila baru-baru ini pergi ke koloni luar angkasa, dan menyerahkan bisnis barang paletnya kepada saya. Gudang persegi panjang itu penuh dengan palet barang kecuali satu kotak di dekat pintu, dan saya baru saja menerima daftar palet pertama yang dipesan oleh pelanggan untuk dikirim hari ini.

Untungnya saya memiliki peta yang ditulis dengan cermat di mana masing-masing palet berada, dan paman saya yang gila merancang beberapa robot mini yang dapat memindahkan palet ke ruang yang berdekatan, seperti 15 puzzle geser. Saya tidak peduli di mana palet berakhir, saya hanya ingin palet dalam daftar tiba di pintu.

Pertanyaannya adalah, serangkaian perintah apa yang harus saya berikan kepada robot untuk mendapatkan palet yang diperlukan?

Tantangan

Diberikan

  • ukuran grid (baris, cols)
  • daftar palet (berdasarkan lokasi mereka saat ini) untuk mengambil secara berurutan

Anda harus menampilkan daftar posisi kisi yang sesuai dengan posisi mana yang akan dipindahkan, dan ke arah mana. Jika hanya ada 1 arah yang tersedia, Anda dapat menghilangkannya. Palet akan dihapus segera setelah kedatangan oleh pintu (di satu sudut, indeks N dalam contoh).

Contoh yang berhasil

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)

Batas dan kebebasan

  • Ukuran kisi maksimum adalah 100x100
  • Tantangan adalah kode-golf
  • Solusi harus dijalankan dalam waktu 2 menit pada beberapa mesin dunia nyata
  • Anda dapat memilih pengindeksan, sintaksis perintah, struktur input, dan sebagainya, asalkan konsisten.
  • Saya telah memilih untuk menggunakan lokasi grid untuk perintah, tetapi Anda bisa memancarkan nilai dalam elemen sebagai gantinya (ditambah arah) karena mereka unik.
  • Jika Anda ingin membuat animasi negara (terutama untuk jaringan besar), saya yakin itu akan menghibur!

Contohnya

A: 3x2, 1 palet

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-puzzle, 1 kotak

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 kotak

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 kotak

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, semuanya

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

F: 100x100, 3 di dekat pintu

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

Tautan kotak pasir

Phil H
sumber
jika kotak 2 dan 3 diminta, apakah ilegal jika 3 melewati pintu saat Anda bergerak 2 menuju pintu?
Jonah
1
@Jonah: Tidak, atau tidak ada skenario yang dapat dipecahkan kecuali kotak pertama adalah n-1 atau nc. Satu-satunya hal khusus tentang ruang dekat pintu adalah ketika palet berikutnya dalam daftar tiba di sana, segera dihapus oleh operator forklift eksentrik saya.
Phil H

Jawaban:

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)

Cobalah online!

Mengambil n, m dan sebuah array palet, mengembalikan daftar perintah di mana setiap perintah adalah array 2 elemen dari lokasi palet untuk dipindahkan dan lokasi ruang untuk memindahkannya.

Mungkin ada strategi yang lebih baik daripada yang saya gunakan, tetapi memposting apa adanya untuk saat ini.

kotak kardus
sumber