Réaction en chaîne des bombes

32

Introduction:

Avant la tâche, voici ce que fait chaque élément sur la carte:

Plain land ( X): Cela ne fait rien.

Terre détruite ( -): c'est la même chose que la terre ordinaire, mais détruite par une bombe.

La bombe active ( !): sur une carte, cela détruira tout dans un carré 3x3:

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

La bombe passive ( @): elle ne fait rien, jusqu'à ce qu'elle soit déclenchée par une autre bombe. Cela a également un rayon d'explosion carré de 3x3 :

XXXXX                         XXXXX
XXXXX                         XXXXX
XX@XX     > will become >     XX@XX (nothing happened)
XXXXX                         XXXXX
XXXXX                         XXXXX

Mais:

XXXXX                         XXXXX
XXXXX                         X---X
XX@XX     > will become >     ----X (both bombs have exploded)
X!XXX                         ----X
XXXXX                         ---XX

Le nuke ( ~): Il ne fait rien, jusqu'à ce qu'il soit déclenché par une autre bombe. La différence est que cette bombe a un rayon d'explosion carré de 5x5 :

XXXXX                         XXXXX
XXXXX                         XXXXX
XX~XX     > will become >     XX~XX (nothing happened)
XXXXX                         XXXXX
XXXXX                         XXXXX

Mais:

XXXXX                         -----
XXXXX                         -----
XX~XX     > will become >     ----- (both bombs have exploded)
X!XXX                         -----
XXXXX                         -----

La tâche

  • Étant donné une carte 9x9 , sortez la carte après la réaction en chaîne.
  • Vous pouvez fournir une fonction ou un programme.
  • C'est du , donc la soumission avec le moins d'octets gagne!

Cas de test

Cas de test 1 ( 3 étapes ):

XXXXXXXXX           XXXXXXXXX
----XXXXX           ----XXXXX
XXXX@XXXX           XXXX@XXXX
XXXXXXXX-           XXX---XX-
XXXX@XXXX     >     ------XXX
XXXXXXXX-           ------XX-
XX~XXXXXX           -----XXXX
X!XXXXXX-           -----XXX-
XXXXXXXXX           -----XXXX

Cas de test 2 ( 2 étapes ):

XXXXXXXXX           XXXXXXXXX
XXXXXXXXX           XXXXXXXXX
XX~XXXXXX           XX~XXXXXX
---------           ---------
XXXX!XXXX     >     XXX---XXX
XXXXXXXXX           XXX------
XXX@@X@!X           XXX@@----
XXXXXXXXX           XXXXX----
XXXXXXXXX           XXXXXXXXX

Cas de test 3 ( 2 étapes ):

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

Cas de test 4 ( 1 étape ):

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

Cas de test 5 ( 9 étapes ):

!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---

Cas de test 6 ( 9 étapes ):

XX@@@XXXX           ------XXX
XXXXXXXXX           ------XXX
~XXXXXXXX           ---XXXXXX
XXXXXXXXX           ---XXXXXX
~XXXXXXXX     >     ---XXXXXX
XXXXXXXXX           ---XXXXXX
~XXXXXXXX           ---XXXXXX
@XXXXXXXX           ---XXXXXX
!XXXXXXXX           ---XXXXXX

Cas de test 7 ( 3 étapes ):

!XXXXXXXX           ---XXXXXX
X@XXXXXXX           ----XXXXX
XX@XXXXXX           ----XXXXX
XXXXXXXXX           X---X----
XXXXXX@@!     >     XXXXX----
XXXXXXXXX           X---X----
XX@XXXXXX           ----XXXXX
X@XXXXXXX           ----XXXXX
!XXXXXXXX           ---XXXXXX
Adnan
la source
4
Ma réponse est nettement plus courte que celle acceptée.
Adám
Peut baser une partie d'un atelier sur ce défi?
Adám

Réponses:

10

Matlab, 120 111 octets

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

La convolution est la clé du succès.

L'idée est la suivante: trouver la bombe active. Agrandir cette zone à un carré de 3x3. Trouvez de nouvelles bombes affectées, agrandissez les zones de correspondance à la taille correspondante et ajoutez-les à la zone précédemment détruite. Répétez cette opération suffisamment de fois (dans mon cas autant de fois que nous avons de caractères en entrée, juste parce que c'est la variante la plus courte) pour être sûr que nous avons atteint un point stationnaire (= plus de bombes qui explosent). Réglez ensuite toute la zone détruite sur -et affichez le résultat.

