Kiểm soát trọng lực


8

Nhiệm vụ của bạn là tìm tổng số đích của các vật thể rơi xuống một hành tinh, bạn sẽ nhận được đầu vào như thế này:

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

Trong đó O là hành tinh và # là các đối tượng, lưu ý rằng hành tinh sẽ thu hút các đối tượng từ các hướng cơ bản (TIN TỨC). Bạn nên xuất:

    #
   #O#
    #

tức là các đối tượng sau khi đến đích.

Số đầu tiên được đưa ra làm đầu vào là chiều dài của lưới (nxn), trong ví dụ trên là 7.

Đối tượng phải luôn di chuyển theo hướng ngắn nhất (lưu ý rằng các hướng được phép chỉ là ngang và dọc; đối tượng không thể di chuyển theo đường chéo)

Nếu một vật thể cách đều nhau từ hai hướng, nó sẽ đi theo hướng đồng hồ khôn ngoan:

    ..#       
    ...  
    O..  

Sẽ đến bên này:

    ...
    ...
    O#.

Nếu một vật thể va chạm với hành tinh, nó sẽ dừng lại. Nếu nó va chạm với một đối tượng khác, chúng trở thành một đối tượng,

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

sẽ trở thành:

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

Một ví dụ cuối cùng:

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

Đầu ra:

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

Lưu ý: Bạn nên xuất hình dạng cuối cùng, vì vậy tất cả các đầu ra được chấp nhận miễn là chúng hiển thị hình dạng cuối cùng của hành tinh.

ví dụ cho đầu vào này:

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

Nên đầu ra:

O#

hoặc là

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

Cả hai điều này đều được chấp nhận.

Đây là nên câu trả lời ngắn nhất sẽ thắng

Lưu ý 2:

Như bạn có thể nhận thấy một .đại diện cho vắc-xin nên con đường ngắn nhất là số chấm ngắn nhất.

Ví dụ:

.#.
...
.O.

Không được chấp nhận

O#

vì con đường ngắn nhất là dọc. Lưu ý 3:

Đối tượng phải luôn luôn di chuyển cùng đường với hành tinh theo một trong bốn hướng (chọn ngắn nhất)

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

Những hạn chế:

2 <= n <= 100


Các kích thước đầu vào có thể là gì?
undergroundmonorail

2
Hãy làm rõ "hướng ngắn nhất."
Ken A

@KenA Tôi nghĩ rằng nó có thể được chia sẻ lại như: các vật thể di chuyển theo đường chéo về phía hành tinh cho đến khi chúng phù hợp với hành tinh (sau đó chúng sẽ di chuyển thẳng về phía hành tinh); nếu một vật thể cuối cùng chạm vào hành tinh theo đường chéo, hãy di chuyển một bước cuối cùng theo hướng ngược chiều kim đồng hồ. Điều này sẽ dẫn đến kết quả tương tự như thông số kỹ thuật của OP. Nhưng làm rõ bởi OP sẽ tốt đẹp.
Martin Ender

Tôi nhận thấy ví dụ của bạn ở trên có một khoảng trắng ở cuối một số dòng. Có an toàn không khi cho rằng điều tương tự có thể đúng với đầu vào mà chương trình dự kiến ​​sẽ xử lý?
skibrianski

@skib không. Nó có thể là một lỗi đánh máy nhưng đầu vào không có khoảng trắng ở cuối.
Mhmd

Câu trả lời:


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

Dòng mới cho dễ đọc. Chạy với -0777p(5 được thêm vào để đếm), nhập thông qua STDIN.

Dễ đọc hơn:

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

Wow oO =) giải thích thêm sẽ tốt hơn cho những người không quen thuộc với công cụ tái chế và các biến đặc biệt của Perl.
skibrianski

@skibrianski, cảm ơn. Mặc dù tôi không làm gì đặc biệt và tôi dễ dàng trả lời hơn sau khi ghi chú được thêm vào OP, nhưng bạn đã đúng: chúng ta nên ghi lại mã của mình.
dùng2846289

Cái nhìn có thể không rõ ràng ngay từ cái nhìn đầu tiên là sử dụng $=biến 'magick' (có thể chỉ là số nguyên - tiết kiệm cho chúng tôi 5 ký tự 'int ()') và sử dụng \Gneo trong mẫu tìm kiếm. Ở đây chúng ta đặt vị trí của nó bằng cách gán cho poshàm (có đối số mặc định là $_).
dùng2846289

6

Toán học, 206 byte

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

Một chút dễ đọc hơn:

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

Như bạn có thể thấy, tôi chỉ lấy một đầu vào duy nhất là chuỗi chứa bản đồ đầu vào. Điều này là do tôi sẽ không sử dụng số nguyên kích thước nào. Nếu bạn nhấn mạnh vào định dạng đầu vào, tôi có thể thay đổi chuỗi đầu vào thành đối số thứ hai để có thêm một ký tự.

Đối với thuật toán, tôi chỉ thu thập tất cả các {Δx, Δy}cặp đối tượng và tìm kiếm một cặp trong mỗi góc phần tư với các điều kiện được truyền vào h. Tôi nghi ngờ đây cũng là phần có thể bị đánh gôn hơn nữa.


Tôi không biết bạn cũng là một người đam mê Mathicala!
Andrew Cheong

1
@AndrewCheong Tôi cho rằng điều đó xảy ra một cách tự nhiên khi bạn là nhà phát triển phần mềm nghiên cứu vật lý. ;)
Martin Ender

5

perl, 270 ký tự

3 bước: 1) tìm hành tinh và vệ tinh trong đầu vào, 2) xác định góc phần tư cho mỗi vệ tinh, 3) đầu ra

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

Ít chơi gôn hơn:

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;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.