Alors, voici une carte, disons, d'un donjon ...
##########
# #####
# #####
##########
##########
##########
##########
#### ##
#### ##
##########
Disons que le héros est dans la salle A (en haut à gauche) et que son but (un prince en détresse?) Est dans la salle B (en bas à droite). Notre carte ne permet pas au héros de progresser vers son objectif.
Nous devons ajouter un passage ...
##########
# #####
# #####
####.#####
####.#####
####.#####
####.#####
#### ##
#### ##
##########
Là, bien mieux!
Règles
- Un programme ou une fonction qui accepte une carte de donjon (composée de hachages et d'espaces, avec des lignes séparées par de nouveaux caractères de ligne).
- Il produira une carte avec des points ajoutés pour indiquer les passages dans tous les espaces qui sont sur un chemin direct entre les caractères de l'espace.
- Cela ne changera ni la longueur ni le nombre de lignes.
- Les passages sont tous en ligne directe d'espaces en espaces.
- Les passages ne peuvent pas tourner dans les coins
- Ils ne seront pas entre les espaces et le bord de la carte.
- Utilisez n'importe quelle langue.
- Essayez d'effectuer la conversion dans le moins d'octets.
- Si aucun passage ne peut être tracé, renvoyez la carte sans changement.
- La carte doit toujours avoir des hachages sur tous les bords (vous n'avez pas besoin de gérer les espaces sur le bord).
- Les cartes en entrée sont toujours rectangulaires, chaque ligne doit avoir la même largeur.
Cas de test
#### ####
# # => # #
# # # #
#### ####
########## ##########
# ##### # #####
# ##### # #####
########## ####.#####
########## => ####.#####
########## ####.#####
########## ####.#####
#### ## #### ##
#### ## #### ##
########## ##########
########## ##########
# ##### # #####
# ##### # #####
########## ##########
########## => ##########
########## ##########
########## ##########
###### ## ###### ##
###### ## ###### ##
########## ##########
########## ##########
# ##### # #####
# ##### # #####
########## ####.#####
########## => ####.#####
#### ### #### ###
########## ######.###
###### ## ###### ##
###### ## ###### ##
########## ##########
########## ##########
# ##### # #####
# ##### # #####
########## ##..######
########## => ##..######
########## ##..######
########## ##..######
## ####### ## .######
## ###### ## ######
########## ##########
########## ##########
# ##### # #####
# ##### # #####
########## #.########
########## => #.########
########## #.########
####### # #.##### #
####### # #.##### #
# ##### # # ..... #
########## ##########
########## ##########
# ##### # #####
# ##### # #####
########## #.########
##### ### => #.### ###
##### ### #.### ###
####### # #.##### #
####### # #.##### #
# ##### # # ..... #
########## ##########
########## ##########
## # ## #
########## ##......##
########## ##......##
########## => ##......##
########## ##......##
########## ##......##
########## ##......##
# ## # ##
########## ##########
########## ##########
#### #### #### ####
####### ## ####..# ##
###### ### ####.. ###
# ### ## # => # ... .. #
# ## ### # # .. ... #
### ###### ### ..####
## ####### ## #..####
#### #### #### ####
########## ##########
#
et.
?Réponses:
Gelée , 17 octets
Essayez-le en ligne!
Tricky -1 grâce à user202729 .
Explication:
la source
Perl 5
-p0
, 56 octetsEssayez-le en ligne!
la source
APL + WIN, 87 octets
Invite pour la matrice de caractères:
la source
Haskell ,
209165162 octets.Essayez-le en ligne!
Ce n'est pas la façon la plus efficace de le faire à Haskell, j'en suis sûr.
Il y a trop de parenthèses à mon goût mais je ne sais plus comment les supprimer.la source
$
((k(take 2 c))
devient(k$take 2 c)
). Vous pouvez également utiliser!!0
au lieu dehead
dans certains cas.(k(take 2 c))
vous pouvez simplement supprimer les parenthèses externes, elles ne sont pas nécessaires. Mais dans le cas oùdrop(length(head d))
vous pouvez toujours utiliser le$
, le remplacer pardrop(length$head d)
(et mêmedrop(length$d!!0)
).k
place de,++
vous pouvez réduire considérablement la dernière ligne.k[' '<$k(take 2 c),'.'<$d!!0,drop(length$d!!0)$f$k$d]
.f b|(e:g:d@(h:_:_))<-group b=k[' '<$e++g,'.'<$h,drop(length h)$f$k d]|1>0=' '<$b
, cela utilise une correspondance de motif pour faire beaucoup de travail lourd qui était fait auparavant.Python 2 ,
173148 octetsEssayez-le en ligne!
la source
Retina 0.8.2 , 95 octets
Essayez-le en ligne! Explication:
Cela recherche les
#
signes qui sont au-dessus des espaces ou des.
s et les transforme en points jusqu'à ce qu'il n'en reste plus. Le lookbehind trouve la#
colonne de puis le lookahead passe à la ligne suivante et atomiquement à la même colonne ci-dessous afin que l'espace ou.
ne puisse correspondre que s'il est exactement en dessous de la#
.Cela recherche les
.
s qui ne sont pas en dessous des espaces ou.
s et les transforme en#
s jusqu'à ce qu'il n'en reste plus. Le lookahead trouve la.
colonne de et puis le lookbehind passe à la ligne précédente et atomiquement à la même colonne ci-dessus de la même manière de sorte que l'espace ou.
ne peut correspondre que s'il est exactement au-dessus de la#
. Un lookbehind négatif est utilisé afin que cela fonctionne également pour.
s dans la rangée supérieure.(Notez l'espace de fin sur les deux lignes) Cela recherche simplement toutes les séries de caractères non blancs entre les espaces et garantit qu'ils sont tous
.
s.la source
Rubis , 104 octets
Essayez-le en ligne!
Eh bien, ce n'est pas génial, mais au moins c'est compliqué. Je suis sûr que cela peut être amélioré.
la source
Stax , 19 octets
Exécuter et déboguer
la source
JavaScript (Node.js) ,
205193190 190186181175172 bytesEssayez-le en ligne!
Commenté
la source