Цепная реакция бомб

32

Введение:

Перед задачей вот что делает каждый элемент на карте:

Равнина ( 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
Аднан
источник
4
Мой ответ значительно короче принятого.
Адам
Может ли часть семинара основываться на этом вызове?
Адам

Ответы:

10

Matlab, 120 111 байтов

function f=c(f);c=@(x,i)conv2(x+0,ones(i),'s');a=c(f<34,3);for k=f;a=c(a&f<65,3)|a;a=c(a&f>99,5)|a;end;f(a)='-'

Свертка - ключ к успеху.

Идея следующая: найти активную бомбу. Увеличьте эту площадь до 3х3. Найдите новые затронутые бомбы, увеличьте области соответствия до соответствующего размера и добавьте те к ранее разрушенной области. Повторите это достаточно много раз (в моем случае столько раз, сколько у нас вводимых символов, просто потому, что это самый короткий вариант), чтобы быть уверенным, что мы достигли стационарной точки (= больше не взрывающихся бомб). Затем установите всю разрушенную область -и отобразите результат.

Предполагается, что вводом является матрица символов, например

['!XXXXXXXX';
'X@XXXXXXX';
'XX@XXXXXX';
'XXX@XXXXX';
'XXXX@XXXX';
'XXXXX@XXX';
'XXXXXX@XX';
'XXXXXXX@X';
'XXXXXXXX@'];
flawr
источник
10

Сетчатка , 188 168 154 152 байта

Байт считается ISO 8859-1.

+Tm`@~X!:`!:\-`(.)?.?.(.?(?<1>.)?)(?<=(:|(?(1)_)!|^(?(5)_)(?<-5>.)*(:|(?(1)_)!)(?<1>.*¶)?.*¶(.)*.|(?=(.)*¶.*(?<1>¶.*)?(:|(?(1)_)!)(?<-6>.)*(?(6)_)$))\2)

Попробуйте онлайн!

Это скорее подтверждение концепции. Между бомбами и ядерными бомбами существует огромное количество дубликатов, от которых я постараюсь избавиться, прежде чем добавлять объяснения. Ну, я избавился от этого дублирования, но оно значительно увеличило сложность, поэтому на самом деле не привело к огромной экономии ...

Мартин Эндер
источник
6

APL (Dyalog) , 56 символов или 62 байта *

Мой коллега Маршалл предложил элегантное решение, на 21 символ короче моего:

{'-'@(({1∊⍵≥∘.⌈⍨51+41}⌺5 5×∘(('X'≠⍵)+'~'=⍵))⍣≡'!'∘=)⍵}

Попробуйте онлайн!

{} Анонимная функция, где аргумент представлен

'-'@()⍵Прочерк в позициях, замаскированных следующей молчаливой функцией:

  '!'∘= Логическое значение, где восклицательный знак равен аргументу

  ()⍣≡ Применить следующую молчаливую функцию, пока ничего не изменится:

   ×∘(... ) умножить на следующую константу:

    '~'=⍵ Логическое значение, где тильда равна исходному аргументу

    ()+ К этому добавьте:

     '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 классическое значение для одного байта на символ.

Адам
источник
в ссылке tio ввод (слева от «>») совпадает с выводом (справа от «>»), должен ли он выглядеть так?
нгн
@ngn Приятно заметили. DispФункция никогда не мог бы работать. Обновлено, чтобы быть оператором. Спасибо.
Адам
... и вопрос: @в классике считается 1 байт? мое предположение да
нгн
@ngn Да.
Адам
вот идея для 61 байта: '-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'⍳a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕( ⎕io←0)
ngn
4

Ява, 574 562 558 549 525 523 байта

import java.util.*;interface B{static char[][]g=new char[9][9];static void d(int i,int j,int r){g[i][j]=45;for(int x=Math.max(i-r,0);x<Math.min(i+r+1,9);x++)for(int y=Math.max(j-r,0);y<Math.min(j+r+1,9);y++)if(g[x][y]==64){d(x,y,1);}else if(g[x][y]>99){d(x,y,2);}else g[x][y]=45;}static void main(String[]a){Scanner q=new Scanner(System.in);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);for(char[]z:g)System.out.println(z);}}
SuperJedi224
источник
Я знаю, что прошло довольно много времени с тех пор, как вы это опубликовали. Но вы '-'можете играть в гольф несколько вещей: оба могут быть 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);. И, возможно, вы могли бы сделать из него функцию вместо программы.
Кевин Круйссен
1

APL (Dyalog Classic) , 61 байт

'-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕

Попробуйте онлайн!

a←⎕ оценить вход и назначить a

i←,⍳⍴a индексы (пары координат) всех ячеек

('!'=,a)/ фильтровать только изначально активные бомбы

{ }⍣≡ выполнить преобразование в списке, пока он не стабилизируется

  • 'X@~-'⍳a[⍵]заменить 0 для X, 1 для @и т. д., 4 для чего-либо еще ( !)

  • 3|мод 3, чтобы получить «радиус» удара; оно должно быть больше или равно ...

  • (↓⌈/¨|⍵∘.-i)≤ ... Манхэттенские расстояния между ячейками в списке и всеми ячейками

  • i/⍨∨⌿↑ получить битовую маску, на которые влияют клетки, и выбрать те из i

'-'@( )⊢aпоставить -на эти позиции

СПП
источник