Phản xạ ASCII trong một hộp


8

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 AnimationASCII Doodling: Laser in a Box

Bài tập

Bạn đang đưa ra ba cặp số nguyên W,H, x,ydx,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 = 2dx = -1, dy = 1:

___    ___    ___    ___
__*    __*    __*    __*
___ -> _*_ -> _*_ -> _+_
___    *__    *__    *_*
___    ___    _*_    _*_
  • Bóng bắt đầu tại điểm (3,2)
  • di chuyển theo hướng (-1,1), đập vào tường tại (1,4)
  • đượ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 = 3dx = 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 = 6dx = 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,ydx,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,y1-indexed ( 1 <= x <= W1 <= y <= H) hoặc 0-indexed ( 0 <= x < W0 <= y < H), vui lòng chỉ định những gì bạn đã chọn lập chỉ mục
  • dx,dyluôn luôn -1hoặc1

Đầu vào không hợp lệ có thể được bỏ qua.

Đặc điểm kỹ thuật đầu ra

  1. Không có khoảng trắng hàng đầu được phép
  2. Khoảng trắng triling có thể được bỏ qua
  3. 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
  4. 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)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à , 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.


Tôi nghi ngờ một trong những ngôn ngữ 2D (Rùa?) Có thể thực sự làm tốt với thử thách này.
Draco18 không còn tin tưởng SE

1
Nó có được phép mã hóa bốn giá trị dx / dy có thể thành bốn số nguyên lẻ liên tiếp không? Làm thế nào quan trọng là x và y được lập chỉ mục 1?
Neil

Tôi sẽ bỏ các 1rà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.
ბიმო

Chỉnh sửa trong việc lập chỉ mục, bạn có thể cụ thể hơn về câu hỏi khác của bạn?
ბიმო

1
Tôi muốn xem một câu trả lời than cho lol này.
Bạch tuộc ma thuật Urn

Câu trả lời:


8

Than , 50 byte

UONN JNN↷NW⁼ KK«*¿¬KK«↷²¶*¿¬KK«↷²¶↷²*¿¬KK«↷²¶»»»»+

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Cần năm đầu vào: w, h, x, y, a. xyđược lập chỉ mục bằng không. ađại diện dxdytheo mã hóa sau đây:

a mod 8 == 1 => dx = 1, dy = 1
a mod 8 == 3 => dx = -1, dy = 1
a mod 8 == 5 => dx = -1, dy = -1
a mod 8 == 7 => dx = 1, dy = -1

Giải trình:

UONN 

(lưu ý dấu cách không gian) Điền vào nền với khoảng trắng đến chiều rộng và chiều cao đầu vào. (Thông thường mỗi ô vuông của nền là một chuỗi trống, sau đó được chuyển đổi thành khoảng trắng trên đầu ra.)

JNN

Di chuyển con trỏ đến tọa độ ban đầu.

↷N

Xoay đến góc ban đầu.

W⁼ KK«

Lặp lại miễn là hình vuông hiện tại là một không gian.

    *

In một dấu sao và di chuyển về phía trước theo hướng hiện tại.

    ¿¬KK«

Nếu con trỏ di chuyển ra ngoài hình thuôn ban đầu,

        ↷²¶*

Xoay hướng, sau đó in một dòng mới (thuận tiện đưa chúng ta trở lại hình vuông trước đó) và dấu hoa thị, di chuyển theo hướng mới.

        ¿¬KK«

Nếu con trỏ di chuyển trở lại bên ngoài của hình thuôn ban đầu,

            ↷²¶↷²*

Đưa con trỏ trở lại hình vuông trước đó, sau đó xoay lại, do đó in dấu hoa thị theo hướng khác.

            ¿¬KK«

Nếu con trỏ vẫn ở ngoài hình thuôn, chúng ta phải ở một góc.

                ↷²¶

Vì vậy, quay trở lại quảng trường trước đó và bỏ cuộc.

»»»»+

Khi chúng tôi không thể di chuyển được nữa, hãy in dấu "+" và dừng lại.