L'entrée est supposée être une matrice de caractères, par exemple

['!XXXXXXXX';
'X@XXXXXXX';
'XX@XXXXXX';
'XXX@XXXXX';
'XXXX@XXXX';
'XXXXX@XXX';
'XXXXXX@XX';
'XXXXXXX@X';
'XXXXXXXX@'];
flawr
la source
10

Retina , 188 168 154 152 octets

Octets comptés comme ISO 8859-1.

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

Essayez-le en ligne!

Il s'agit plus d'une preuve de concept. Il y a une horrible quantité de duplication entre les bombes et les armes nucléaires, dont je vais essayer de me débarrasser avant d'ajouter une explication. Eh bien, je me suis débarrassé de cette duplication, mais cela a considérablement augmenté la complexité et n'a donc pas permis de réaliser d'énormes économies ...

Martin Ender
la source
6

APL (Dyalog) , 56 caractères ou 62 octets *

Mon collègue Marshall a trouvé une solution élégante, 21 caractères plus courte que la mienne:

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

Essayez-le en ligne!

{} Fonction anonyme où l'argument est représenté par

'-'@()⍵Tirez sur les positions masquées par la fonction tacite suivante:

  '!'∘= Booléen où le point d'exclamation est égal à l'argument

  ()⍣≡ Appliquez la fonction tacite suivante jusqu'à ce que plus rien ne change:

   ×∘() Multiplier par la constante suivante:

    '~'=⍵ Booléen où tilde est égal à l'argument d'origine

    (… À )+ cela, ajoutez:

     'X'≠⍵ Booléen où X est différent de l'argument d'origine

   {}⌺5 5 Pour chacun, appliquez la fonction suivante sur la zone 5 × 5 centrée sur celle-ci:

    4↑1 prendre les quatre premiers éléments d'un, en remplissant avec des zéros [1,0,0,0]

    1+ ajouter un [2,1,1,1]

    5⍴ remodeler cycliquement en longueur cinq [2,1,1,1,2]

    ∘.⌈⍨ table maximale avec elle-même sur les deux axes

    ⍵≥ Booléen où les voisins correspondants sont supérieurs ou égaux à celui

    1∊ Booléen s'il en est vrai


* Remplacez simplement par ⎕U233A sous Classic pour un seul octet par caractère.

Adam
la source
dans le lien tio, l'entrée (à gauche de ">") est la même que la sortie (à droite de ">"), est-ce censé ressembler à ça?
ngn
@ngn Joliment repéré. La Dispfonction n'aurait jamais pu fonctionner. Mis à jour pour être un opérateur. Merci.
Adám
... et une question: @compte comme 1 octet en classique? ma conjecture est oui
ngn
@ngn Oui.
Adám
voici une idée pour 61 octets: '-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'⍳a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕( ⎕io←0)
ngn
4

Java, 574 562 558 549 525 523 octets

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
la source
Je sais que cela fait un bon moment que vous n'avez pas posté cela. Mais vous '-'pouvez jouer au golf quelques choses: les deux peuvent l'être 45. Les deux Math.max(...,0)peuvent être ...>0?...:0(la même chose pourrait être faite avec Math.min(...,9)mais c'est exactement la même quantité d'octets. 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);Peut être 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);. Et peut-être que vous pourriez en faire une fonction à la place du programme.
Kevin Cruijssen
1

APL (Dyalog Classic) , 61 octets

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

Essayez-le en ligne!

a←⎕ évaluer l'entrée et attribuer à a

i←,⍳⍴a les indices (paires de coordonnées) de toutes les cellules

('!'=,a)/ filtrer uniquement les bombes initialement actives

{ }⍣≡ effectuer une transformation sur la liste jusqu'à ce qu'elle se stabilise

  • 'X@~-'⍳a[⍵]remplacer 0 pour X, 1 pour @, etc, 4 pour autre chose ( !)

  • 3|mod 3 pour obtenir le "rayon" d'impact; il doit être supérieur ou égal à la ...

  • (↓⌈/¨|⍵∘.-i)≤ ... Manhattan distances entre les cellules de la liste et toutes les cellules

  • i/⍨∨⌿↑ obtenir un masque de bits dont les cellules sont affectées et sélectionner celles de i

'-'@( )⊢amettre -à ces positions

ngn
la source