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 code-golf , 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
Réponses:
Matlab,
120111 octetsL'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
la source
Retina ,
188168154152 octetsOctets comptés comme ISO 8859-1.
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 ...la source
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:
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 à celui1∊
Booléen s'il en est vrai* Remplacez simplement
⌺
par⎕U233A
sous Classic pour un seul octet par caractère.la source
Disp
fonction n'aurait jamais pu fonctionner. Mis à jour pour être un opérateur. Merci.@
compte comme 1 octet en classique? ma conjecture est oui'-'@({i/⍨∨⌿↑(↓⌈/¨|⍵∘.-i)≤3|'X@~-'⍳a[⍵]}⍣≡('!'=,a)/i←,⍳⍴a)⊢a←⎕
(⎕io←0
)Java,
574562558549525523 octetsla source
'-'
pouvez jouer au golf quelques choses: les deux peuvent l'être45
. Les deuxMath.max(...,0)
peuvent être...>0?...:0
(la même chose pourrait être faite avecMath.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 êtreint 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.APL (Dyalog Classic) , 61 octets
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 pourX
, 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 cellulesi/⍨∨⌿↑
obtenir un masque de bits dont les cellules sont affectées et sélectionner celles dei
'-'@( )⊢a
mettre-
à ces positionsla source