1
Đẹp! Đây là một TIO cho những ai muốn thử nó.
18 giờ 44 phút

@BruceForte Cảm ơn, nhưng tôi không muốn liên kết với TIO cho đến khi tôi có giải pháp sử dụng Peek()(hiện tại tôi đang làm).
Neil

Rất tiếc, Peekhoạt động trở lại ngay bây giờ
ASCII - chỉ

2

Máy tính Desmos - Không cạnh tranh để giúp hiểu biết thêm

Hãy thử trực tuyến!

Đầu vào:

X as X position to Start
Y as Y position to Start
s as slope -> -1 for dX/dY = -1, +1 for dX/dY = +1
h as height of box, with 0-indexing
w as width of box, with 0-indexing

Trung gian:

Let b = gcd(h,w),  
Let c = |b-(X-sY)%2b| Or |b-mod(X-sY,2b)|

Công thức, viết tắt:

(|b-(x+y)%2b|-c)(|b-(x-y)%2b|-c)=0

Đầu ra:

x as x position, 0-indexed, where the ball will land when released
y as y position, 0-indexed, where the ball will land when released

Làm thế nào nó hoạt động:

(|b-(x+y)%2b|-c)*(|b-(x-y)%2b|-c)=0
                ^ OR operation - |b-(x+y)%2b|-c=0 or |b-(x-y)%2b|-c=0
|b-(x+/-y)%2b|-c = 0
|b-(x+/-y)%2b| = c
|b-(x+/-y)%2b| = c means (b-(x+/-y))%2b = + or -c 
b-(x+/-y)%2b = +/- c -> b +/- c = (x+/-y)%2b -> (x+/-y) = n*2*b + b +/- c 
Where n is integer.  This will force patterns to repeat every 2b steps in x and y.  
Initial pattern n=0: (x +/- y) = b +/- c -> y = +/- x + b +/- c
In the x positive and y positive plane only, these correspond to lines of positive and 
negative slope, set at intercept b, offset by c on either side.

Chương trình không đáp ứng tiêu chí cuối cùng - dừng tại điểm giao nhau và đánh dấu bằng dấu +, do đó, được gửi dưới dạng không cạnh tranh về thông tin để giúp người khác hoàn thành thử thách. Lưu ý rằng để Desmos hoạt động khi c = 0 hoặc c = b, một hệ số bù nhỏ 0,01 đã được giới thiệu, vì Desmos dường như có giới hạn của Mod (A, B) thay vì (0, B) thay vì [0, B )


Tôi cho rằng bạn đã thấy điều này ?
ბიმო

Thật ra, tôi đã tự bắn tỉa và mất khoảng 4 ngày ở nhà. Tôi thực sự, thực sự thích vấn đề này.
Đánh dấu

Bạn được chào đón; P Ngoài ra, có liên quan .
ბიმო

1

Python 3 , 293 279 byte

w,h,x,y,i,j=map(int,input().split());x-=1;y-=1;l=[x[::]for x in[[' ']*w]*h]
while 1:
 a,b=((x,i)in[(0,-1),(w-1,1)]),((y,j)in[(0,-1),(h-1,1)])
 if a and b or l[y][x]!=' ':l[y][x]='+';break
 i,j=i*(-a*2+1),j*(-b*2+1);l[y][x]='*';x+=i;y+=j
print('\n'.join([''.join(x) for x in l]))

Hãy thử trực tuyến!


1
Đẹp! Bạn có thể tiết kiệm một vài byte bằng cách rút ngắn fx,fyvà thay thế Truebằng một cái gì đó giống như 1, thấy ở đây
ბიმო

@BruceForte cảm ơn! Tôi quên thay thế những thứ này.
Andrew Dunai

1
-13 byte bằng cách biến nó thành một hàm.
Artemis vẫn không tin tưởng vào

1
Đợi đã, chỉ cần xem câu hỏi này bao nhiêu tuổi ... Tuy nhiên tôi đã đến đây từ HNQ ...
Artemis vẫn không tin tưởng vào
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.