Być może pamiętasz Xeyes, program demonstracyjny, który został dostarczony z (i, o ile wiem, nadal) z systemem okien X. Jego celem było narysowanie pary oczu podążających za kursorem myszy:
Twoim wyzwaniem jest odtworzenie Xeyesa ze sztuką ASCII. Napisz program lub funkcję, która przyciąga dwoje oczu ASCII (określonych poniżej), gdziekolwiek użytkownik kliknie, a następnie przesuwa swoje źrenice, aby wskazywały w kierunku kursora.
Powyższy GIF jest zapisem tej nie golfowej implementacji Ruby , którą można uruchomić z dowolną najnowszą wersją Ruby. Może być również przydatny jako odniesienie dla sekwencji kontrolnych Xterm.
Dane techniczne
To jest golf golfowy , więc wygrywa rozwiązanie z najmniejszą liczbą bajtów.
Jest to ASCII-art wyzwanie, więc program musi wyciągnąć za pomocą znaków ASCII specyficznie, znaki -
, .
, |
, '
, 0
, przestrzeń i nowej linii. 1 2
Jest to wyzwanie interaktywne , więc twój program musi akceptować dane wejściowe i pobierać je w czasie rzeczywistym. 3)
Zanim program zacznie akceptować dane wejściowe, powinien zainicjować puste płótno składające się z co najmniej 20 wierszy i 20 kolumn. Nie powinien niczego rysować, dopóki użytkownik nie kliknie obszaru roboczego.
Za każdym razem, gdy użytkownik kliknie 4 na obszarze roboczym, program powinien wyczyścić wszystkie poprzednie dane wyjściowe, a następnie narysować oczy ASCII na obszarze roboczym, wycentrowane na znaku najbliższym położeniu kursora myszy. 5 6 (poniżej ✧
reprezentuje kursor myszy i nie należy go rysować).
.---. .---.
| | | |
| 0|✧|0 |
| | | |
'---' '---'
Zwróć uwagę, jak uczniowie „wskazują” w kierunku kursora.
Za każdym razem, gdy kursor myszy porusza się po obszarze roboczym, program powinien ponownie narysować źrenice, aby nadal wskazywały kursor, 7 np .:
✧
.---. .---.
| 0| | 0|
| | | |
| | | |
'---' '---'
Wskazując źrenicę
Załóżmy, że wyliczyliśmy pozycje dziewięciu wewnętrznych znaków każdego oka w następujący sposób:
.---.
|678|
|591|
|432|
'---'
Uczeń zostanie wylosowany w jednym z miejsc 1
- 9
. Aby zdecydować, który z nich, udawaj, że znaki są kwadratowe i że płótno jest siatką kartezjańską, ze środkiem 9
znaku w (0, 0), środkiem 1
w (1, 0) i tak dalej. Gdy program odbiera dane wejściowe - kliknięcie lub ruch - powinien odwzorować lokalizację wejściową na najbliższą współrzędną siatki 𝑀. Jeśli 𝑀 to (0, 0), uczeń powinien być narysowany w (0, 0), tj. W miejscu 9
powyższego. W przeciwnym razie należy go narysować w sposób opisany poniżej.
Wyobraź sobie kartezjański samolot nałożony na siatce i dzieli się na oktantach numerach 1 - 8 :
Jeśli 𝑀 mieści się w oktanie 1 , wówczas uczeń powinien zostać narysowany w miejscu 1
powyżej, tj. W (1, 0). Jeśli 𝑀 jest w liczbie oktantowej 2 , należy narysować 2
- i tak dalej. Aby to zilustrować, poniższy obraz pokazuje część siatki oznaczoną kolorem, zgodnie z tym, gdzie należy narysować źrenicę, gdy kursor myszy znajduje się w określonym miejscu. Gdy na przykład kursor znajduje się na jednej z zielonych współrzędnych (pamiętając, że współrzędne siatki leżą w środkach kwadratów, a nie w ich rogach), należy narysować źrenicę 4
.
Źrenice obu oczu poruszają się niezależnie, więc dla każdego oka powtórz proces z 𝑀 względem środka tego oka.
Notatki
To nie jest wyzwanie graficzne . Dane wyjściowe muszą być siatką znaków. Możesz oczywiście użyć procedur graficznych do narysowania siatki znaków.
Białe znaki można narysować (a raczej nie narysować), ale jest to wygodne. Puste miejsce na siatce wygląda tak samo jak znak spacji i będzie uważane za równoważne.
„Czas rzeczywisty” definiuje się tutaj jako mniej niż 200 ms między wejściem a odpowiadającym mu wyjściem.
Od Ciebie zależy, które przyciski myszy zostaną zaobserwowane podczas wprowadzania i czy naciśnięcie lub zwolnienie stanowi „kliknięcie”.
Płótno musi zostać wyczyszczone lub należy uzyskać wizualny odpowiednik. Na przykład w przypadku rozwiązania opartego na terminalu drukowanie nowego płótna poniżej poprzedniego płótna nie jest uważane za równoważne.
Gdy użytkownik kliknie w pobliżu krawędzi płótna, tak że niektóre znaki oka zostaną narysowane poza jego krawędź, zachowanie jest niezdefiniowane. Jednak program musi nadal działać normalnie po kolejnych kliknięciach.
Gdy kursor myszy opuszcza „obszar roboczy”, zachowanie jest niezdefiniowane, ale program musi kontynuować normalne działanie, gdy kursor ponownie znajdzie się w obszarze roboczym.
Kursor tekstowy może pojawić się na kanwie, o ile nie przesłania wyniku.
Standardowe luki są zabronione.
<pre>
Lub font-family:monospace
).