Code Golf: Số phận của tàu vũ trụ là gì? [phiên bản dấu phẩy động]


12

Câu hỏi này hơi khó hơn phiên bản nghệ thuật ASCII. Không có nghệ thuật, và bây giờ bạn có thể làm một số số học dấu phẩy động!

Các thách thức

USS StackExchange đang đi qua trường trọng lực của hành tinh cg-00DLEF thì một vụ nổ thiên văn xảy ra trên tàu. Là giám đốc lập trình của con tàu, công việc của bạn là mô phỏng quỹ đạo của con tàu để dự đoán liệu bạn có bị buộc phải hạ cánh trong hệ mặt trời của cg-00DELF hay không. Trong vụ nổ, tàu của bạn bị hư hại nặng. Do DEEEPRAROM * miễn phí có giới hạn * của tàu vũ trụ, bạn phải viết chương trình của mình càng ít ký tự càng tốt.

* Tự động truy cập ngẫu nhiên có thể xóa bằng điện tử Có thể lập trình truy cập ngẫu nhiên Chỉ đọc bộ nhớ

Mô phỏng

Giống như phiên bản nghệ thuật ASCII, sẽ có ý tưởng về các bước thời gian. Trong phiên bản khác, một bước thời gian là một khoảng thời gian tương đối lớn: con tàu có thể di chuyển vượt quá trọng lực của một hành tinh trong một bước thời gian duy nhất. Ở đây, bước thời gian là một đơn vị thời gian nhỏ hơn nhiều do khoảng cách lớn hơn liên quan. Tuy nhiên, một sự khác biệt chính là sự không tồn tại của các tế bào. Vị trí và vận tốc hiện tại của tàu vũ trụ sẽ là các số điểm nổi, cùng với các lực hấp dẫn liên quan. Một thay đổi khác là thực tế là các hành tinh hiện có kích thước lớn hơn nhiều.

Sẽ có tới ba hành tinh trong mô phỏng. Cả ba sẽ có một vị trí, bán kính và trọng lực cụ thể. Trọng lực cho mỗi hành tinh là một vectơ tác động một lực trực tiếp vào trung tâm của hành tinh. Công thức để tìm ra sức mạnh của vectơ này là (Gravity)/(Distance**2), trong đó khoảng cách là khoảng cách chính xác từ con tàu đến trung tâm của hành tinh. Điều này có nghĩa là không có giới hạn về nơi mà trọng lực có thể đạt tới.

Tại bất kỳ thời điểm cụ thể nào, tàu vũ trụ có vận tốc, đó là khoảng cách và góc mà nó di chuyển từ bước trước đến giờ. Con tàu cũng có đà. Khoảng cách mà nó sẽ di chuyển giữa bước thời gian hiện tại và bước tiếp theo là tổng vận tốc hiện tại của nó được thêm vào tất cả các vectơ trọng lực tại vị trí của nó. Điều này trở thành vận tốc mới của tàu vũ trụ.

Mỗi mô phỏng có giới hạn thời gian là 10000 bước thời gian. Nếu tàu vũ trụ di chuyển bên trong một hành tinh (nó gần trung tâm hành tinh hơn bán kính của hành tinh), thì nó đâm vào hành tinh đó. Nếu tàu vũ trụ không đâm vào bất kỳ hành tinh nào vào cuối mô phỏng, thì nó được cho là đã thoát khỏi lực hấp dẫn. Không chắc là con tàu có thể được căn chỉnh hoàn hảo đến mức nó có thể ở trong quỹ đạo trong 10000 bước thời gian trong khi gặp sự cố ở bước thời gian 10001.

Đầu vào

Đầu vào sẽ là bốn dòng đến STDIN. Mỗi dòng bao gồm bốn số được phân cách bằng dấu phẩy. Đây là định dạng của các số:

ShipLocX,ShipLocY,ShipVelX,ShipVelY
Planet1LocX,Planet1LocY,Planet1Gravity,Planet1Radius
Planet2LocX,Planet2LocY,Planet2Gravity,Planet2Radius
Planet3LocX,Planet3LocY,Planet3Gravity,Planet3Radius

