คุณอาจจำหรือไม่จำ Xeyes โปรแกรมสาธิตที่มาพร้อมกับ (และเท่าที่ฉันรู้ยังมาพร้อมกับ) ระบบ X window วัตถุประสงค์คือเพื่อวาดดวงตาคู่หนึ่งที่ตามเคอร์เซอร์เมาส์ของคุณ:
ความท้าทายของคุณคือสร้าง Xeyes ใหม่ด้วย ASCII art เขียนโปรแกรมหรือฟังก์ชั่นที่ดึงดูดสายตาแบบ ASCII สองตา (ที่ระบุด้านล่าง) ไม่ว่าผู้ใช้จะคลิกที่ใดจากนั้นเลื่อนลูกศิษย์ของพวกเขาให้ชี้ไปในทิศทางของเคอร์เซอร์
GIF ด้านบนเป็นการบันทึกการใช้งาน Ruby ที่ไม่ได้ตีกอล์ฟซึ่งสามารถเรียกใช้กับ Ruby เวอร์ชันล่าสุดได้ คุณอาจพบว่ามีประโยชน์สำหรับการอ้างอิงสำหรับลำดับการควบคุม Xterm
ข้อมูลจำเพาะ
นี่คือรหัสกอล์ฟดังนั้นการแก้ปัญหาด้วยจำนวนไบต์น้อยที่สุดจะเป็นผู้ชนะ
นี้เป็นASCII ศิลปะท้าทายเพื่อให้โปรแกรมของคุณจะต้องวาดโดยใช้อักขระ ASCII โดยเฉพาะอักขระ-
, .
, |
, '
, 0
พื้นที่และขึ้นบรรทัดใหม่ 1 2
นี่เป็นความท้าทายแบบโต้ตอบดังนั้นโปรแกรมของคุณต้องยอมรับอินพุตและวาดผลลัพธ์ในแบบเรียลไทม์ 3
ก่อนที่โปรแกรมของคุณจะเริ่มรับอินพุตควรเริ่มต้นผืนผ้าใบว่างเปล่าอย่างน้อย 20 แถวและ 20 คอลัมน์ ไม่ควรวาดอะไรจนกว่าผู้ใช้จะคลิกบนพื้นที่วาดภาพ
เมื่อใดก็ตามที่ผู้ใช้คลิก4บนผืนผ้าใบโปรแกรมควรล้างเอาต์พุตก่อนหน้าใด ๆ จากนั้นดึง ASCII eyes บนผืนผ้าใบโดยคำนึงถึงตัวละครที่อยู่ใกล้กับตำแหน่งของเคอร์เซอร์ของเมาส์มากที่สุด 5 6 (ด้านล่าง✧
แสดงถึงเคอร์เซอร์ของเมาส์และไม่ควรวาด)
.---. .---.
| | | |
| 0|✧|0 |
| | | |
'---' '---'
สังเกตว่านักเรียน "ชี้" ไปทางเคอร์เซอร์อย่างไร
เมื่อใดก็ตามที่เคอร์เซอร์ของเมาส์เคลื่อนที่บนผืนผ้าใบโปรแกรมควรวาดนักเรียนใหม่เพื่อให้พวกเขาชี้ไปที่เคอร์เซอร์ต่อไปเช่น7 :
✧
.---. .---.
| 0| | 0|
| | | |
| | | |
'---' '---'
นักเรียนชี้
สมมติว่าเราแจกแจงตำแหน่งของอักขระเก้าในของแต่ละตาดังนี้:
.---.
|678|
|591|
|432|
'---'
นักเรียนจะถูกวาดที่หนึ่งในสถานที่1
- 9
. ในการตัดสินใจว่าจะเลือกอันใดให้แกล้งตัวละครเป็นสี่เหลี่ยมจัตุรัสและผืนผ้าใบเป็นตารางคาร์ทีเซียนโดยมีจุดกึ่งกลางของ9
อักขระที่ (0, 0), ศูนย์กลางของ1
ที่ (1, 0) และอื่น ๆ เมื่อโปรแกรมได้รับอินพุต - คลิกหรือการเคลื่อนไหว - ควรแมปตำแหน่งอินพุตกับพิกัดกริดที่ใกล้ที่สุด𝑀 ถ้า𝑀คือ (0, 0) นักเรียนควรวาดที่ (0, 0) เช่นตำแหน่งที่อยู่9
ด้านบน มิฉะนั้นควรวาดตามที่อธิบายไว้ด้านล่าง
ลองนึกภาพเครื่องบินคาร์ทีเซียนซ้อนทับบนตารางและแบ่งออกเป็น octants หมายเลข1 - 8 :
ถ้า𝑀อยู่ใน octant 1นักเรียนควรวาดที่ตำแหน่ง1
ด้านบนเช่นที่ (1, 0) ถ้า𝑀อยู่ใน octant 2ควรวาดที่2
- และอื่น ๆ เพื่อแสดงให้เห็นภาพด้านล่างแสดงส่วนหนึ่งของตารางรหัสสีตามตำแหน่งที่นักเรียนควรวาดเมื่อเคอร์เซอร์ของเมาส์อยู่ในตำแหน่งที่ต้องการ ตัวอย่างเช่นเมื่อเคอร์เซอร์อยู่ที่ใด ๆ ของพิกัดสีเขียว (ทำให้ทราบว่าพิกัดกริดนอนอยู่ที่ศูนย์สี่เหลี่ยมไม่มุมของพวกเขา) 4
นักเรียนควรจะวาดที่
นักเรียนตาทั้งสองเคลื่อนไหวอิสระดังนั้นสำหรับตาแต่ละข้างทำซ้ำกระบวนการโดย𝑀เทียบกับศูนย์กลางของตานั้น
หมายเหตุ
นี่ไม่ใช่ความท้าทายในการแสดงผลกราฟิก เอาต์พุตต้องเป็นกริดของอักขระ แน่นอนคุณอาจใช้กราฟิกเป็นกิจวัตรเพื่อวาดตารางของตัวละคร
ช่องว่างอาจจะวาด (หรือค่อนข้างไม่วาด) อย่างไรก็ตามมีความสะดวก จุดที่ว่างในกริดดูเหมือนกับอักขระเว้นวรรคและจะถือว่าเทียบเท่ากัน
"Real-time" ถูกกำหนดที่นี่เป็นน้อยกว่า 200ms ระหว่างอินพุตและเอาต์พุตที่สอดคล้องกัน
ขึ้นอยู่กับดุลยพินิจของคุณว่ามีการใช้เมาส์ปุ่มใดในการป้อนข้อมูลและการกดหรือปล่อยจะถือว่าเป็นการ "คลิก"
ผืนผ้าใบจะต้องถูกล้างออกหรือต้องได้ภาพที่เทียบเท่า ด้วยโซลูชันที่อิงกับเทอร์มินัลตัวอย่างเช่นการพิมพ์ผืนผ้าใบใหม่ใต้ผืนผ้าใบก่อนหน้านี้ไม่ถือว่าเทียบเท่า
เมื่อผู้ใช้คลิกใกล้กับขอบผ้าใบซึ่งอักขระตาบางส่วนจะถูกดึงออกมาจากขอบของมันพฤติกรรมจะไม่ได้กำหนด อย่างไรก็ตามโปรแกรมจะต้องทำงานต่อไปตามปกติเมื่อมีการคลิกครั้งต่อไป
เมื่อเคอร์เซอร์ของเมาส์ออกจาก "canvas" ลักษณะการทำงานจะไม่ได้กำหนด แต่โปรแกรมจะต้องทำงานต่อไปตามปกติเมื่อเคอร์เซอร์เข้าสู่ Canvas อีกครั้ง
เคอร์เซอร์ข้อความอาจปรากฏบนผืนผ้าใบตราบใดที่มันไม่ปิดบังเอาท์พุท
ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
<pre>
หรือfont-family:monospace
)