Введение:
Перед задачей вот что делает каждый элемент на карте:
Равнина ( X
): Это ничего не делает.
Разрушенная земля ( -
): это то же самое, что и обычная земля, но разрушенная бомбой.
Активная бомба ( !
): На карте это уничтожит все в квадрате 3x3:
XXXXX XXXXX
XXXXX X---X
XX!XX > will become > X---X
XXXXX X---X
XXXXX XXXXX
Пассивная бомба ( @
): ничего не делает, пока не будет взорвана другой бомбой. Это также имеет квадратный радиус взрыва 3x3 :
XXXXX XXXXX
XXXXX XXXXX
XX@XX > will become > XX@XX (nothing happened)
XXXXX XXXXX
XXXXX XXXXX
Но:
XXXXX XXXXX
XXXXX X---X
XX@XX > will become > ----X (both bombs have exploded)
X!XXX ----X
XXXXX ---XX
Nuke ( ~
): ничего не делает, пока не взорвется другой бомбой. Разница в том, что эта бомба имеет радиус взрыва 5х5 :
XXXXX XXXXX
XXXXX XXXXX
XX~XX > will become > XX~XX (nothing happened)
XXXXX XXXXX
XXXXX XXXXX
Но:
XXXXX -----
XXXXX -----
XX~XX > will become > ----- (both bombs have exploded)
X!XXX -----
XXXXX -----
Задание
- Учитывая карту 9x9 , выведите карту после цепной реакции.
- Вы можете предоставить функцию или программу.
- Это код-гольф , поэтому выигрывает представление с наименьшим количеством байтов!
Контрольные примеры
Контрольный пример 1 ( 3 шага ):
XXXXXXXXX XXXXXXXXX
----XXXXX ----XXXXX
XXXX@XXXX XXXX@XXXX
XXXXXXXX- XXX---XX-
XXXX@XXXX > ------XXX
XXXXXXXX- ------XX-
XX~XXXXXX -----XXXX
X!XXXXXX- -----XXX-
XXXXXXXXX -----XXXX
Контрольный пример 2 ( 2 шага ):
XXXXXXXXX XXXXXXXXX
XXXXXXXXX XXXXXXXXX
XX~XXXXXX XX~XXXXXX
--------- ---------
XXXX!XXXX > XXX---XXX
XXXXXXXXX XXX------
XXX@@X@!X XXX@@----
XXXXXXXXX XXXXX----
XXXXXXXXX XXXXXXXXX
Контрольный пример 3 ( 2 шага ):
XXXXXXXXX XXXXXXXXX
XXXXXXXXX XXXXXXXXX
XX~XXXXXX XX~XXXXXX
XXXXXXXXX XXX---XXX
XXXX!XXXX > XXX---XXX
XXXXXXXXX XXX------
XXX@@X@!X XXX@@----
XXXXXXXXX XXXXX----
XXXXXXXXX XXXXXXXXX
Контрольный пример 4 ( 1 шаг ):
XXXXXXXXX XXXXXXXXX
XXXX-XXXX XXXX-XXXX
XXXXXXXXX XXX---XXX
XX-X!X-XX XX-----XX
XXXXXXXXX > XXX---XXX
XX-----XX XX-----XX
XXXX-XXXX XXXX-XXXX
XXXXXXXXX XXXXXXXXX
XXXXXXXXX XXXXXXXXX
Контрольный пример 5 ( 9 шагов ):
!XXXXXXXX ---XXXXXX
X@XXXXXXX ----XXXXX
XX@XXXXXX -----XXXX
XXX@XXXXX X-----XXX
XXXX@XXXX > XX-----XX
XXXXX@XXX XXX-----X
XXXXXX@XX XXXX-----
XXXXXXX@X XXXXX----
XXXXXXXX@ XXXXXX---
Контрольный пример 6 ( 9 шагов ):
XX@@@XXXX ------XXX
XXXXXXXXX ------XXX
~XXXXXXXX ---XXXXXX
XXXXXXXXX ---XXXXXX
~XXXXXXXX > ---XXXXXX
XXXXXXXXX ---XXXXXX
~XXXXXXXX ---XXXXXX
@XXXXXXXX ---XXXXXX
!XXXXXXXX ---XXXXXX
Контрольный пример 7 ( 3 шага ):
!XXXXXXXX ---XXXXXX
X@XXXXXXX ----XXXXX
XX@XXXXXX ----XXXXX
XXXXXXXXX X---X----
XXXXXX@@! > XXXXX----
XXXXXXXXX X---X----
XX@XXXXXX ----XXXXX
X@XXXXXXX ----XXXXX
!XXXXXXXX ---XXXXXX
Ответы:
Matlab,
120111 байтовИдея следующая: найти активную бомбу. Увеличьте эту площадь до 3х3. Найдите новые затронутые бомбы, увеличьте области соответствия до соответствующего размера и добавьте те к ранее разрушенной области. Повторите это достаточно много раз (в моем случае столько раз, сколько у нас вводимых символов, просто потому, что это самый короткий вариант), чтобы быть уверенным, что мы достигли стационарной точки (= больше не взрывающихся бомб). Затем установите всю разрушенную область
-
и отобразите результат.Предполагается, что вводом является матрица символов, например
источник
Сетчатка ,
188168154152 байтаБайт считается ISO 8859-1.
Попробуйте онлайн!
Это скорее подтверждение концепции. Между бомбами и ядерными бомбами существует огромное количество дубликатов, от которых я постараюсь избавиться, прежде чем добавлять объяснения.Ну, я избавился от этого дублирования, но оно значительно увеличило сложность, поэтому на самом деле не привело к огромной экономии ...источник
APL (Dyalog) , 56 символов или 62 байта *
Мой коллега Маршалл предложил элегантное решение, на 21 символ короче моего:
Попробуйте онлайн!
{
…}
Анонимная функция, где аргумент представлен ⍵'-'@(
…)⍵
Прочерк в позициях, замаскированных следующей молчаливой функцией:'!'∘=
Логическое значение, где восклицательный знак равен аргументу(
…)⍣≡
Применить следующую молчаливую функцию, пока ничего не изменится:×∘(
...)
умножить на следующую константу:'~'=⍵
Логическое значение, где тильда равна исходному аргументу(
…)+
К этому добавьте:'X'≠⍵
Логическое значение, где X отличается от исходного аргумента{
…}⌺5 5
Для каждого примените следующую функцию к области 5 × 5 с центром на ней:4↑1
возьмите первые четыре элемента одного, дополняя нулями [1,0,0,0]1+
добавить один [2,1,1,1]5⍴
изменить циклически в длину пять [2,1,1,1,2]∘.⌈⍨
максимальный стол с собой по обеим осям⍵≥
Boolean, где соответствующие соседи больше или равны1∊
Логическое значение, если оно есть, верно* Просто замените
⌺
на⎕U233A
классическое значение для одного байта на символ.источник
Disp
Функция никогда не мог бы работать. Обновлено, чтобы быть оператором. Спасибо.@
в классике считается 1 байт? мое предположение да'-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'⍳a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕
(⎕io←0
)Ява,
574562558549525523 байтаисточник
'-'
можете играть в гольф несколько вещей: оба могут быть45
. ОбаMath.max(...,0)
могут быть...>0?...:0
(то же самое может быть сделано с,Math.min(...,9)
но это точно такое же количество байтов.for(int i=0;i<9;i++){int j=0;for(char c:q.nextLine().toCharArray())g[i][j++]=c;}for(int j=0;j<9;j++)for(int k=0;k<9;k++)if(g[j][k]==33)d(j,k,1);
Может бытьint i=0,j;for(;i<9;i++){j=0;for(char c:q.nextLine().toCharArray())g[i][j++]=c;}for(i=0;i<9;i++)for(j=0;j<9;j++)if(g[i][j]<34)d(i,j,1);
. И, возможно, вы могли бы сделать из него функцию вместо программы.APL (Dyalog Classic) , 61 байт
Попробуйте онлайн!
a←⎕
оценить вход и назначитьa
i←,⍳⍴a
индексы (пары координат) всех ячеек('!'=,a)/
фильтровать только изначально активные бомбы{ }⍣≡
выполнить преобразование в списке, пока он не стабилизируется'X@~-'⍳a[⍵]
заменить 0 дляX
, 1 для@
и т. д., 4 для чего-либо еще (!
)3|
мод 3, чтобы получить «радиус» удара; оно должно быть больше или равно ...(↓⌈/¨|⍵∘.-i)≤
... Манхэттенские расстояния между ячейками в списке и всеми ячейкамиi/⍨∨⌿↑
получить битовую маску, на которые влияют клетки, и выбрать те изi
'-'@( )⊢a
поставить-
на эти позицииисточник