Gardez mon voyage au frais!

11

Défi

En me promenant dans Marks and Spencers, j'ai remarqué qu'il y avait des climatiseurs placés au hasard dans le magasin. Voulant rester au frais, je me suis demandé quelle était la façon la plus simple de se déplacer dans tout le magasin sans être trop longtemps éloigné d'un climatiseur.

Étant donné une carte, vous devez trouver un moyen de parcourir toute la carte en gardant la distance d'une unité de climatisation aussi courte que possible (même si l'unité de climatisation est de l'autre côté d'un mur).

Carte

La carte peut être fournie comme vous le souhaitez et utilise les symboles suivants:

+ is a corner of a wall
| is a east/west facing wall
- is a north/south facing wall
X is an air conditioning unit
S is the start and end point

Un exemple de carte serait:

+------S---+
|   X      |
| ---+-+ X |
|    |X|   |
| ---+ +---+
|   X      |
+----------+

ou

+---+--+
| X |  |
|   |  +-----+------+
|   | X      | X    |
|     ---+       |  S
|   |    |  X    |  |
|   |  +-+-------+--+
| X    |
+------+

Voyager sur toute la carte signifie traverser chaque espace vide et climatiseur. Vous ne pouvez pas traverser un mur et ne pouvez voyager que orthogonalement. Une carte n'est pas toujours rectangulaire.

Garder la distance aussi courte que possible d'une unité AC est la somme de tous les pas de temps.

Passer, c'est entrer et sortir.

Vous pouvez sortir le chemin comme vous le souhaitez. Les exemples comprennent:

  • Sortie de la carte avec le chemin inclus
  • Sortie du chemin comme une succession de points cardinaux (par exemple NNSESW)
Beta Decay
la source
2
@BetaDecay Et comment est-ce calculé? La distance maximale à tout moment? La somme / moyenne de la distance sur tous les pas de temps?
Ingo Bürk
5
Il est impossible de comprendre quel est le but de ce problème. Si vous devez visiter chaque carré, la distance maximale est une constante.
feersum
1
@feersum Pourquoi cela? La disposition de la carte ne pouvait-elle pas obliger à revoir certains carrés et à donner ainsi de multiples possibilités pour le cheminement?
InvisiblePanda
6
Est-ce un problème d'optimisation? Sinon, il devrait y avoir des cas de test avec des sorties correctes.
mbomb007
2
Pourriez-vous nous donner la distance pour les deux seuls moyens de déplacement possibles pour le premier exemple?
mdahmoune

Réponses:

1

PowerShell pour Windows, 376 367 octets

Comme un homme paresseux, je ne vais pas à toutes les étagères, je passe du climatiseur au climatiseur dans un magasin. Je crois que j'ai voyagé partout dans le magasin pour visiter chaque climatiseur.

$f={param($m,$d,$o=@{})$w=(($l=$m-split"
")|% le*|sort)[-1]
$m=($l|% *ht $w)-join"
"
if(!$o.$m-or$o.$m-ge$d-and$m-match'(?s)X.*S|S.*X'){$o.$m=$d++
$n=-split")X(S )X(.{$w}S S)X( S.{$w})X("|%{sls "(?s)^(.*$_.*)$" -inp $m -a|% m*|%{($_.Groups-replace'S',' ')[1,2]-join'S'}}
$d=(($n+,($m-replace"(?s)(?<=S(.{$w})?) | (?=(.{$w})?S)",'S')*!$n)|%{&$f $_ $d $o}|sort)[0]}+$d}

Essayez-le en ligne!

Déroulé:

$f={
    param($map,$distance,$o=@{})
    $lines = $map-split"`n"
    $width = ($lines|% length|sort)[-1]
    $map = ($lines|% padRight $width)-join"`n"                              # to rectangle

    if(!$o.$map -or $o.$map-ge$distance -and $map-match'(?s)X.*S|S.*X'){
        $o.$map = $distance++                                               # store a map to avoid recalculations
        $n = -split")X(S )X(.{$width}S S)X( S.{$width})X("|%{               # search a nearest X in 4 directions
            select-string "(?s)^(.*$_.*)$" -InputObject $map -AllMatches|% Matches|%{
                ($_.Groups-replace'S',' ')[1,2]-join'S'                     # start a new segment (reset all S and replace the nearest X by S)
            }
        }
        $stepMore = $map-replace"(?s)(?<=S(.{$w})?) | (?=(.{$w})?S)",'S'
        $n += ,$stepMore*!$n                                                # add a step if X was not found
        $distance=($n|%{&$f $_ $distance $o}|sort)[0]                       # recursive repeat
    }

    +$distance
}
mazzy
la source