Phản xạ ASCII trong một hộp
Có lẽ tất cả các bạn đều biết Định luật Phản xạ , trong thử thách này, bạn sẽ hình dung được quỹ đạo của một quả bóng trong hộp.
Liên quan: ASCII Ball in Box Animation và ASCII Doodling: Laser in a Box
Bài tập
Bạn đang đưa ra ba cặp số nguyên W,H
, x,y
và dx,dy
- là người đầu tiên đại diện cho kích thước của hộp, thứ hai vị trí bắt đầu và cặp thứ ba là sự chỉ đạo, trong đó bóng bắt đầu di chuyển.
Nhiệm vụ là hình dung chuyển động của quả bóng cho đến khi nó dừng lăn, điều này xảy ra ngay khi quả bóng ở vị trí trước đó hoặc nó chạm vào một góc.
Nhân vật *
sẽ hình dung quỹ đạo của quả bóng và +
đánh dấu vị trí cuối cùng của nó, phần còn lại của hộp phải bao gồm (khoảng trắng).
Ví dụ
Để đặt nó rõ ràng hơn một chút, trong các ví dụ _
này sẽ đại diện cho một khoảng trắng. Ngoài ra, các giai đoạn trung gian chỉ ở đây để làm rõ, bạn sẽ chỉ cần xuất ra giai đoạn cuối cùng, những ví dụ này được đưa ra 1
.
Cho W = 3, H = 5
, x = 3, y = 2
và dx = -1, dy = 1
:
___ ___ ___ ___
__* __* __* __*
___ -> _*_ -> _*_ -> _+_
___ *__ *__ *_*
___ ___ _*_ _*_
- Bóng bắt đầu tại điểm
(3,2)
và - di chuyển theo hướng
(-1,1)
, đập vào tường tại(1,4)
và - được phản ánh, hướng mới là
(1,1)
. Nó lại đập vào tường lúc(2,5)
- nơi nó được phản ánh. Hướng mới là
(1,-1)
và nó đập vào tường ngay lập tức(3,4)
, - một lần nữa nó được phản ánh theo hướng
(-1,-1)
. Bây giờ nó sẽ đi qua các điểm(2,3),(1,2)
, được phản ánh, vv nhưng vì nó đã truy cập vào vị trí(2,3)
nên nó dừng lại ở đó.
Ví dụ này cho thấy, điều gì xảy ra nếu một quả bóng chạm vào một góc. Đối với điều này hãy để W = 7, H = 3
, x = 1, y = 3
và dx = 1, dy = -1
:
_______ __*____ __*____ __*___+
_______ -> _*_____ -> _*_*___ -> _*_*_*_
*______ *______ *___*__ *___*__
- Vị trí bắt đầu là
(1,3)
, - quả bóng bay theo hướng
(1,-1)
cho đến khi nó đập vào tường(3,1)
- nơi nó được phản ánh vào hướng mới
(1,1)
. - Tại
(5,3)
nó được phản ánh và đi vào hướng mới(1,-1)
. Nó dừng lại đột ngột(7,1)
vì đó là một góc.
Cho W = 10, H = 6
, x = 6, y = 6
và dx = 1, dy = 1
:
__________ __________ ________*_ ________*_ ________*_ __*_____*_ __*_____*_
__________ _________* _________* _______*_* _______*_* _*_____*_* _*_*___*_*
__________ -> ________*_ -> ________*_ -> ______*_*_ -> *_____*_*_ -> *_____*_*_ -> *___*_*_*_
__________ _______*__ _______*__ _____*_*__ _*___*_*__ _*___*_*__ _*___+_*__
__________ ______*___ ______*___ ____*_*___ __*_*_*___ __*_*_*___ __*_*_*___
_____*____ _____*____ _____*____ ___*_*____ ___*_*____ ___*_*____ ___*_*____
Đặc điểm kỹ thuật đầu vào
Các đầu vào gồm ba cặp số nguyên W,H
, x,y
và dx,dy
, bạn có thể mất đầu vào trong bất kỳ định dạng có ý nghĩa nhất đối với ngôn ngữ lập trình của bạn và thứ tự không quan trọng. Tuy nhiên, đầu vào được chấp nhận không được mã hóa nhiều thông tin hơn các cặp này chứa (xem câu trả lời này để biết ví dụ).
W,H >= 1
x,y
là1
-indexed (1 <= x <= W
và1 <= y <= H
) hoặc0
-indexed (0 <= x < W
và0 <= y < H
), vui lòng chỉ định những gì bạn đã chọn lập chỉ mụcdx,dy
luôn luôn-1
hoặc1
Đầu vào không hợp lệ có thể được bỏ qua.
Đặc điểm kỹ thuật đầu ra
- Không có khoảng trắng hàng đầu được phép
- Khoảng trắng triling có thể được bỏ qua
- Không được phép sử dụng khoảng trắng không phù hợp nếu chúng không vừa với hộp
- Trailing newlines ( sau khi tất cả các dòng liên quan đến đầu ra) được cho phép
Hãy lấy ví dụ đầu tiên:
(good by 2)
__*
_+ (good by 2)
*_*_ (bad by 3)
(bad by 4)
_*_
(good by 4)
Các trường hợp thử nghiệm
Giả sử đầu vào có định dạng (W,H,x,y,dx,dy)
và 1
-exexing đã được chọn, đây là một số trường hợp thử nghiệm (một lần nữa _
ở đây để thể hiện khoảng trắng!):
Đầu vào: 1,1,1,1,1,1
Đầu ra:
+
Đầu vào: 3,3,3,3,1,1
Đầu ra:
___
___
__+
Đầu vào: 3,3,3,3, -1, -1
Đầu ra:
+__
_*_
__*
Đầu vào: 7,3,1,3,1, -1
Đầu ra:
__*___+
_*_*_*_
*___*__
Đầu vào: 10,6,6,6,1,1
Đầu ra:
__*_____*_
_*_*___*_*
*___*_*_*_
_*___+_*__
__*_*_*___
___*_*____
Đầu vào: 21,7,6,4, -1, -1
Đầu ra:
__*_______*_______*__
_*_*_____*_*_____*_*_
*___*___*___*___*___*
_*___*_*_____*_*___*_
__*___*_______+___*__
___*_*_________*_*___
____*___________*____
Đây là môn đánh gôn , vì vậy chương trình / chức năng ngắn nhất sẽ thắng, nhưng mọi nỗ lực đều được đánh giá cao.
1
ràng buộc được lập trình nếu bạn thích (?) Về câu hỏi đầu tiên đó, không chắc ý của bạn là gì nhưng nghe có vẻ ổn. Tôi đoán bất cứ điều gì là một bijection ( {-1,1}x{-1,1} ≡ "Your space"
) sẽ tốt.