Помоги мне сок авокадо


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.