Saya sepertinya membuat acar. Secara harfiah. Saya menjatuhkan banyak acar di lantai dan sekarang mereka semua bertebaran! Saya membutuhkan Anda untuk membantu saya mengumpulkan semuanya. Oh, apakah saya menyebutkan saya memiliki banyak robot atas perintah saya? (Mereka juga tersebar di mana-mana; Aku benar-benar buruk dalam mengatur hal-hal.)
Anda harus mengambil input dalam bentuk:
P.......
..1..2..
.......P
........
P3PP...4
.......P
yaitu, beberapa baris baik .
, P
(acar), atau digit (ID robot). (Anda dapat mengasumsikan bahwa setiap baris memiliki panjang yang sama, diisi dengan .
.) Anda dapat memasukkan baris-baris ini sebagai array, atau menyeruput dari STDIN, atau membaca dalam baris tunggal yang dipisahkan koma, atau membaca file, atau melakukan apa pun yang Anda mau suka mengambil input.
Output Anda harus dalam bentuk n
garis, di mana n
ID robot tertinggi. (ID robot akan selalu berurutan mulai dari 1.) Setiap baris akan berisi jalur robot, dibentuk dari huruf L
(kiri), R
(kanan), U
(atas), dan D
(bawah). Sebagai contoh, inilah contoh output untuk teka-teki itu:
LLU
RDR
LRRR
D
Bisa juga begitu
LLU RDR LRRR D
Atau
["LLU","RDR","LRRR","D"]
Atau format apa pun yang Anda inginkan, selama Anda bisa tahu apa solusi yang seharusnya.
Tujuan Anda adalah untuk menemukan output optimal, yang merupakan langkah yang paling sedikit. Jumlah langkah dihitung sebagai jumlah langkah terbesar dari semua robot. Misalnya, contoh di atas memiliki 4 langkah. Perhatikan bahwa mungkin ada beberapa solusi, tetapi Anda hanya perlu menghasilkan satu.
Mencetak:
- Program Anda akan dijalankan dengan masing-masing dari 5 kasus pengujian (dihasilkan secara acak).
- Anda harus menambahkan langkah-langkah dari setiap lari, dan itu akan menjadi skor Anda.
- Total skor kumulatif terendah akan menang.
- Anda mungkin tidak membuat hard-code untuk input spesifik ini. Kode Anda juga harus berfungsi untuk input lainnya.
- Robot dapat saling melewati.
- Program Anda harus deterministik, yaitu keluaran yang sama untuk setiap proses. Anda dapat menggunakan generator angka acak, asalkan diunggulkan dan secara konsisten menghasilkan bilangan lintas platform yang sama.
- Kode Anda harus berjalan dalam 3 menit untuk setiap input. (Lebih disukai lebih sedikit.)
- Dalam hal seri, sebagian besar upvotes akan menang.
Berikut ini adalah contoh-contoh tesnya. Mereka dihasilkan secara acak dengan skrip Ruby kecil yang saya tulis.
P.......1.
..........
P.....P...
..P.......
....P2....
...P.P....
.PP..P....
....P....P
PPPP....3.
.P..P.P..P
....P.....
P....1....
.P.....PP.
.PP....PP.
.2.P.P....
..P....P..
.P........
.....P.P..
P.....P...
.3.P.P....
..P..P..P.
..1....P.P
..........
.......2P.
...P....P3
.P...PP..P
.......P.P
..P..P..PP
..P.4P..P.
.......P..
..P...P...
.....P....
PPPP...P..
..P.......
...P......
.......P.1
.P..P....P
P2PP......
.P..P.....
..........
......PP.P
.P1..P.P..
......PP..
P..P....2.
.P.P3.....
....4..P..
.......PP.
..P5......
P.....P...
....PPP..P
Semoga beruntung, dan jangan biarkan acar terlalu lama di sana, atau mereka akan rusak!
Oh, dan mengapa acar, Anda bertanya?
Kenapa tidak?
sumber
Jawaban:
Ruby, 15 + 26 + 17 + 26 + 17 = 101
Robot Menemukan Acar!
Oke, inilah garis dasar untuk memulai orang, menggunakan algoritma super-naif berikut:
Begini tampilannya untuk Test Case # 1:
Jelas ini tidak terlalu bagus tapi ini awal!
Kode:
Mengambil input pada STDIN persis dalam format blok kode kasus uji pada pertanyaan awal. Inilah yang dicetak untuk kasus uji tersebut:
sumber
Python, 16 + 15 + 14 + 20 + 12 = 77
Saya tidak benar-benar memiliki pengalaman sebelumnya untuk masalah tipe salesman keliling tetapi saya punya sedikit waktu di tangan saya jadi saya pikir saya akan mencobanya. Ini pada dasarnya mencoba untuk membagikan masing-masing bot acar tertentu dengan berjalan itu meskipun menjalankan awal di mana mereka pergi untuk yang paling dekat dengan mereka dan terjauh dari yang lain. Itu kemudian brute-memaksa cara paling efisien untuk setiap bot untuk mengumpulkan acar yang diberikan.
Saya benar-benar tidak tahu betapa layaknya metode ini, tetapi saya menduga itu tidak akan bekerja dengan baik untuk papan yang lebih besar dengan bot yang lebih sedikit (papan keempat kadang-kadang membutuhkan waktu lebih dari dua menit).
Kode:
Keluaran:
sumber