Bantu saya jus alpukat saya

14

Dalam tantangan ini, saya memiliki bidang alpukat yang ingin saya jus secepat dan selengkap mungkin. Bisakah Anda menulis program atau fungsi untuk membantu saya mengetahui cara membuat jus semua alpukat dengan sempurna?

Sebagai input, Anda akan mendapatkan alpukat sebagai kisi mx- mkuadrat, di mana mbilangan bulat antara 3 dan 6. Setiap kotak berisi persis satu alpukat. Alpukat memiliki beberapa tahap kesegaran:

Tahap 1: Alpukat belum dijus sama sekali.
Tahap 2: Alpukat telah dijus sebagian.
Tahap 3: Alpukat telah dijus sepenuhnya.
Tahap 4: Alpukat telah meledak karena terlalu banyak membuat jus.

Saat Anda menggunakan alat jus, alpukat di area efek alat jus itu bergerak ke tahap berikutnya. Alpukat yang meledak memiliki banyak kekuatan dan akan menghancurkan seluruh bidang alpukat, jadi pastikan tidak ada alpukat yang meledak!

Ini adalah contoh dari kotak alpukat. Dalam contoh-contoh ini, saya telah menggunakan koordinat 0,0untuk sudut kiri bawah, dan koordinat 2,2untuk sudut kanan atas, meskipun Anda dapat menyesuaikan sistem koordinat agar sesuai dengan bahasa Anda.

112
221
231

Tujuannya adalah untuk membuat semua alpukat dijus sempurna (yaitu tahap 3). Untuk mencapai ini, Anda memiliki tiga alat jus yang berbeda yang Anda miliki. Setiap alat membuat jus memiliki efek area yang berbeda, tetapi semuanya meningkatkan kesuburan alpukat yang terkena dampak sebesar 1.

Berikut ini semua alat yang Anda miliki. Anda menggunakan juicer dengan menentukan huruf pertama dari alat, lalu koordinat yang ingin Anda jus. Misalnya, untuk menggunakan Slicer di kotak 5,2, Anda akan menampilkan S 5,2.

Slicer : Membuat jus target koordinat dan alpukat di kedua sisi.

112     112     112
221 --> XXX --> 332
231     231     231

Grater : Jus target koordinat dan alpukat di atas dan di bawah.

112     1X2     122
221 --> 2X1 --> 231 --> kaboom!
231     2X1     241

Peluncur Roket : Membuat jus target koordinat dan semua alpukat yang berdekatan.

112     1X2     122
221 --> XXX --> 332
221     2X1     231

Input dan Output Sampel

323
212
323

G 1,1
S 1,1

3312
3121
1213
2133

R 0,0
R 1,1
R 2,2
R 3,3

22322
22222
22222
33233
33333

G 0,3
G 1,3
G 2,2
G 3,3
G 4,3

222332
333221
222332
333222
222333
333222

S 1,5
S 1,3
S 1,1
S 4,5
S 4,3
S 4,1
G 5,4
Absinth
sumber
Anda tampaknya tidak secara eksplisit mengatakan ini, tetapi apakah solusinya harus mengambil langkah paling sedikit?
FryAmTheEggman
1
Ini telah mengabaikan beberapa komentar konstruktif dari kotak pasir. Ini satu: Saya kira Anda harus secara fleksibel mengizinkan pengguna untuk memilih sistem koordinat mereka (misalnya, di mana asalnya, 0-diindeks atau 1-diindeks).
Greg Martin
3
@Pavel terima kasih banyak untuk tidak memposting itu sebagai jawaban atau pertanyaan.
NoOneIsHere
1
Saya melihat pertanyaan ini, dan saya siap untuk downvote, VTC, dan menandai sebagai spam. Sebaliknya, +1.
NoOneIsHere
1
@Pavel Saya sangat tergoda untuk membuat judul ...
absinth

Jawaban:

1

Mathematica - 350 byte

Bukan solusi yang sangat singkat, tetapi lebih baik daripada tidak ada solusi sama sekali, kan?

