重力制御


8

あなたの仕事は、惑星に落下しているオブジェクトの総目的地を見つけることです、あなたはこのような入力を得るでしょう:

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

ここで、Oは惑星で、#はオブジェクトです。惑星は、基本的な方向(ニュース)からオブジェクトを引き付けます。あなたは出力する必要があります:

    #
   #O#
    #

つまり、目的地に到達した後のオブジェクト。

入力として与えられる最初の数は、grid(nxn)の長さです。上記の例では7です。

オブジェクトは常に最短方向に移動する必要があります(使用できる方向は水平方向と垂直方向のみです。オブジェクトは斜​​めに移動できません)。

オブジェクトが2つの方向から等距離にある場合、時計回りの方向に移動する必要があります。

    ..#       
    ...  
    O..  

この側に到達します:

    ...
    ...
    O#.

オブジェクトが惑星に衝突すると、停止します。別のオブジェクトと衝突すると、それらは1つのオブジェクトになります。

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

になるでしょう:

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

最後の例:

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

出力:

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

注:最終的な形状を出力する必要があるため、惑星の最終的な形状を示している限り、すべての出力が受け入れられます。

たとえば、この入力の場合:

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

出力する必要があります:

O#

または

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

これらは両方とも受け入れられます。

これは ので、最も短い答えが勝ちます

注2:

お気づきかもしれませんが、a .は真空を表すので、最短経路は最短のドット数です。

例えば:

.#.
...
.O.

受け入れられない

O#

最短経路は垂直であるためです。 注3:

オブジェクトは常に4つの方向のいずれかで惑星と同じ線上に移動する必要があります(最短を選択)

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

制限:

2 <= n <= 100


可能な入力サイズは何ですか?
— 地下

2
「最短方向」を明確にしてください。
— ケンA

@KenA私はそれを次のように言い換えることができると思います。オブジェクトは、惑星と一直線になるまで、惑星に向かって斜めに移動します(その後、惑星に向かってまっすぐに移動します)。オブジェクトが対角線上で惑星に接触してしまう場合は、最後の1ステップを反時計回りに動かします。これにより、OPの仕様と同じ結果になります。しかし、OPによる明確化は良いでしょう。
— マーティンエンダー

上記の例では、一部の行の末尾に空白が続いていることに気付きました。プログラムが処理することが期待される入力についても同じことが当てはまると想定しても安全ですか?
— skibrianski 2014

@skib no。これはタイプミスかもしれませんが、入力に末尾の空白がありません。
— Mhmd 2014

回答:


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/#/

読みやすさのための改行。-0777p(カウントに5を追加)で実行し、STDINを介して入力します。

より読みやすい:

$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/#/

すごいoO =)詳細な説明は、Perlのreエンジンと特殊変数に精通していない人にはうれしいでしょう。
— skibrianski 2014

@skibrianski、ありがとう。私は特別なことは何もせず、OPにメモが追加された後に答える方が簡単でしたが、あなたの言うとおりです。コードを文書化する必要があります。
— user2846289 14

一見して明白ではないかもしれないことは、$=「magick」変数(整数のみにすることができ、5文字の「int()」を節約できる)を使用し\G、検索パターンでアンカーを使用することです。ここでは、pos(デフォルトの引数がである$_)関数に割り当てることで位置を設定します。
— user2846289 14

6

Mathematica、206バイト

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}<>"")&

やや読みやすい:

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], "."
  }]
);

ご覧のとおり、入力マップを含む文字列である単一の入力のみを受け取ります。とにかく私は整数サイズを使用しないからです。入力形式を主張する場合は、入力文字列をもう1文字の2番目の引数に変更できます。

アルゴリズムについて{Δx, Δy}は、オブジェクトのすべてのペアを収集し、条件をに渡して各象限で1つのペアを探していhます。これは、さらにゴルフをすることができる部分でもあると思います。


あなたがMathematicaの愛好家であることも知りませんでした!
— Andrew Cheong

1
@AndrewCheongあなたが物理学を勉強しているソフトウェア開発者であるときにそれは自然に来ると思います。;)
— Martin Ender 14

5

perl、270文字

3つのステップ:1)入力で惑星と衛星を見つける、2)各衛星の象限を決定する、3)出力する

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

より少ないゴルフ:

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;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.