Nếu có ít hơn ba hành tinh, thì các dòng còn lại sẽ chứa đầy số không cho tất cả các giá trị. Đây là một ví dụ đầu vào:

60,0,0,10
0,0,4000,50
100,100,4000,50
0,0,0,0

Điều này có nghĩa là tàu vũ trụ nằm ở (60,0) và đang đi thẳng "lên / bắc" với tốc độ 10 đơn vị / bước thời gian. Có hai hành tinh, một ở (0,0) và một ở (100,100). Cả hai đều có trọng lực 4000 và bán kính 50. Mặc dù tất cả chúng đều là số nguyên, nhưng chúng sẽ không phải luôn luôn là số nguyên.

Đầu ra

Đầu ra sẽ là một từ duy nhất cho STDOUT để cho biết tàu vũ trụ có bị rơi hay không. Nếu tàu gặp nạn, in crash. Nếu không, in escape. Đây là đầu ra dự kiến ​​cho đầu vào trên:

crash

Bạn có thể tự hỏi những gì đã xảy ra. Dưới đây là một bài viết của Pastebin có nhật ký chuyến bay chi tiết cho tàu vũ trụ. Những con số không tốt lắm trong việc giúp mọi người hình dung sự kiện vì vậy đây là điều đã xảy ra: Tàu vũ trụ tìm cách thoát khỏi lực hấp dẫn của hành tinh thứ nhất (về phía tây) với sự trợ giúp của trọng lực của hành tinh thứ hai (về phía đông bắc). Nó di chuyển về phía bắc và sau đó đi nhẹ về phía tây của hành tinh thứ hai, hầu như không thấy nó. Sau đó, nó uốn quanh phía bắc của hành tinh và đâm vào phía đông của hành tinh thứ hai.

Một số trường hợp nữa để kiểm tra

60,0,10,-10
0,0,2000,50
100,100,1357.9,47.5
0,0,0,0

thoát (do luật bình phương nghịch đảo, 2000 không có nhiều trọng lực nếu bạn ở cách xa 60 đơn vị)

0,0,0,0
100,100,20000,140
-50,-50,50,50
-100,-100,50,50

tai nạn (hành tinh đầu tiên cực kỳ lớn và cực kỳ gần)

0,0,0,0
0,0,0,0
0,0,0,0
0,0,0,0

thoát (đây là trường hợp cạnh: không có hành tinh nào và cách giải thích đơn giản sẽ gợi ý rằng tàu vũ trụ nằm trực tiếp trên đỉnh các hành tinh)

Quy tắc, hạn chế và ghi chú

Đây là mã golf. Quy tắc golf tiêu chuẩn áp dụng. Chương trình của bạn chỉ nên được viết bằng các ký tự ASCII có thể in được. Bạn không thể truy cập bất kỳ loại cơ sở dữ liệu bên ngoài. Bạn có thể viết các mục bằng bất kỳ ngôn ngữ nào (ngoài ngôn ngữ chuyên dùng để giải quyết thách thức này).

Kết thúc truyền


RỦI RO DEEEPRAROM! - Tương tác hấp dẫn của các hành tinh không được cho là mô phỏng? Vẫn chưa thực sự đắt về số lượng, nhưng đủ công bằng. - Tôi giả sử mô phỏng tham chiếu sử dụng tích hợp bậc 4 Runge-Kutta tiêu chuẩn và chương trình của chúng tôi phải tạo ra kết quả tương đương?
đã ngừng quay ngược chiều

Tôi chưa tìm ra cách để làm nhiều hành tinh tương tác. Vấn đề là họ sẽ có xu hướng đâm sầm vào nhau ngay lập tức. Sửa lỗi này sẽ yêu cầu tăng quy mô mô phỏng lên một cách khó tin.
PhiNotPi