t[x_]:=Flatten@Table[x/@{G,S,R},{i,n},{j,n}];""<>Cases[StringReplace[(First@Solve[(Table[G[i,j]+G[i-1,j]+G[i+1,j]+S[i,j]+S[i,j-1]+S[i,j+1]+R[i,j]+R[i-1,j]+R[i+1,j]+R[i,j-1]+R[i,j+1],{i,n=Length@#},{j,n}]/.(G|S|R)[___,0|n+1,___]->0)==3-#&&And@@t[#[i,j]>=0&],t[#[i,j]&],Integers])/.{(x_->m_):>ToString[m x]},{"["->" ","]"->"\n",", "->","}],Except@"0"]&

Versi yang lebih mudah dibaca (dengan spasi tambahan dan indentasi serta hal-hal lain):

t[x_] := Flatten@Table[x /@ {G, S, R}, {i, n}, {j, n}]; 
"" <> Cases[
   StringReplace[(First@
       Solve[(Table[
             G[i, j] + G[i - 1, j] + G[i + 1, j] + S[i, j] + 
              S[i, j - 1] + S[i, j + 1] + R[i, j] + R[i - 1, j] + 
              R[i + 1, j] + R[i, j - 1] + R[i, j + 1], {i, 
              n = Length@#}, {j, n}] /. (G | S | R)[___, 
              0 | n + 1, ___] -> 0) == 3 - # && 
         And @@ t[#[i, j] >= 0 &], t[#[i, j] &], 
        Integers]) /. {(x_ -> m_) :> ToString[m x]}, {"[" -> " ", 
     "]" -> "\n", ", " -> ","}], Except@"0"] &

Input adalah array (mis. {{3,2,3},{2,2,2},{3,2,3}}), Output adalah string (dengan baris baru yang tertinggal - jika ini tidak dapat diterima, lampirkan fungsi dalam StringDrop[...,-1]selama 15 byte tambahan). Saya menggunakan sistem koordinat yang mengatakan (1,1) adalah sudut kiri atas, (n, n) adalah kanan bawah (di mana n adalah dimensi dari matriks). Terkadang, jika solusinya mengharuskan melakukan operasi yang sama beberapa kali, hasilnya mencakup hal-hal seperti3 G 2,2 (untuk "menggunakan parutan di (2,2) tiga kali") - karena Anda tidak mengatakan apa yang harus dilakukan dalam kasus ini, saya harap tidak apa-apa.

Penjelasan:

  • Table[G[i,j]+G[i-1,j]+G[i+1,j]+S[i,j]+S[i,j-1]+S[i,j+1]+R[i,j]+R[i-1,j]+R[i+1,j]+R[i,j-1]+R[i,j+1],{i,n=Length@#},{j,n}]membuat array dengan variabel G [i, j] di setiap tempat yang terpengaruh dengan menggunakan parutan di (i, j), dan juga untuk S [i, j] dan R [i, j]. Variabel-variabel ini mewakili berapa kali alat digunakan pada posisi itu.
  • .../.(G|S|R)[___,0|n+1,___]->0 menghilangkan efek menggunakan alat di posisi di luar bidang alpukat.
  • ...==3-# membandingkan ini dengan perbedaan antara input dan bidang alpukat dijus sempurna.
  • ...&&And@@t[#[i,j]>=0&]kata variabel G [i, j], S [i, j], R [i, j] harus non-negatif (Anda tidak dapat menghapus jus avokad!), menggunakan steno t[x_]:=Flatten@Table[x/@{G,S,R},{i,n},{j,n}].
  • First@Solve[...,t[#[i,j]&],Integers] menemukan solusi integer pertama untuk persamaan kami dalam hal variabel G [i, j], S [i, j], R [i, j].
  • /.{(x_->m_):>ToString[m x]} menyembunyikan variabel yang sama dengan nol, sementara juga menempatkan solusi dalam bentuk string yang bagus.
  • StringReplace[...,{"["->" ","]"->"\n",", "->","}]mengubah string seperti "2 G[1, 4]"menjadi string seperti "2 G 1,4", dan menambahkan baris baru di akhir.
  • ""<>Cases[...,Except@"0"]menghapus semua sisa "0"s dan menyatukan semua string.
Bukan pohon
sumber