Mantieni il mio viaggio fresco!


11

Sfida

Passeggiando per Marks e Spencer, ho notato che avevano unità di aria condizionata posizionate casualmente in tutto il negozio. Volendo mantenere la calma, mi chiedevo quale fosse il modo più semplice per spostarsi in tutto il negozio senza rimanere troppo a lungo da un condizionatore d'aria.

Data una mappa, è necessario trovare un modo per spostarsi su tutta la mappa mantenendo la distanza da un'unità di condizionamento il più breve possibile (anche se l'unità CA si trova sull'altro lato di un muro).

Carta geografica

La mappa può essere fornita nel modo che preferisci e utilizza i seguenti simboli:

+ 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

Una mappa di esempio sarebbe:

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

o

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

Percorrere l'intera mappa significa passare attraverso ogni spazio vuoto e condizionatore d'aria. Non puoi viaggiare attraverso un muro e puoi viaggiare solo ortogonalmente. Una mappa potrebbe non essere sempre rettangolare.

Mantenere la distanza il più breve possibile da un'unità CA è la somma in tutti i passaggi temporali.

Passare significa entrare e uscire.

È possibile generare il percorso nel modo desiderato. Esempi inclusi:

  • Stampa della mappa con il percorso incluso
  • Elaborazione del percorso come una successione di punti cardinali (ad es. NNSESW)

2
@BetaDecay E come viene calcolato? La distanza massima in qualsiasi momento? La somma / media della distanza in tutti i passaggi temporali?
Ingo Bürk,

5
È impossibile capire quale sia l'obiettivo di questo problema. Se devi visitare ogni piazza, la distanza massima è una costante.
febbraio

1
@feersum Perché? Il layout della mappa non potrebbe rendere necessario rivisitare determinati quadrati e dare così più possibilità per il percorso?
Invisibile

6
È un problema di ottimizzazione? In caso contrario, ci dovrebbero essere alcuni casi di test con output corretti.
mbomb007,

2
Potresti darci la distanza per le uniche due possibili modalità di viaggio per il primo esempio?
mdahmoune,

Risposte:


1

PowerShell per Windows, 376 367 byte

Come un uomo pigro, non vado su tutti gli scaffali, vado dal condizionatore d'aria al condizionatore d'aria in un negozio. Credo di aver viaggiato in tutto il negozio visitando ogni condizionatore d'aria in esso.

$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}

Provalo online!

srotolato:

$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
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.