Halte meine Reise cool!


11

Herausforderung

Als ich um Marks and Spencers herumging, bemerkte ich, dass sie zufällig Klimaanlagen im Laden hatten. Um cool zu bleiben, fragte ich mich, wie ich mich am einfachsten im ganzen Geschäft bewegen konnte, ohne zu lange von einer Klimaanlage entfernt zu sein.

Bei einer gegebenen Karte müssen Sie einen Weg finden, um die gesamte Karte zu umrunden und den Abstand zu einer Klimaanlage so kurz wie möglich zu halten (auch wenn sich die Klimaanlage auf der anderen Seite einer Wand befindet).

Karte

Die Karte kann beliebig geliefert werden und verwendet die folgenden Symbole:

+ 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

Eine Beispielkarte wäre:

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

oder

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

Um die gesamte Karte zu umrunden, müssen Sie jeden leeren Raum und jede Klimaanlage passieren. Sie können nicht durch eine Wand reisen und dürfen nur orthogonal reisen. Eine Karte ist möglicherweise nicht immer rechteckig.

Wenn Sie den Abstand zu einem Wechselstromgerät so kurz wie möglich halten, ist dies die Summe aller Zeitschritte.

Durchgehen bedeutet ein- und aussteigen.

Sie können den Pfad beliebig ausgeben. Beispiele beinhalten:

  • Ausgabe der Karte mit dem enthaltenen Pfad
  • Ausgeben des Pfades als eine Abfolge von Himmelsrichtungen (z NNSESW)

2
@BetaDecay Und wie wird das berechnet? Die maximale Entfernung zu einem beliebigen Zeitpunkt? Die Summe / der Durchschnitt der Entfernung über alle Zeitschritte?
Ingo Bürk

5
Es ist unmöglich zu verstehen, was das Ziel dieses Problems ist. Wenn Sie jedes Feld besuchen müssen, ist die maximale Entfernung eine Konstante.
Feersum

1
@feersum Warum ist das so? Könnte es das Kartenlayout nicht erforderlich machen, bestimmte Quadrate erneut zu besuchen und so mehrere Möglichkeiten für die Pfadfindung zu schaffen?
InvisiblePanda

6
Ist das ein Optimierungsproblem? Wenn nicht, sollte es einige Testfälle mit korrekten Ausgaben geben.
mbomb007

2
Könnten Sie uns die Entfernung für die einzigen zwei möglichen Reisewege für das erste Beispiel geben?
Mdahmoune

Antworten:


1

PowerShell für Windows, 376 367 Byte

Wie ein fauler Mann gehe ich nicht in jedes Regal, sondern gehe in einem Geschäft von Klimaanlage zu Klimaanlage. Ich glaube, ich bin durch den ganzen Laden gereist und habe jede Klimaanlage darin besucht.

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

Probieren Sie es online aus!

Abgerollt:

$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
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.