Ланцюгова реакція бомб


32

Вступ:

Перед завданням, ось що робить кожен елемент на карті:

Звичайна земля ( X): Це нічого не робить.

Знищена земля ( -): Це те саме, що звичайна земля, але знищена бомбою.

Активна бомба ( !): На карті це знищить усе в квадраті 3х3:

XXXXX                         XXXXX
XXXXX                         X---X
XX!XX     > will become >     X---X
XXXXX                         X---X
XXXXX                         XXXXX

Пасивна бомба ( @): нічого не робить, поки не підірветься інша бомба. Він також має 3х3 квадратний радіус вибуху:

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

Матлаб, 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@'];

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]

    ∘.⌈⍨ максимальний стіл з собою на обох осях

    ⍵≥ Булеві, де відповідні сусіди більше або рівні

    1∊ Булева, якщо така є правдою


* Просто замініть на " ⎕U233A Класичний" на один байт на символ.


у посиланні tio введення (зліва від ">") те саме, що вихід (праворуч від ">"), чи повинен він виглядати так?
ngn

@ngn Чудово помічений. DispФункція ніколи не міг би працювати. Оновлено, щоб бути оператором. Спасибі.
Adám

... і питання: чи @вважає 1 байт класичним? я здогадуюсь так
п.


ось ідея на 61 байт: '-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'⍳a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕( ⎕io←0)
ngn

4

Java, 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);}}

Я знаю, що минуло чимало часу, коли ви опублікували це. Але ви можете грати в гольф кілька речей: Як '-'може бути 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);і може бути , ви могли б зробити функцію з неї , а не програми ..
Кевін Cruijssen

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|mod 3, щоб отримати "радіус" удару; він повинен бути більшим або рівним ...

  • (↓⌈/¨|⍵∘.-i)≤ ... Манхеттенська відстань між клітинками у списку та всіма клітинками

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

'-'@( )⊢aпоставити -на ці посади

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.