Le démineur est un jeu populaire où le joueur doit trouver les mines à l'aide d'indices numériques qui indiquent combien de mines sont directement adjacentes (horizontalement, verticalement, en diagonale) à une case.
Ta tâche consiste à ajouter le décompte des mines aux cases vides d'un plateau de Minesweeper terminé.
Le plateau lui-même est un rectangle composé de cases, qui sont soit vides (' '), soit des mines ('*').
Pour chaque case vide, compte le nombre de mines adjacentes (horizontalement, verticalement, en diagonale). Si la case vide n'a aucune mine adjacente, laisse-la vide. Sinon, remplace-la par le nombre de mines adjacentes.
Par exemple, tu peux recevoir un plateau de 5 x 4 comme celui-ci (les cases vides sont ici représentées par le caractère « · » pour l'affichage à l'écran) :
·*·*·
··*··
··*··
·····
Ton code doit le transformer en ceci :
1*3*1
13*31
·2*2·
·111·
Toutes les entrées et sorties sont en ASCII.
Les String et les &str de Rust sont en utf8, donc même si l'on pourrait s'attendre à ce que "Hello".chars() soit simple, il doit en réalité vérifier chaque char pour savoir s'il fait 1, 2, 3 ou 4 u8 de long.
Si on sait qu'un &str est en ASCII, on peut alors appeler .as_bytes() et voir les données sous-jacentes comme un &[u8] (une tranche d'octets).
Parcourir une tranche d'octets ASCII est bien plus rapide, car aucun point de code n'entre en jeu : chaque octet ASCII fait un u8 de long.
Peux-tu relever le défi sans cloner l'entrée ?
Inscris-toi sur Exercism pour apprendre et maîtriser Rust avec 99 exercices, et un vrai mentorat humain, le tout gratuitement.
On explore les boucles `for` imbriquées, l'utilisation astucieuse de min/max pour simplifier la vérification des bornes, les _pipelines_ fonctionnels et le recours à des matrices à deux dimensions.