Supposons que nous ayons une matrice comme celle-ci:
11111
12221
12321
12221
11111
Cette matrice représente un terrain et chaque cellule représente une portion de terrain. Le nombre dans chaque cellule représente le temps pendant lequel la portion de terrain doit être complètement brûlée (en minutes, si une unité de mesure est nécessaire), selon sa combustibilité . Si un feu démarre à une position donnée (cellule), cette cellule doit être complètement brûlée avant que le feu ne se propage aux cellules adjacentes (horizontale et verticale uniquement, pas en diagonale). Donc, si un feu est démarré en position centrale, le feu a besoin:
11111 11111 11111 11011 10001 00000
12221 3 m. 12221 2 m. 12021 1 m. 11011 1 m. 00000 1 m. 00000
12321 -----> 12021 -----> 10001 -----> 00000 -----> 00000 -----> 00000
12221 12221 12021 11011 00000 00000
11111 11111 11111 11011 10001 00000
Explication:
- Le feu commence à [2,2] (sur la base de 0), ce qui a un temps de combustion de 3.
- Après 3 minutes, [1,2], [2,1], [2,3], [3,2] commencent à brûler.
- Après 2 minutes, ces cellules finissent de brûler et le feu se propage à toutes les cellules adjacentes, mais [0,2], [2,0], [2,4], [0,4] n'ont besoin que d'une minute de plus pour brûler, donc
- Après 1 minute, ces cellules sont brûlées et la cellule se propage aux cellules adjacentes.
- Après 1 minute de plus, le reste des cellules de l'étape 3 finit de brûler et le feu se propage vers leurs cellules adjacentes (qui sont déjà brûlées, donc rien ne se passe).
- Après 1 dernière minute, le feu finit de brûler tout le terrain.
La solution à ce cas est donc de 8 minutes. Si le feu démarre dans la cellule la plus à gauche [0,0]:
11111 01111 00111 00011 00001 00000
12221 1 12221 1 02221 1 01221 1 00121 1 00011 1
12321 --> 12321 --> 12321 --> 02321 --> 01321 --> 00321 -->
12221 12221 12221 12221 02221 01221
11111 11111 11111 11111 11111 01111
00000 00000 00000 00000 00000
00000 1 00000 1 00000 1 00000 1 00000
00221 --> 00110 --> 00000 --> 00000 --> 00000
00221 00121 00020 00010 00000
00111 00011 00001 00000 00000
Alors maintenant, le temps total est de 10 minutes.
Le défi
Étant donné une matrice NxM (N> 0, M> 0) de valeurs entières qui représentent le temps nécessaire à chaque cellule pour être complètement consommée, écrivez le programme / la fonction la plus courte qui prend cette matrice et une paire d'entiers avec la position dans laquelle le feu commence. , et retourne / imprime le temps nécessaire au feu pour consommer complètement le terrain entier.
- Chaque cellule aura un temps de combustion positif (non nul). Vous ne pouvez pas supposer une valeur maximale pour les cellules.
- La matrice n'a pas besoin d'être carrée ni symétrique.
- La matrice peut être indexée 0 ou indexée 1, comme vous le souhaitez.
- La position peut être donnée en tant que paramètre unique avec un tuple d'entiers, deux paramètres distincts de tout autre format raisonnable.
- Les dimensions de la matrice ne peuvent pas être spécifiées comme paramètres d'entrée.
- Vous n'avez pas besoin de sortir chaque étape intermédiaire, juste le temps demandé. Mais je ne me plaindrai pas si les étapes sont visualisées de quelque façon que ce soit.
Un autre exemple:
Fire starts at [1,1] (a '>' represents a minute):
4253 4253 4253 4153 4043 3033 2023 0001 0000
2213 > 2113 > 2013 > 1003 > 0002 > 0001 > 0000 >> 0000 > 0000
1211 1211 1211 1111 1001 0000 0000 0000 0000
Output: 9
C'est du golf de code , alors le programme le plus court pour chaque langue peut gagner!
la source
1
àM*N
Réponses:
Matlab,
235257190182178 178 octetsEntrée: matrice
A
, vecteur 1x2p
contenant les coordonnées de départ.Explication:
Au lieu de simuler la propagation du feu, nous pouvons également comprendre cela comme un problème de "trouver le chemin le plus long le plus court". La matrice est convertie en un graphique dirigé pondéré. Les poids des chemins vers un seul nœud correspondent au temps de gravure dudit nœud. Par exemple pour une matrice
on obtient le graphe connecté:
Où le nœud 1 est l'élément de matrice supérieur gauche et le nœud 12 l'élément inférieur droit. Étant donné les coordonnées de départ
p
, le chemin le plus court vers tous les autres nœuds est calculé. Ensuite, la longueur du chemin le plus long de ces chemins les plus courts + le temps de graver le nœud initial est égal au temps de graver la matrice entière.Version non golfée et commentée avec des exemples de valeurs de départ:
la source
;
après chaque ligne. Dans Matlab, cela empêche l'affichage des résultats de chaque commande dans la console. Actuellement, le code est TRÈS bavard et spamme la console. Mais comme ce n'est pas un état d'échec strict, je l'ai gardé ainsi. Mais ça n'a pas beaucoup d'importance, c'est juste 4 octetsJavaScript (ES6),
156152146144143 octets1 octet enregistré grâce à Kevin Cruijssen
Une implémentation plutôt naïve. Prend une entrée dans la syntaxe de curry
(a)(s)
, où a est un tableau 2D et s est un tableau de deux entiers [ x, y ] représentant les coordonnées basées sur 0 de la position de départ.Formaté et commenté
Cas de test
Afficher l'extrait de code
la source
==0
peut être joué au golf<1
si je ne me trompe pas.undefined<1
fausse. Merci!Octave, 67 octets
Essayez-le en ligne!
Pour visualiser les résultats intermédiaires, vous pouvez essayer ceci!
Une fonction qui prend comme matrice d'entrée du terrain
a
et les coordonnées initiales comme une matrice de 0 et 1 avec la même taille que le terrain.En fait, il n'est pas nécessaire
endfunction
cependant d'exécuter l'exemple in tio, il doit être ajouté.Explication:
Appliquer à plusieurs reprises une dilatation morphologique de l'image sur le terrain et en soustraire les zones brûlées.
Réponse non golfée:
la source
n=1
à jour a été remplacée parn=0
.MATL ,
2625 octetsLe format d'entrée est:
La première entrée est une matrice utilisant
;
comme séparateur de lignes.La deuxième entrée est un numéro unique qui adresse une entrée de la matrice dans un ordre de colonne majeur basé sur 1 (autorisé par le défi). Par exemple, la coordonnée colonne-majeure de chaque entrée dans une matrice 3 × 4 est donnée par
Ainsi, par exemple, les coordonnées basées sur 1 (2,2) correspondent à
5
.Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
Le code conserve une liste des entrées en cours de gravure. À chaque itération, toutes les entrées de cette liste sont décrémentées. Lorsqu'une entrée atteint zéro, ses entrées voisines sont ajoutées à la liste. Pour enregistrer des octets, les entrées qui atteignent zéro ne sont pas supprimées de la liste; au lieu de cela, ils continuent de "brûler" avec des valeurs négatives. La boucle est fermée lorsqu'aucune des entrées n'a de valeurs positives.
Voir le programme en cours d'exécution étape par étape avec du code légèrement modifié.
Code commenté:
la source
Python 2 , 170 octets
Essayez-le en ligne!
la source
Python 3 ,
277266 octetsEssayez-le en ligne!
Définit une fonction
f
qui prend une matrice 2D et un tuple de points. La première chose que fait la fonction est de définir un ensemble de tuples contenant la valeur de uplet initial transmis à:p={s}
. La fonction passe ensuite par chaque tuple de points dansp
et soustrait un de la matricem
à ce point, sauf si la valeur est déjà nulle. Il passe ensuite en revue àm
nouveau tous les points avec la valeur zéro et en ajoutant les quatre voisins de ce point à l'ensemblep
. C'est pourquoi j'ai choisi d'utiliser un ensemble, car les ensembles en Python n'autorisent pas les valeurs en double (ce qui bousillerait beaucoup la soustraction). Malheureusement, en raison de l'habillage d'index de liste (par exemplelist[-1] == list[len(list)-1]
:), les indices doivent être contraints afin qu'ils ne deviennent pas négatifs et qu'ils ajoutent les mauvaises coordonnées àp
.Rien de spécial, toujours habitué au golf. Certainement matière à amélioration ici, je vais continuer à le craquer.
la source
APL (Dyalog) ,
936657 octetsEssayez-le en ligne! ou visualisez-le en ligne!
Cette fonction prend la matrice de terrain comme argument de droite et les coordonnées (basées sur 1) du premier tir comme argument de gauche. Renvoie le nombre de minutes nécessaires pour tout graver.
Mises à jour
Enfin trouvé un moyen de jouer au golf sur la fonction de propagation.
* Soupir * ce serait tellement plus facile si le monde était toroïdal .
TIO vient d'être mis à niveau vers Dyalog 16.0 , ce qui signifie que nous avons maintenant le nouvel opérateur de pochoir brillant
la source
Python 2 , 268 octets
Essayez-le en ligne!
Itérer récursivement sur des pas de temps dans lesquels le nombre de chaque tuile est réduit s'il est cardinalement adjacent à un 0. Algorithme très simple qui, je crois, peut encore être joué pour l'efficacité booléenne ...
* remarque: mon "Essayez-le en ligne!" le code inclut la journalisation du débogage bonus dans le pied de page. J'aime regarder la progression de l'algorithme.
la source
Haskell ,
138133 bytesEssayez-le en ligne!
Suppose que l'entrée est une liste de ((x, y), cellule). Non golfé:
la source