Schwerkraftsteuerung

8

Ihre Aufgabe ist es, das Gesamtziel von Objekten zu finden, die auf einen Planeten fallen. Sie erhalten folgende Eingaben:

7
...#...     
.......  
#..O..#
.......  
...#...
.......
.......

Dabei ist O der Planet und # die Objekte. Beachten Sie, dass der Planet Objekte aus den für grundlegende Richtungen (NEWS) anzieht. Sie sollten Folgendes ausgeben:

    #
   #O#
    #

dh die Objekte nach Erreichen ihres Ziels.

Die erste als Eingabe angegebene Zahl ist die Länge des Gitters (nxn), im obigen Beispiel ist es 7.

Das Objekt sollte sich immer in der kürzesten Richtung bewegen (beachten Sie, dass die zulässigen Richtungen nur horizontal und vertikal sind; das Objekt kann sich nicht diagonal bewegen).

Wenn ein Objekt aus zwei Richtungen gleich weit entfernt ist, sollte es im Uhrzeigersinn gehen:

    ..#       
    ...  
    O..  

Wird diese Seite erreichen:

    ...
    ...
    O#.

Wenn ein Objekt mit dem Planeten kollidiert, stoppt es. Wenn es mit einem anderen Objekt kollidiert, werden sie zu einem Objekt.

 4
 .#..
 #...
 ....  
 .O..

würde werden:

  ....
  ....
  .#..
  .O..

Ein letztes Beispiel:

6
..#...
.#....
......
.#O...
....#.
......

Ausgabe:

......
......
..#...
.#O#..
......
......

Hinweis: Sie sollten die endgültige Form ausgeben, damit alle Ausgaben akzeptiert werden, solange sie die endgültige Form des Planeten anzeigen.

Zum Beispiel für diese Eingabe:

...#
....
.O..
....

Sollte ausgeben:

O#

oder

....
....
.O#.
....

Beides wird akzeptiert.

Dies ist also gewinnt die kürzeste Antwort

Anmerkung 2:

Wie Sie vielleicht bemerkt haben, .stellt ein Vakuum dar, so dass der kürzeste Weg die kürzeste Anzahl von Punkten ist.

Zum Beispiel:

.#.
...
.O.

Wird nicht akzeptiert zu sein

O#

da der kürzeste Weg vertikal ist. Notiz 3:

Das Objekt sollte sich immer in einer der vier Richtungen in derselben Linie wie der Planet bewegen (Auswahl der kürzesten).

     |<#
     |
     |  
-----O------
     |

Beschränkungen:

2 <= n <= 100

Mhmd
quelle
Was sind die möglichen Eingabegrößen?
U-Bahn:
2
Bitte klären Sie "kürzeste Richtung".
Ken A
@ KenA Ich denke, es könnte wie folgt umformuliert werden: Objekte bewegen sich diagonal auf den Planeten zu, bis sie mit dem Planeten übereinstimmen (danach bewegen sie sich direkt auf den Planeten zu); Wenn ein Objekt den Planeten diagonal berührt, bewegen Sie einen letzten Schritt gegen den Uhrzeigersinn. Dies sollte zu demselben Ergebnis führen wie die Spezifikation des OP. Aber eine Klarstellung durch das OP wäre schön.
Martin Ender
Ich habe festgestellt, dass Ihr Beispiel oben am Ende einiger Zeilen ein Leerzeichen enthält. Ist es sicher anzunehmen, dass dies auch für die Eingabe gilt, die das Programm verarbeiten soll?
Skibrianski
@ Skib Nr. Es könnte ein Tippfehler sein, aber die Eingaben haben kein nachfolgendes Leerzeichen.
Mhmd

Antworten:

2

Perl, 156 153 148

$n=$_+1;
s/.+\n//;
$o=index$_,O;
$x=$o%$n-$-[0]%$n,
pos=$o+(($==($o-$-[0])/$n)&&$x/$=>-1&&$x/$=<=1?$=>0?-$n:$n:0<=>$x),
s/\G./x/ while s/#/./;
y/x/#/

Zeilenumbrüche zur besseren Lesbarkeit. Führen Sie mit -0777p(5 zur Zählung hinzugefügt) aus und geben Sie es über STDIN ein.

Besser lesbar:

