Anda mungkin atau mungkin tidak ingat Xeyes, program demo yang datang dengan (dan, sejauh yang saya tahu, masih disertai) sistem X window. Tujuannya adalah untuk menggambar sepasang mata yang mengikuti kursor mouse Anda:
Tantangan Anda adalah menciptakan kembali Xeyes dengan seni ASCII. Tulis program atau fungsi yang menarik dua mata seni ASCII (ditentukan di bawah) di mana pun pengguna mengklik dan kemudian menggerakkan murid-murid mereka untuk menunjuk ke arah kursor.
GIF di atas adalah rekaman implementasi Ruby non-golf ini , yang dapat dijalankan dengan Ruby versi terbaru. Anda juga dapat menemukan itu berguna sebagai referensi untuk urutan kontrol Xterm.
Spesifikasi
Ini adalah kode-golf , jadi solusi dengan byte paling sedikit menang.
Ini adalah ascii-seni tantangan, sehingga program Anda harus menggambar menggunakan ASCII karakter-khusus, karakter -
, .
, |
, '
, 0
, ruang, dan baris baru. 1 2
Ini adalah tantangan interaktif , sehingga program Anda harus menerima input dan menggambar outputnya secara realtime. 3
Sebelum program Anda mulai menerima input, ia harus menginisialisasi kanvas kosong setidaknya 20 baris dan 20 kolom. Seharusnya tidak menarik apa pun sampai pengguna mengklik kanvas.
Setiap kali pengguna mengklik 4 pada kanvas, program harus menghapus output sebelumnya dan kemudian menarik mata ASCII ini pada kanvas, berpusat pada karakter terdekat dengan lokasi kursor mouse. 5 6 (Di bawah ini, ✧
menunjukkan kursor mouse dan tidak boleh digambar.)
.---. .---.
| | | |
| 0|✧|0 |
| | | |
'---' '---'
Perhatikan bagaimana murid "menunjuk" ke arah kursor.
Setiap kali kursor mouse bergerak di atas kanvas, program harus menggambar ulang pupil sehingga mereka terus menunjuk ke arah kursor, 7 misalnya:
✧
.---. .---.
| 0| | 0|
| | | |
| | | |
'---' '---'
Murid menunjuk
Misalkan kita menyebutkan posisi sembilan karakter batin masing-masing mata seperti:
.---.
|678|
|591|
|432|
'---'
Murid akan ditarik di salah satu lokasi 1
- 9
. Untuk memutuskan yang mana, berpura-pura karakter persegi dan bahwa kanvas adalah kisi Cartesian, dengan pusat 9
karakter di (0, 0), pusat 1
di (1, 0), dan sebagainya. Ketika program menerima input — klik atau gerakan — ia harus memetakan lokasi input ke koordinat grid terdekat 𝑀. Jika 𝑀 adalah (0, 0), murid harus ditarik pada (0, 0), yaitu lokasi di 9
atas. Kalau tidak, itu harus ditarik seperti yang dijelaskan di bawah ini.
Bayangkan sebuah pesawat Cartesius ditumpangkan pada grid dan dibagi menjadi oktan bernomor 1 - 8 :
Jika 𝑀 terletak di dalam oktan 1 , maka murid harus digambarkan di lokasi di 1
atas, yaitu di (1, 0). Jika 𝑀 dalam 2 oktan itu harus ditarik pada 2
—dan seterusnya. Untuk mengilustrasikan, gambar di bawah ini menunjukkan bagian dari kode warna kotak sesuai dengan di mana murid harus ditarik ketika kursor mouse berada di lokasi tertentu. Ketika, misalnya, kursor berada pada salah satu koordinat hijau (dengan mengingat bahwa koordinat kisi terletak di pusat kotak, bukan sudutnya), murid harus digambar 4
.
Murid kedua mata bergerak secara independen, sehingga untuk setiap mata ulangi proses dengan 𝑀 relatif terhadap pusat mata itu.
Catatan
Ini bukan tantangan grafis-output . Outputnya harus berupa grid karakter. Anda tentu saja dapat menggunakan rutinitas grafik untuk menggambar kisi-kisi karakter.
Ruang kosong dapat digambar (atau, lebih tepatnya, tidak digambar) namun nyaman. Tempat kosong di kisi terlihat sama dengan karakter ruang dan akan dianggap setara.
"Real-time" didefinisikan di sini sebagai kurang dari 200 ms antara input dan output yang sesuai ditarik.
Sesuai kebijaksanaan Anda tombol mouse mana yang diamati untuk input, dan apakah pers atau rilis merupakan "klik".
Kanvas harus dibersihkan, atau setara visual harus dicapai. Dengan solusi berbasis terminal, misalnya, mencetak kanvas baru di bawah kanvas sebelumnya tidak dianggap setara.
Ketika pengguna mengklik di dekat tepi kanvas sehingga beberapa karakter mata akan ditarik keluar dari tepi kanvasnya, perilaku tidak terdefinisi. Namun, program harus terus berjalan secara normal pada klik berikutnya.
Ketika kursor mouse meninggalkan "kanvas," perilaku tidak terdefinisi, tetapi program harus terus berjalan secara normal ketika kursor masuk kembali ke kanvas.
Kursor teks dapat muncul di kanvas, selama itu tidak mengaburkan output.
Celah standar dilarang.
<pre>
atau font-family:monospace
).