Bạn có thể hoặc không thể nhớ Xeyes, một chương trình demo đi kèm (và, theo như tôi biết, vẫn đi kèm) hệ thống cửa sổ X. Mục đích của nó là vẽ một đôi mắt theo con trỏ chuột của bạn:
Thách thức của bạn là tái tạo Xeyes với nghệ thuật ASCII. Viết chương trình hoặc chức năng vẽ hai mắt nghệ thuật ASCII (được chỉ định bên dưới) bất cứ nơi nào người dùng nhấp và sau đó di chuyển con ngươi của chúng để chỉ theo hướng của con trỏ.
GIF ở trên là bản ghi thực hiện Ruby không chơi gôn này , có thể chạy với bất kỳ phiên bản gần đây nào của Ruby. Bạn cũng có thể thấy nó hữu ích khi tham chiếu cho các chuỗi điều khiển Xterm.
Thông số kỹ thuật
Đây là môn đánh gôn , vì vậy giải pháp có ít byte nhất sẽ thắng.
Đây là một ascii-nghệ thuật thách thức, vì vậy chương trình của bạn phải vẽ bằng ký tự ASCII-cụ thể, các nhân vật -
, .
, |
, '
, 0
, không gian, và xuống dòng. 1 2
Đây là một thách thức tương tác , vì vậy chương trình của bạn phải chấp nhận đầu vào và rút ra đầu ra của nó trong thời gian thực. 3
Trước khi chương trình của bạn bắt đầu chấp nhận đầu vào, nó sẽ khởi tạo một khung trống có ít nhất 20 hàng và 20 cột. Nó không nên vẽ bất cứ điều gì cho đến khi người dùng nhấp vào khung vẽ.
Bất cứ khi nào người dùng nhấp vào 4 trên khung vẽ, chương trình sẽ xóa bất kỳ đầu ra nào trước đó và sau đó vẽ các mắt ASCII này trên khung vẽ, tập trung vào ký tự gần vị trí của con trỏ chuột. 5 6 (Dưới đây, ✧
đại diện cho con trỏ chuột và không nên được vẽ.)
.---. .---.
| | | |
| 0|✧|0 |
| | | |
'---' '---'
Lưu ý cách học sinh "chỉ" về phía con trỏ.
Bất cứ khi nào con trỏ chuột di chuyển trên khung vẽ, chương trình sẽ vẽ lại các con ngươi để chúng tiếp tục hướng về phía con trỏ, 7 , vd:
✧
.---. .---.
| 0| | 0|
| | | |
| | | |
'---' '---'
Học sinh chỉ
Giả sử chúng ta liệt kê vị trí của chín ký tự bên trong của mỗi mắt như vậy:
.---.
|678|
|591|
|432|
'---'
Học sinh sẽ được rút ra tại một trong những địa điểm 1
- 9
. Để quyết định cái nào, giả vờ các ký tự là hình vuông và khung vẽ là lưới Cartesian, với tâm của 9
ký tự tại (0, 0), tâm của 1
(1, 0), v.v. Khi chương trình nhận được đầu vào, một cú nhấp hoặc chuyển động, nó sẽ ánh xạ vị trí đầu vào tới tọa độ lưới gần nhất. Nếu 𝑀 là (0, 0), học sinh nên được vẽ tại (0, 0), tức là vị trí của 9
ở trên. Nếu không, nó nên được vẽ như mô tả dưới đây.
Hãy tưởng tượng một mặt phẳng của Cartesian được đặt chồng lên lưới và chia thành các octant được đánh số 1 - 8 :
Nếu 𝑀 dối trá trong chòm sao bát nhân 1 thì học sinh nên được rút ra tại vị trí của 1
trên, tức là tại (1, 0). Nếu 𝑀 nằm trong octant 2 thì nên rút ra tại ngay bây giờ 2
. Để minh họa, hình ảnh dưới đây cho thấy một phần của lưới được mã hóa màu theo vị trí con ngươi sẽ được vẽ khi con trỏ chuột ở một vị trí cụ thể. Ví dụ, khi con trỏ ở bất kỳ tọa độ màu xanh lá cây nào (hãy nhớ rằng tọa độ lưới nằm ở tâm của hình vuông, không phải góc của chúng), nên vẽ đồng tử tại 4
.
Đồng tử của hai mắt di chuyển độc lập, do đó, đối với mỗi mắt lặp lại quá trình với so với tâm của mắt đó.
Ghi chú
Đây không phải là một thách thức đầu ra đồ họa . Đầu ra phải là một lưới các ký tự. Tất nhiên, bạn có thể sử dụng các thói quen đồ họa để vẽ một lưới các ký tự.
Khoảng trắng có thể được vẽ (hoặc, đúng hơn, không được vẽ) tuy nhiên là thuận tiện. Một điểm trống trong lưới trông giống như một ký tự khoảng trắng và sẽ được coi là tương đương.
"Thời gian thực" được định nghĩa ở đây là ít hơn 200ms giữa đầu vào và đầu ra tương ứng được rút ra.
Theo quyết định của bạn, nút chuột nào được quan sát cho đầu vào và liệu một lần nhấn hoặc nhả có cấu thành "nhấp chuột" hay không.
Canvas phải được xóa, hoặc tương đương trực quan phải đạt được. Ví dụ, với một giải pháp dựa trên thiết bị đầu cuối, việc in một khung vẽ mới bên dưới khung vẽ trước đó không được coi là tương đương.
Khi người dùng nhấp vào gần mép của khung vẽ sao cho một số ký tự mắt sẽ được vẽ bên ngoài cạnh của nó, hành vi không được xác định. Tuy nhiên, chương trình phải tiếp tục chạy bình thường khi có các lần nhấp tiếp theo.
Khi con trỏ chuột rời khỏi "khung vẽ", hành vi không được xác định, nhưng chương trình phải tiếp tục chạy bình thường khi con trỏ vào lại khung vẽ.
Một con trỏ văn bản có thể xuất hiện trên khung vẽ, miễn là nó không làm mờ đầu ra.
Sơ hở tiêu chuẩn bị cấm.
<pre>
hoặc font-family:monospace
).