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.
źródło
<pre>
Lubfont-family:monospace
).Odpowiedzi:
HTML + CSS + JavaScript (ES6), 93 + 19 +
278276 = 388 bajtówźródło
X||Y
można zagrać w golfa,X|Y
aby zaoszczędzić 2 bajty.|
końcu ma pierwszeństwo przed wyrażeniem potrójnym.|
i||
na nieco tym samym poziomie, i oba powyżej?:
. ObaX||Y?w*r(cos(a)):0
iX||Y?h*r(sin(a)):0
są obecnie w formieboolean_condition?A:B
. Więc kiedy przejdzieszX||Y
naX|Y
to, zrobisz nieco OR, a następnie ponownie zinterpretuje jako warunek logiczny. ((X||Y)?A:B
vs(X|Y)?A:B
nieX|(Y?A:B)
). Również nie widzę żadnej różnicy, kiedy używać „Kopiuj snippet odpowiedzieć” i zmienić||
się|
. Wszystko nadal działa dokładnie tak samo, o ile mogę powiedzieć ..Excel VBA, 630 bajtów
Zadeklarowany podprogram arkusza roboczego uruchamiany po kliknięciu myszą, który nie wymaga wprowadzania danych i tworzy parę oczu podążających za kursorem. Zależy to od dołączonej funkcji pomocniczej i deklaracji typu, które muszą być umieszczone w normalnym module.
Ta wersja jest skalibrowana do działania przy domyślnym powiększeniu 100%. Zrywa, jeśli próbujesz przewijać.
Deklaracja funkcji i typu pomocnika
Niegolfowany i komentowany
Ta wersja jest skalibrowana do działania przy poziomie powiększenia 400%.
Deklaracja funkcji i typu pomocnika
Wynik
Gif
Obraz o wyższej rozdzielczości
źródło
'
znak znajdujący się najbardziej na prawo, wynik będzie inny niż na lewym'
znaku. 2. Pozycja oczu nie jest ustalona. Kliknięcie myszą powinno spowodować ich przesunięcie do pozycji kliknięcia. Jestem elastyczny w zakresie metody wprowadzania (akceptuję, powiedzmy, wirtualny kursor myszy kontrolowany przez klawisze strzałek), ale są dwa różne zdarzenia wejściowe o różnych zachowaniach: ruch myszy i kliknięcie myszą.Worksheet_SelectionChange
zdarzenie i przekaże zasięg wywołania (Target
lubT
w tym przypadku) - co przerysuje oczy i*
wywołanie komórkaQBasic ( QB64 ),
361305 bajtówKliknięcie lewym przyciskiem umieszcza oczy. Jeśli umieszczenie oczu spowodowałoby, że część oczu byłaby poza zakresem, program „zawiesza się” do momentu prawidłowego umieszczenia.
Główną trudną częścią jest umieszczenie uczniów. Przez większość czasu współrzędne źrenicy są tylko środkiem oka plus (znak (xx), znak (yy)), z tym wyjątkiem, że w oktantach 1 i 5 współrzędna y jest równa środku y, a w oktantach 3 i 7, współrzędna x jest równa środkowi x. Granice oktanta można obliczyć za pomocą nachylenia
m
linii od środka oka do współrzędnych myszy. Dogodnie dzielenie przez zero podczas obliczania nachylenia daje nieskończoność zmiennoprzecinkową (+/-), a nie błąd.Nie golfił
źródło
?0
zamiast?"0"
? Sugeruje to , że możesz użyć wyrażenia liczbowego oraz ciągów znaków."| |"
. Więc to prawdopodobnie niczego nie uratuje."0"
jest tylko 2 bajty dłuższy.Kod maszynowy 6502 ( mysz C64 + 1351 ), 630 bajtów
W akcji:
Niestety, nie ma demonstracji online , ponieważ nie ma AFAIK emulatora js C64 obsługującego mysz. Jeśli chcesz spróbować samodzielnie, pobierz VICE , pobierz binarny plik wykonywalny i uruchom go w emulatorze C64:
Aby chwycić / odblokować wejście myszy w uruchomionym emulatorze, użyj
ctrl+m
na Unix / Linux ictrl+q
na Windowsie.Tak, to musiało być zrobione;) Mimo wszystko, nie jest oryginalna mysz dla Commodore C64, ale oczywiście wbudowany system operacyjny nie obsługuje go, więc najpierw potrzebny sterownik myszy, które już podjęło 230 bajtów ( w tym duszka sprzętowa w kształcie kursora myszy i kod sprawdzający granice obszaru ekranu, ale bez translacji współrzędnych wskaźnika na współrzędne ekranu tekstowego).
Jeśli jesteś zainteresowany, możesz przeczytać kod jako źródło zestawu tutaj :)
źródło
Czysty ,
1014904892884840814782772769 bajtów-6 bajtów, jeśli oczy nie muszą przyciągać się do siatki
To nie było łatwe. Interfejsy użytkownika w językach funkcjonalnych rzadko są.
Upewnij się, że używasz iTasks Clean, masz
Courier
zainstalowaną czcionkę iStdLib
PRZED jakimkolwiek podfolderemObjectIO
w ścieżce wyszukiwania modułów.Kompiluj za pomocą (przykład może się różnić):
clm -IL StdLib -IL ObjectIO -IL "ObjectIO/OS <YOUR_OS_HERE>" -IL Dynamics -IL Generics -IL Platform -nci <MODULE_NAME_HERE>
Jeśli nigdy wcześniej nie korzystałeś z programu Clean, spodziewaj się, że skompilowanie tego projektu potrwa ponad 5 minut.
Nie golfowany:
Jak widać z wersji bez golfa, większość kodu po prostu konfiguruje kombinację „czcionki o stałej szerokości” z „odpowiedz na mysz”. I chociaż
Courier
nie ułatwia to rozróżnienia, w rzeczywistości rysuje.
s i'
s. Zamiana na coś takiegoConsolas
sprawia, że jest jaśniej.źródło
(abs m)<9&&(abs n)<w='9'
się(abs m)<9&(abs n)<w='9'
? Ponadto sugeruję dodanie ekranu do gif zamiast zrzutu ekranu.Rubinowy, 335 + 13 = 348 bajtów
+13 bajtów dla
-rio/console
flagi, aby włączyćIO#getch
.Zawiera dosłowne
0x1b
znaki ESC ( ) pokazane␛
poniżej. Następuje zrzut xxd.Uwaga: nie usuwa się po wyjściu. Zobacz uwagę pod zrzutem xxd poniżej.
Nie golfił
To dość naiwny golf mojej oryginalnej implementacji Ruby .
zrzut xxd
Ten program włącza śledzenie myszy za pomocą sekwencji kontrolnej xterm,
\e[?1003h
ale nie wyłącza go przy wyjściu. Aby go wyłączyć, użyj sekwencji kontrolnej\e[?1003l
, np .:Ponieważ program zjada wszystkie dane wejściowe, trudno jest wyjść. Jeśli chcesz móc wyjść, naciskając Ctrl + C, dodaj następujący wiersz poniżej
(s<<STDIN.getch
:Bez zbędnych ceregieli:
źródło