Puisque demain est le 4 mai, voici un petit post sur le thème de Star Wars pour vous préparer mentalement à toutes les mauvaises blagues à venir demain.
PASSÉ
Au cours d'une session du Sénat galactique, tous les sénateurs sont assis sur une n*n
grille. Une soudaine éclosion de grippe JarJar (qui dure éternellement et fait parler les personnes infectées comme JarJar Binks) provoque l'infection de certains sénateurs.
Voici un exemple avec une 6*6
grille où se X
trouvent les sénateurs infectés, la liste correspondante est [[0,5],[1,4],[2,3],[2,1],[3,3],[3,0],[4,5],[0,5]]
:
Après cela, l'infection commence à se propager étape par étape. Deux sénateurs sont adjacents s'ils partagent un bord entier sur la grille (c'est-à-dire en haut, en bas, à droite, à gauche), ce qui signifie que nous excluons les diagonales.
Nous pouvons conclure qu'un sénateur peut être adjacent à 2,3 ou 4 autres sénateurs et réclamer les règles suivantes pour l'infection:
- Un sénateur infecté reste infecté pour toujours
- Un sénateur est infecté à une étape s'il était adjacent à 2 sénateurs infectés ou plus à l'étape précédente
Voici un exemple avec la grille précédente qui montre les 2 premières étapes de l'infection:
Après les prochaines étapes, tout le Sénat sera infecté
TA TÂCHE
Votre code n'a pas besoin de gérer des entrées non valides comme une liste supérieure à n*n
ou des coordonnées qui ne sont pas distinctes.
Votre code prendra en entrée une liste de couples d'entiers (ou une grille binaire ou tout autre format adapté à votre langue) et un entier n
(qui peut être inutile si vous utilisez un autre format qu'une liste), par exemple:
8 [[1,2],[1,1],[7,4],[2,7],[4,3]]
n étant le côté de la grille, ce qui signifie que la grille sera une grille * n, et la liste des couples d'entiers étant les coordonnées des cellules des sénateurs initialement infectés.
Le coin inférieur gauche de la grille est [0,0] et le coin supérieur droit est [n-1, n-1]. Le coin supérieur gauche est [0, n-1].
Votre code doit générer un entier:
-1
ou une valeur falsifiée ou une erreur si toute la grille ne sera jamais totalement infectée ou le nombre minimum d'étapes nécessaires pour infecter toute la grille
Cas de test
6 [[0,5],[1,4],[2,3],[2,1],[3,3],[3,0],[4,5],[5,0]] => 7
4 [[1,1][0,3][1,0][3,0][3,3]] => 9
N'oubliez pas qu'il s'agit de code-golf , donc la réponse la plus courte en octets gagne!
n
? Y a-t-il une valeur maximale?CellularAutomaton
...Réponses:
MATL,
2928 octetsL'entrée se présente sous la forme d'une matrice 2D de 1 et de 0
Essayez-le sur MATL Online
Explication
la source
tn:"tlY6Z+1>Z|t?x@D.]]N?xl_
? (Je n'ai pas beaucoup testé). Si tous les éléments sont 1 à un moment donné, affichez immédiatement l'index de boucle et supprimez la pile. À la fin de la boucle, si la pile n'est pas vide, supprimez et poussez-1
APL (Dyalog 16.0), 54 caractères ou 60 octets
Prend la matrice incluse comme argument, renvoie le numéro de l'étape qui termine l'infection, c'est-à-dire que 1 = est déjà complètement infecté. 0 = ne se propage pas complètement, ce qui est juste 1 + les nombres de l'OP.
54 caractères (Unicode):
60 octets (classique):
⌺
est équivalent à⎕U233A
Exemples d'exécution:
Les étapes sont les suivantes:
la source
Pyth , 49 octets
Suite de tests .
Utilise l'indexation 1 pour la sortie.
la source
Python, 231 octets
Il déclenche une erreur si ce n'est pas possible.
Essayez-le en ligne!
la source
0/0
enregistre deux octets deraise
. Peut1/(g!=h)
- être que ça marcherait? (alors le toutwhile
pourrait aussi être aligné).q=lambda r,c:g[r][c]if(0<=r<m)*(0<=c<m)else 0
12. Vous pouvez sauve supprimer l'espace entre (a)1
etfor
(b)]
etfor
aussi.JavaScript (ES6), 132 octets
Où
\n
représente le caractère de nouvelle ligne littéral. Prend l'entrée comme une chaîne de0
s et1
s dans un tableau délimité par des sauts de ligne. RenvoieNaN
si la grille ne sera jamais complètement infectée.la source