В этом соревновании у меня есть поле авокадо, которое я хотел бы приготовить как можно быстрее и полностью. Можете ли вы написать программу или функцию, которая поможет мне понять, как приготовить соки из всех авокадо?
Как вход, вы получите авокадо в качестве 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
Ответы:
Mathematica - 350 байт
Не очень короткое решение, но лучше, чем вообще никакого решения, верно?
Более читаемая версия (с дополнительными пробелами, отступами и прочим):
Входные данные - это массив (например
{{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"
и соединяет все строки вместе.источник