$n=$_+1;
s/.+\n//;
$o=index$_,O;
while(s/#/./){
    $x=$o%$n-$-[0]%$n;
    $==($o-$-[0])/$n;
    pos=$o+(
        $=
        &&$x/$=>-1
        &&$x/$=<=1
            ?$=>0
                ?-$n
                :$n
            :0<=>$x

    );
    s/\G./x/
}
y/x/#/
user2846289
quelle
Wow oO =) Weitere Erklärungen wären nett für diejenigen, die mit Perls Re-Engine und speziellen Variablen nicht vertraut sind.
Skibrianski
@ Skibrianski, danke. Obwohl ich nichts Besonderes getan habe und es für mich einfacher war zu antworten, nachdem Notizen zum OP hinzugefügt wurden, haben Sie Recht: Wir sollten unseren Code dokumentieren.
user2846289
Was auf den ersten Blick vielleicht nicht offensichtlich ist, ist die Verwendung $=der Variablen 'magick' (die nur eine ganze Zahl sein kann - spart uns 5 Zeichen 'int ()') und die Verwendung des \GAnkers im Suchmuster. Hier setzen wir seine Position durch Zuweisen zur posFunktion (deren Standardargument ist $_).
user2846289
6

Mathematica, 206 Bytes

f=(m=Characters@StringSplit@#;o=#-Join@@m~(p=Position)~"O"&/@m~p~"#";h=If[MemberQ[#3/@o,{m_,n_}/;m#<0&&m#<=n#2<-m#],"#",e]&;{e=".",h[1,1,#&],e,n="\n",h[1,-1,r=Reverse],"O",h[-1,1,r],n,e,h[-1,-1,#&],e}<>"")&

Etwas lesbarer:

f[input_] := (
  map = Characters @ StringSplit @ input;
  planet = Flatten[Position[map, "O"]];
  objects = Map[# - planet &, Position[map, "#"]];
  helper[pattern_] := If[
    Length[Position[objects, pattern]] > 0, 
    "#", 
    "."
  ];
  StringJoin[{
    ".", h[{m_, n_} /; m < 0 && m <= n < -m], ".", "\n",
    h[{m_, n_} /; n < 0 && n < m <= -n], "O", h[{m_, n_} /; n > 0 && -n <= m < n], "\n",
    ".", h[{m_, n_} /; m > 0 && -m < n <= m], "."
  }]
);

Wie Sie sehen können, nehme ich nur eine einzige Eingabe, die die Zeichenfolge ist, die die Eingabekarte enthält. Dies liegt daran, dass ich die Größenzahl sowieso nicht verwenden würde. Wenn Sie auf dem Eingabeformat bestehen, kann ich die Eingabezeichenfolge für ein weiteres Zeichen in das zweite Argument ändern.

Was den Algorithmus betrifft, sammle ich nur alle {Δx, Δy}Paare der Objekte und suche in jedem Quadranten nach einem Paar mit den Bedingungen, an die übergeben wurde h. Ich vermute, dass dies auch der Teil ist, der weiter unten gespielt werden könnte.

Martin Ender
quelle
Ich wusste nicht, dass Sie auch ein Mathematica-Enthusiast sind!
Andrew Cheong
1
@ AndrewCheong Ich nehme an, das kommt natürlich, wenn Sie ein Softwareentwickler sind, der Physik studiert. ;)
Martin Ender
5

Perl, 270 Zeichen

3 Schritte: 1) Finden des Planeten und der Satelliten in der Eingabe, 2) Bestimmen des Quadranten für jeden Satelliten, 3) Ausgabe

sub _{"#"}$D=<>;$\=$/;for$L(1..$D){for$M(1..$D){$/=\1;$_=<>;$p=$M,$q=$L if/O/;push@s,[$M,$L] if/#/}$/=$\;<>}for(@s){$x=$_->[0]-$p,$y=$_->[1]-$q;($x<0&&$x<$y&&$y<=-$x?$l:$x>0&&-$x<=$y&&$y<$x?$r:$y<0&&$y<=$x&&$x<-$y?$u:$d)=_}$_=$l?" #":_;$u&&print;print $l."O$r";$d&&print

Weniger Golf:

sub _{"#"}
$D=<>;
$\=$/;
for$L(1..$D){
  $/=\1;
  for$M(1..$D){
    $_=<>;
    $p=$M,$q=$L if/O/;
    push@s,[$M,$L] if/#/;
  }
  $/=$\;
  <>
}

for(@s){
  $x=$_->[0]-$p,$y=$_->[1]-$q;  

  ($x<0&&$x<$y&&$y<=-$x ? $l :
   $x>0&&-$x<=$y&&$y<$x ? $r :
   $y<0&&$y<=$x&&$x<-$y ? $u : $d)=_;
}

$_=$l?" #":_;
$u && print;
print$l."O$r";
$d && print;
skibrianski
quelle