Étant donné l'entrée d'une "route" de l'art ASCII, sortez la route avec toutes les impasses étiquetées.
Ceci est une route:
########.....######..#..###
#......#######....#..#..#.#
#.##......#...#####..#..###
#..#####..#....#..#######.#
#......#...#####.....##...#
#..###.#...#...###...#..###
##########.#..#..##..#.##.#
..#......#.######.#..#.#.#.
..#......#.#..#.#.#..#.#.#.
..######.###..##..#########
Voici la route avec des impasses marquées de la lettre X
:
########.....######..X..###
#......#######....#..X..#.#
#.XX......X...X####..X..###
#..XXXXX..X....#..#######.#
#......X...#####.....##...#
#..###.X...#...###...#..###
##########.#..X..##..#.##.X
..X......#.#XXXXX.#..#.#.X.
..X......#.#..X.X.#..#.#.X.
..XXXXXX.###..XX..######XXX
Une impasse est définie comme toute tuile de route qui borde n autres tuiles de route, dont au moins n-1 sont déjà considérées comme des impasses par cette règle. "Border" est dans les quatre directions cardinales, donc les tuiles bordant en diagonale ne comptent pas.
Cette règle est appliquée à plusieurs reprises, car les impasses nouvellement créées peuvent, elles-mêmes, créer plus d' impasses . Notez également que toute tuile de route qui borde une seule autre tuile de route est considérée comme une impasse la première fois que la règle est appliquée.
L'entrée et la sortie peuvent être soit une chaîne unique (avec des lignes séparées par un caractère différent de #
ou .
), soit un tableau / liste / etc. Si votre langue le prend en charge, vous pouvez également prendre des entrées, chaque ligne étant un argument de fonction.
Vous pouvez supposer ce qui suit à propos de l'entrée:
Il y aura toujours au moins une "boucle", c'est-à-dire un groupe de
#
caractères pouvant être suivis à l'infini. (Sinon, chaque tuile deviendrait une impasse.)Cela implique que l'entrée sera toujours 2 × 2 ou plus, car la plus petite boucle est:
## ##
(Qui, soit dit en passant, devrait être sorti sans changement.)
Tous les
#
personnages seront connectés. Autrement dit, si vous effectuiez un remplissage d'inondation sur l'un#
d'entre eux, tous seraient affectés.
Puisqu'il s'agit de code-golf , le code le plus court en octets gagnera.
L'exemple ci-dessus et la minuscule grille 2 × 2 peuvent être utilisés comme cas de test (il n'y a pas beaucoup de cas de bord à couvrir dans ce défi).
'#
et"#"
différents dans CJam?"#"
est égal à['#]
.JavaScript (ES6),
110109 octets1 octet enregistré grâce à @ edc65 !
Explication
Approche très simple du problème. Recherche chacun
#
, et s'il y a moins de 2#
s autour, le remplace par unX
. Répète ce processus plusieurs fois jusqu'à ce qu'il soit garanti que toutes les impasses ont été remplacées par l'X
art.la source
l=~r.search
place del=1+r.search
. (1 octet seulement enregistré)Python (3.5)
362331329314 octetsmerci à @Alissa. elle m'aide à gagner ~ 33 octets
Explications
Définition de fonction
Ajoutez une bordure de '.' à droite et à gauche du plateau
Ajoutez une bordure de '.' en haut et en bas
Fonction lambda pour tester '#'
Boucle sur la longueur d'entrée pour être sûr de ne pas oublier les impasses
Boucle sur colonnes et lignes
Testez si nous avons «#» autour et sur la position
Remplacez «#» par «X»
Recadrez la bordure remplie de '.' et se joindre à la chaîne
Usage
la source
split()
au lieu desplitlines()
. 2)t=['.'*(c+2)]+['.'+i+'.'for i in s]+['.'*(c+2)]
est plus court. Et cela peut être raccourci encore plus:d='.';t=[d*c]+t+[d*c];t=[d+i+d for i in t]
3) vous n'avez pas besoin de toute la liste (zip (....)), utilisezprint('\n'.join([''.join(i[1:-1])for i in t])
'str' object does not support item assignment
. la liste de liste me permet d'utiliser t [h] [x] = 'X'r
,g
etd
) hors de votre fonction (vous évite une tabulation). Peut-être que jouer avec split () pourrait aider:,t=[d+list(i)+d for i in s.split()]
puis calculer les longueurs, puis ajouter des lignes de points à la fin et au début, puis modifier vos cycles pour travailler avec ces longueurs étendues. Je ne sais pas si cela raccourcira le code, mais cela pourrait