炸弹的连锁反应


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

核弹~):什么也没做,直到被另一枚炸弹引爆为止。区别在于,该炸弹的爆炸半径为5x5方形:

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
我的答案比接受的答案短得多。
亚当

可以以此为基础参加研讨会吗?
亚当

Answers:


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)='-'

卷积是成功的关键。

想法如下:找到活动炸弹。将该区域扩大到3x3正方形。查找新的受影响炸弹,将相应的区域扩大到相应的大小,然后将其添加到以前被破坏的区域。重复此次数(以我为例,输入次数尽可能多,只是因为这是最短的变体),以确保我们到达了静止点(=不再有爆炸炸弹)。然后将所有销毁区域设置为-并显示结果。

假定输入是字符矩阵,例如

['!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'≠⍵)+'~'=⍵))⍣≡'!'∘=)⍵}

在线尝试!

{} 匿名函数,其中的参数由represented表示

'-'@(以下默认功能掩盖的位置上)⍵划线

  '!'∘= 感叹号等于参数的布尔值

  ()⍣≡ 应用以下默认功能,直到没有其他更改为止:

   ×∘(…… ) 乘以以下常量:

    '~'=⍵ 布尔值,其中代字号等于原始参数

    ()+ 为此,添加:

     'X'≠⍵ X与原始参数不同的布尔值

   {}⌺5 5 对于每一个,在以其为中心的5×5区域上应用以下功能:

    4↑1 取一个的前四个元素,并用零填充[1,0,0,0]

    1+ 加一[2,1,1,1]

    5⍴ 周期性地重塑为长度5 [2,1,1,1,2]

    ∘.⌈⍨ 两边都有自己的最大工作台

    ⍵≥ 布尔值,其中相应的邻居大于或等于

    1∊ 布尔值(如果为true)


*只需更换⎕U233A 经典下每个字符的单字节。


在tio链接中,输入(“>”左边)和输出(“>”右边)是一样的吗?
ngn

@ngn很好发现。该Disp功能永远无法正常工作。更新为操作员。谢谢。
亚当

...还有一个问题:@经典算作1个字节吗?我的猜测是肯定的
-ngn

@ngn 是的。
亚当

这是一个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);。而且也许可以用它代替程序来实现一个函数。)
Kevin 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放在-那些位置

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.