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.
sumber
<pre>
ataufont-family:monospace
).Jawaban:
HTML + CSS + JavaScript (ES6), 93 + 19 +
278276 = 388 bytesumber
X||Y
dapat di-golfX|Y
untuk menghemat 2 byte.|
berakhir diutamakan daripada ekspresi ternary.|
dan||
pada tingkat yang agak sama, dan keduanya di atas?:
.. KeduanyaX||Y?w*r(cos(a)):0
danX||Y?h*r(sin(a)):0
saat ini dalam bentukboolean_condition?A:B
. Jadi, ketika Anda mengubahX||Y
untukX|Y
itu akan melakukan sedikit-ATAU bijak dan kemudian menafsirkan sebagai kondisi boolean lagi. ((X||Y)?A:B
vs(X|Y)?A:B
, tidakX|(Y?A:B)
). Juga, saya tidak melihat perbedaan ketika saya menggunakan "Salin cuplikan untuk menjawab" dan ubah||
ke|
. Semuanya masih berjalan persis sama sejauh yang saya tahu ..Excel VBA, 630 Bytes
Mengumumkan subrutin lembar kerja yang berjalan pada klik mouse yang tidak mengambil input dan menghasilkan sepasang mata yang mengikuti kursor. Ini tergantung pada fungsi pembantu yang disertakan dan deklarasi jenis, yang harus ditempatkan dalam modul normal.
Versi ini dikalibrasi untuk dijalankan pada zoom default 100%. Hancur jika Anda mencoba menggulir.
Fungsi Pembantu dan Deklarasi Jenis
Tidak Disatukan dan Dikomentari
Versi ini dikalibrasi untuk dijalankan pada tingkat pembesaran 400%.
Fungsi Pembantu dan Deklarasi Jenis
Keluaran
Gif
Gambar Res Tinggi
sumber
'
karakter paling kanan output akan berbeda dari ketika berada di'
karakter paling kiri . 2. Posisi mata tidak tetap. Klik mouse harus menyebabkan mereka pindah ke posisi yang diklik. Saya fleksibel pada metode input (saya akan menerima, katakanlah, kursor mouse virtual yang dikendalikan oleh tombol panah), tetapi ada dua peristiwa input yang berbeda dengan perilaku yang berbeda: gerakan mouse dan klik mouse.Worksheet_SelectionChange
acara dan melewati rentang panggilan (Target
atauT
dalam kasus ini) - yang menggambar ulang mata dan*
panggilan. selQBasic ( QB64 ),
361305 byteKlik kiri menempatkan mata. Jika penempatan mata akan menyebabkan sebagian mata keluar dari batas, program "membeku" sampai penempatan yang benar dilakukan.
Bagian rumit utama adalah menempatkan murid. Sebagian besar waktu, koordinat pupil hanya pusat mata plus (tanda (Δx), tanda (Δy)), kecuali bahwa dalam oktan 1 dan 5, koordinat y sama dengan pusat-y, dan dalam oktan 3 dan 7, koordinat x sama dengan x-center. Batas oktan dapat dihitung menggunakan kemiringan
m
garis dari pusat mata ke koordinat mouse. Dengan mudah, membaginya dengan nol saat menghitung kemiringan memberikan floating-point infinity (+/-) daripada kesalahan.Tidak disatukan
sumber
?0
bukan?"0"
? Ini menunjukkan bahwa Anda dapat menggunakan ekspresi numerik dan juga string."| |"
. Jadi mungkin tidak akan menyelamatkan apa pun."0"
hanya 2 byte lebih lama.6502 kode mesin ( mouse C64 + 1351 ), 630 byte
Beraksi:
Tidak ada demo online , maaf, karena ada emulator AFAIK no js C64 yang mendukung mouse. Jika Anda ingin mencobanya sendiri, ambil VICE , unduh biner yang dapat dieksekusi dan jalankan di emulator C64:
Untuk mengambil / menghapus tab input mouse dalam menjalankan emulator, gunakan
ctrl+m
di Unix / Linux danctrl+q
di windows.Ya, ini harus dilakukan;) Setelah semua, ada adalah sebuah Commodore tikus asli untuk C64, tapi tentu saja, sistem builtin operasi tidak mendukung, jadi saya pertama membutuhkan driver mouse, yang sudah mengambil 230 bytes ( termasuk sprite hardware berbentuk kursor mouse dan batas memeriksa kode untuk area layar, tetapi tanpa menerjemahkan koordinat pointer ke koordinat layar teks).
Jika Anda tertarik, Anda dapat membaca kode sebagai sumber perakitan di sini :)
sumber
Bersih ,
1014904892884840814782772769 byte-6 byte jika mata tidak perlu membentur kisi
Ini tidak mudah. UI dalam bahasa fungsional jarang.
Pastikan Anda menggunakan iTasks Clean,
Courier
instal font, danStdLib
SEBELUM ada subfolderObjectIO
di jalur pencarian modul.Kompilasi dengan (misalnya, mungkin berbeda):
clm -IL StdLib -IL ObjectIO -IL "ObjectIO/OS <YOUR_OS_HERE>" -IL Dynamics -IL Generics -IL Platform -nci <MODULE_NAME_HERE>
Jika Anda belum pernah menjalankan Bersihkan sebelumnya, perkirakan proyek ini membutuhkan waktu 5+ menit untuk dikompilasi.
Tidak Disatukan:
Seperti yang dapat Anda lihat dari versi yang tidak disunting, sebagian besar kode hanya mengatur kombinasi "font monospace" dengan "response to the mouse". Dan meskipun
Courier
tidak membuatnya mudah untuk dikatakan, itu sebenarnya menggambar.
dan'
. Bertukar dengan sesuatu sepertiConsolas
membuatnya lebih jelas.sumber
(abs m)<9&&(abs n)<w='9'
ke(abs m)<9&(abs n)<w='9'
? Juga, saya sarankan menambahkan layar-ke-gif bukan tangkapan layar.Ruby, 335 + 13 = 348 byte
+13 byte untuk
-rio/console
mengaktifkan flagIO#getch
.Berisi
0x1b
karakter ESC ( ) literal , yang ditunjukkan seperti di␛
bawah ini. xxd dump mengikuti.Perhatian: Ini tidak membersihkan setelah itu sendiri saat keluar. Lihat catatan di bawah xxd dump di bawah ini.
Tidak disatukan
Ini adalah golf yang cukup naif dari implementasi Ruby asli saya .
dump xxd
Program ini menyalakan pelacakan tetikus dengan urutan kontrol xterm
\e[?1003h
tetapi tidak mematikannya saat keluar. Untuk mematikannya, gunakan urutan kontrol\e[?1003l
, misalnya:Karena program memakan semua input, sulit untuk keluar. Jika Anda ingin dapat keluar dengan menekan Ctrl + C, tambahkan baris berikut di bawah ini
(s<<STDIN.getch
:Tanpa basa-basi:
sumber