Đối với phương pháp Runge-Kutta, tôi thực sự chưa tiến bộ về toán học. :( Những gì tôi đã làm là tính toán trọng lực tại vị trí hiện tại của con tàu và thêm nó vào vận tốc của con tàu, tạo ra vận tốc mới của con tàu. Tôi đã làm điều này cho mỗi bước. Tôi biết rằng điều này không hoàn toàn chính xác, nhưng tôi đã phát hiện ra việc chia vận tốc khởi động của tàu và lực hấp dẫn của các hành tinh cho 10 làm tăng độ chính xác của mô phỏng.
PhiNotPi

Ah, đó sẽ là phương pháp của Euber. Đối với các bước thời gian đủ nhỏ mà một là chính xác, quá; nhưng Runge-Kutta hoặc một cái gì đó tinh vi hơn sẽ thú vị hơn khi thực hiện IMO. Có lẽ tôi nên đặt ra thử thách của riêng mình, dường như tôi không thể dễ dàng thỏa mãn ...
đã ngừng quay ngược lại vào

@leftaroundabout Đi trước. Bạn có thể tạo ra một cái gì đó như "mô phỏng toàn bộ hệ mặt trời bằng các phương trình vi phân" hoặc một cái gì đó lạ mắt như thế, hoặc có thể thêm vào chiều thứ ba.
PhiNotPi

Câu trả lời:


6

Con trăn, 178 170 ký tự

p=input
a,b,c,d=p()
x=a+b*1j
v=c+d*1j
P=(p(),p(),p())
R='escape'
for i in' '*10000:
 for a,b,g,r in P:
  d=a+b*1j-x;v+=g*d/abs(d)**3
  if abs(d)<r:R='crash'
 x+=v
print R

2
Hôm nay bạn có tâm trạng phức tạp phải không?
đã ngừng quay ngược chiều

8
vâng, iam ....
Keith Randall

Làm thế nào tôi có thể cạnh tranh với điều đó?
Neil

@Neil: mã, hay nói đùa dí dỏm?
Keith Randall

Vâng mã. Những lời nói đùa dí dỏm tôi có thể theo kịp.
Neil

2

Golfrun / GolfScript?, 243 232 ký tự

10000:M;n%(','%2/{{~}%}/{{M*}%}:_~:v;_:x;'escape':R;{[','%2/{{~M*}%}/]}%:P;
M,{;P{~\x{0\-}%{+~@+@@+[\]}:|~:d.[~0\-]{[+.2%~*\.-2%~*@\-\.3%~*\(;);~*+]}:&~);~sqrt:z
..**\~d@[`~0]\&@M.*/\{1$/}%v|:v;;z\<{'crash':R;}{}if}/x v|:x;}/R puts

Golfrun là ngôn ngữ tôi đang làm việc, được sinh ra với tư cách là thông dịch viên của GolfScript C, nhưng sớm trôi đi một cách nào đó; mặc dù tôi đã viết mã này mà không sử dụng các tính năng Golfrun cụ thể (ngoại trừ sqrt), thử nghiệm với GolfScript gốc đã thất bại (tôi phải thêm tính năng sqrt vào mã gốc, tôi không phải là một guru Ruby nhưng tôi tin rằng vấn đề là không phải điều chỉnh của tôi).

Vấn đề đầu tiên với giải pháp này là Golfrun, như GolfScript, không có phép toán dấu phẩy động. Đó là "mô phỏng" phóng đại các con số, hy vọng theo cách chính xác (nhưng tôi không tự tin 100% tôi đã thực hiện nó một cách mạch lạc). Mặc dù vậy, giải pháp không xử lý số dấu phẩy động làm đầu vào, vì vậy tôi phải phóng to chúng bằng tay để chỉ có số nguyên.

Cố gắng thực hiện thuật toán trong mã Python, tôi cũng đã triển khai các bit toán học phức tạp theo cách khá "chung chung". Thao tác thuật toán để tránh điều này và / hoặc nội tuyến bất cứ khi nào có thể, trì hoãn các định nghĩa, có thể lưu các ký tự khác ...

Làm thế nào để tôi biết mã này hoạt động? Thật vậy, tôi không chắc chắn nó làm! Nhưng đưa ra các ví dụ làm đầu vào (sau khi "xóa" các điểm mà chúng xuất hiện), nó đã viết kết quả mong đợi, ngoại trừ "trường hợp góc" (cũng gây ra ngoại lệ trong Python) ...

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.