Допоможи мені сік мого авокадо


14

У цьому виклику у мене є поле авокадо, яке я хотів би зробити соком якомога швидше і ціліше. Чи можете ви написати програму чи функцію, яка допоможе мені розібратися, як ідеально випити всі авокадо?

Як вхід, ви отримаєте авокадо в якості mй mквадратної сітки, де mє цілим числом від 3 до 6. Кожного квадрат містить рівно один авокадо. Авокадо має кілька стадій соковитості:

Етап 1: Авокадо взагалі не було соком.
2 етап: авокадо частково соку.
Етап 3: Авокадо було повністю сочене.
Етап 4: авокадо вибухнув через надмірне вживання соку.

Коли ви використовуєте соковижимальний засіб, авокадо в зоні дії цього засобу для переробки соку переходить до наступного етапу. Вибухне авокадо має велику силу і знищить все поле авокадо, тому переконайтесь, що жодне з авокадо не вибухне!

Ось приклад сітки авокадо. У цих прикладах я використовував координату 0,0для нижнього лівого кута, а координату 2,2для верхнього правого кута, хоча ви можете налаштувати систему координат відповідно до вашої мови.

112
221
231

Мета полягає в тому, щоб всі авокадо були ідеально соченими (тобто, етап 3). Для цього у вас є три різні засоби для приготування соків. Кожен засіб для соку має різну область дії, але всі вони збільшують соковитість ураженого авокадо на 1.

Ось усі інструменти, які у вас є в розпорядженні. Ви використовуєте соковижималки, вказуючи першу букву інструменту, а потім координати, які потрібно сокувати. Наприклад, щоб використовувати Slicer на квадраті 5,2, ви отримаєте висновок S 5,2.

Слайсер : соки цільової координати та авокадо з обох боків.

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

Терка : Соки цільової координати та авокадо вгорі та внизу.

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

Ракетний запуск : соки цільової координати та всіх сусідніх авокадо.

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

Зразки входів і виходів

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

Ви, схоже, цього прямо не говорите, але чи має рішення вирішувати найменші кроки?
FryAmTheEggman

1
Це ігнорувало деякі конструктивні коментарі з пісочниці. Ось один: я припускаю, що ви повинні гнучко дозволити користувачеві вибирати свою систему координат (наприклад, де походження, 0-індексований або 1-індексований).
Грег Мартін

3
@Pavel дуже дякую, що не розмістив це як відповідь чи запитання.
NoOneIsHere

1
Я бачив це питання, і я був готовий відхилити, VTC і прапор як спам. Натомість +1.
NoOneIsHere

1
@Pavel Мені так спокусилося зробити заголовок ...
абсент

Відповіді:


1

Mathematica - 350 байт

Не дуже коротке рішення, але краще, ніж рішення взагалі немає, правда?

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"]&

Більш прочитана версія (з додатковими пробілами та відступами та іншим):

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"] &

Вхід - це масив (наприклад {{3,2,3},{2,2,2},{3,2,3}}), вихід - рядок (із зворотним новим рядком - якщо це неприпустимо, додайте функцію в StringDrop[...,-1]додаткові 15 байт). Я використав систему координат, яка говорить (1,1) - верхній лівий кут, (n, n) - правий нижній кут (де n - розмірність матриці). Іноді, якщо рішення вимагає виконання однієї і тієї ж операції кілька разів, вихід включає такі речі, як 3 G 2,2(для "використання терки при (2,2) три рази") - оскільки ви не сказали, що робити в цьому випадку, я сподіваюся гаразд.

Пояснення:

  • 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 [i, j] в кожному місці, на яке впливає використання терки в (i, j), і аналогічно для S [i, j] і R [i, j]. Ці змінні відображають кількість разів використання інструменту в цій позиції.
  • .../.(G|S|R)[___,0|n+1,___]->0 усуває ефекти використання інструментів у положеннях поза полем авокадо.
  • ...==3-# порівнює це з різницею між вхідним та полем ідеально соченого авокадо.
  • ...&&And@@t[#[i,j]>=0&]говорить, що змінні G [i, j], S [i, j], R [i, j] повинні бути невід'ємними (ви не можете скасувати сок авокадо!), використовуючи скорочення t[x_]:=Flatten@Table[x/@{G,S,R},{i,n},{j,n}].
  • First@Solve[...,t[#[i,j]&],Integers] знаходить перше ціле рішення наших рівнянь з точки зору змінних G [i, j], S [i, j], R [i, j].
  • /.{(x_->m_):>ToString[m x]} приховує змінні, що дорівнюють нулю, при цьому також розміщуючи рішення в приємній формі рядка.
  • StringReplace[...,{"["->" ","]"->"\n",", "->","}]перетворює рядки, як "2 G[1, 4]"у рядки типу "2 G 1,4", і додає новий рядок в кінці.
  • ""<>Cases[...,Except@"0"]видаляє всі залишки "0"і з'єднує всі рядки разом.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.