ভিজ্যুয়াল আইজ ভিজ্যুয়ালাইজ করুন


42

আপনি এক্স উইন্ডো সিস্টেমের সাথে (এবং যতদূর আমি জানি, এখনও আসে) একটি ডেমো প্রোগ্রাম জিসস বা স্মরণ করতে পারে না। এর উদ্দেশ্যটি ছিল এমন এক জোড়া চোখ আঁক যা আপনার মাউস কার্সারকে অনুসরণ করেছিল:

Xeyes

আপনার চ্যালেঞ্জটি এসিআইআইআই আর্টের সাহায্যে জিৎসকে পুনরায় তৈরি করা। এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যা ব্যবহারকারী যেখানেই ক্লিক করে দুটি ASCII আর্ট চোখ আঁকেন (নীচে নির্দিষ্ট করা) এবং তারপরে তাদের ছাত্রদের কার্সারের দিক নির্দেশ করার দিকে নিয়ে যান।

টার্মিনাল আইজ জিআইএফ

উপরের জিআইএফ এই নন-গল্ফযুক্ত রুবি বাস্তবায়নের একটি রেকর্ডিং , যা রুবির সাম্প্রতিক সংস্করণ দিয়ে চালানো যেতে পারে। আপনি Xterm নিয়ন্ত্রণ সিকোয়েন্সগুলির রেফারেন্স হিসাবে এটি দরকারী হিসাবে পেতে পারেন।

বিশেষ উল্লেখ

এটি , সুতরাং কয়েকটি বাইটের সাথে সমাধানটি জিততে পারে।

এটি একটি হল তাই আপনার প্রোগ্রাম হওয়া ASCII ব্যবহার করে আঁকা উচিত নয় অক্ষর-বিশেষভাবে, চ্যালেঞ্জ, অক্ষর -, ., |, ', 0, স্থান, এবং সম্পর্কে newline। 1 2

এটি একটি চ্যালেঞ্জ, সুতরাং আপনার প্রোগ্রামটিকে অবশ্যই ইনপুট গ্রহণ করতে হবে এবং রিয়েলটাইমে এর আউটপুট আঁকতে হবে। 3

আপনার প্রোগ্রামটি ইনপুট গ্রহণ করা শুরু করার আগে, এটি কমপক্ষে 20 টি সারি এবং 20 টি কলামের ফাঁকা ক্যানভাস শুরু করতে হবে। ব্যবহারকারী ক্যানভাসে ক্লিক না করা পর্যন্ত এটি কিছু আঁকতে হবে না।

যে কোনও সময় ব্যবহারকারী ক্যানভাসে 4 ক্লিক করে, প্রোগ্রামটির কোনও পূর্ববর্তী আউটপুট সাফ করা উচিত এবং তারপরে মাউস কার্সারের অবস্থানের নিকটবর্তী চরিত্রকে কেন্দ্র করে এই ASCII চোখগুলি ক্যানভাসে আঁকতে হবে। 5 6 (নীচে, মাউস কার্সারের প্রতিনিধিত্ব করে এবং এটি আঁকানো উচিত নয়))

.---. .---.
|   | |   |
|  0|✧|0  |
|   | |   |
'---' '---'

ছাত্ররা কার্সারের দিকে কীভাবে "নির্দেশ" করে তা লক্ষ করুন।

যে কোনও সময় মাউস কার্সার ক্যানভাসে চলে আসে, প্রোগ্রামটির ছাত্রদের পুনরায় অঙ্কন করা উচিত যাতে তারা কার্সারের দিকে নির্দেশ করে চালিয়ে যেতে থাকে, যেমন 7 :




.---. .---.
|  0| |  0|
|   | |   |
|   | |   |
'---' '---'

ছাত্র ইশারা

ধরুন আমরা প্রতিটি চোখের অভ্যন্তরীণ নয় টি চরিত্রের অবস্থানগুলি গণনা করেছি:

.---.
|678|
|591|
|432|
'---'

পুতুলটি কোনও এক জায়গায় আঁকা হবে 1- 9। কোনটি চরিত্রটি বর্গক্ষেত্রের ভান করে এবং ক্যানভাসটি কার্টেসিয়ান গ্রিড, 9(0, 0) এর অক্ষরের কেন্দ্র (1, 0) এর কেন্দ্র 1এবং আরও অনেক কিছু নিয়ে সিদ্ধান্ত নিতে। যখন প্রোগ্রামটি ইনপুট পায় — একটি ক্লিক বা আন্দোলন — এটি ইনপুট অবস্থানটি নিকটতম গ্রিড স্থানাঙ্কে ম্যাপ করে should যদি 𝑀 হয় (0, 0), পুতুলটি (0, 0), অর্থাৎ 9উপরের অবস্থানটি আঁকতে হবে । অন্যথায়, এটি নীচে বর্ণিত হিসাবে আঁকা উচিত।

কল্পনা করুন যে কোনও কার্তেসিয়ান বিমান গ্রিডে সুপারমোজড এবং 1 - 8 নম্বরযুক্ত অক্টেন্টগুলিতে বিভক্ত :

যদি অক্টান্ট 1 এর মধ্যে থাকে , তবে পুতুলটি 1উপরের অবস্থানে , অর্থাৎ (1, 0) এ আঁকতে হবে । যদি অক্টান্ট 2 এ থাকে তবে এটি drawn 2এবং এর মতো করে আঁকতে হবে। উদাহরণস্বরূপ, নীচের চিত্রটি গ্রিডের বর্ণ-কোডিংয়ের কিছু অংশ দেখায় যেখানে মাউস কার্সার নির্দিষ্ট স্থানে থাকে তখন পুতুলটি আঁকতে হবে। উদাহরণস্বরূপ, যখন কার্সারটি সবুজ স্থানাঙ্কের কোনওটিতে থাকে (গ্রিডের স্থানাঙ্কগুলি স্কোয়ারের কেন্দ্রগুলিতে থাকে, তাদের কোণে নয়) মনে রাখে, পুতুলটি আঁকতে হবে 4

দুটি চোখের শিক্ষার্থীরা স্বতন্ত্রভাবে চলাফেরা করে, তাই প্রতিটি চোখের জন্য সেই চোখের কেন্দ্রের সাথে তুলনামূলকভাবে প্রক্রিয়াটি পুনরাবৃত্তি করে।

নোট

  1. এটি কোনও চ্যালেঞ্জ নয়। আউটপুট অবশ্যই অক্ষরের গ্রিড হতে হবে। আপনি অবশ্যই অক্ষরের গ্রিড আঁকার জন্য গ্রাফিক্স রুটিনগুলি ব্যবহার করতে পারেন।

  2. হোয়াইটস্পেস আঁকা হতে পারে (বা, বরং আঁকা না) তবে সুবিধাজনক। গ্রিডের একটি খালি স্থান স্পেস অক্ষর হিসাবে একই দেখায় এবং সমতুল্য হিসাবে বিবেচিত হবে।

  3. "রিয়েল-টাইম" এখানে ইনপুট এবং সংশ্লিষ্ট আউটপুট আঁকানোর মধ্যে 200 মিমি থেকে কম হিসাবে সংজ্ঞায়িত করা হয়েছে।

  4. ইনপুটটির জন্য কোন মাউস বোতাম (গুলি) পর্যবেক্ষণ করা হয় এবং কোনও প্রেস বা রিলিজ একটি "ক্লিক" গঠন করে কিনা তা আপনার বিবেচনার ভিত্তিতে।

  5. ক্যানভাস অবশ্যই সাফ করতে হবে, বা ভিজ্যুয়াল সমতুল্য অর্জন করতে হবে। একটি টার্মিনাল ভিত্তিক সমাধান সহ, উদাহরণস্বরূপ, পূর্ববর্তী ক্যানভাসের নীচে একটি নতুন ক্যানভাস প্রিন্ট করা সমতুল্য হিসাবে বিবেচিত হবে না।

  6. যখন ব্যবহারকারী ক্যানভাসের প্রান্তের কাছে এমনভাবে ক্লিক করেন যে কয়েকটি চোখের অক্ষর তার প্রান্তের বাইরে আঁকতে পারে, তখন আচরণটি সংজ্ঞায়িত হয়। তবে প্রোগ্রামটি অবশ্যই পরবর্তী ক্লিকগুলিতে স্বাভাবিকভাবে চলতে থাকবে।

  7. যখন মাউস কার্সারটি "ক্যানভাস" ছেড়ে যায়, তখন আচরণটি সংজ্ঞায়িত হয়, তবে কার্সারটি ক্যানভাসে পুনরায় প্রবেশ করার সময় প্রোগ্রামটি অবশ্যই চলতে থাকবে।

  8. একটি পাঠ্য কার্সার ক্যানভাসে উপস্থিত হতে পারে, যতক্ষণ না এটি আউটপুটটিকে অস্পষ্ট করে না।

স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ।


2
@ Ousurous যেহেতু এই মুহুর্তে কত মিনিট "কয়েক" হয় তার উপর নির্ভর করে যে সিস্টেমটি কতটা স্মৃতি রয়েছে তার উপর নির্ভর করে এবং এটি আমাদের "এই সমাধানটি পরিবেশের 512 গিগাবাইট র্যামের অঞ্চল" অনুমান করে নিয়ে যেতে পারে, তাই আমি বলতে যাচ্ছি এটি অবশ্যই অনির্দিষ্টকালের জন্য চলতে হবে।
জর্ডান

1
পছন্দ করুন নোট # 6 দেখুন (যদি না আমি আপনার প্রশ্নের ভুল বোঝে)
জর্ডান ১

1
@ Οurous হ্যাঁ, এবং না। যদি আপনার টার্গেট এনভায়রনমেন্টটি সাধারণত এমন হয় যেখানে ডিফল্ট ফন্টটি মনোস্পেস হয় (যেমন, একটি টার্মিনাল এমুলেটর বা কোড সম্পাদক), তবে তা ঠিক। যদি সেই পরিবেশে কোনও মনোস্পেস ফন্ট ব্যবহার করা সাধারণত অতিরিক্ত কনফিগারেশন নেয় (যেমন ব্রাউজার-ভিত্তিক জেএস সমাধানে), তবে কনফিগারেশনটি অবশ্যই আপনার বাইট গণনার অংশ (যেমন <pre>বা font-family:monospace) be
জর্ডান

9
দুর্দান্ত শিরোনামের জন্য +1 (বা খারাপ শিরোনাম, আপনি এটি কীভাবে নেবেন তার উপর নির্ভর করে)
ফ্যান্ট্যাক

1
@ Οurous নাপ, যতক্ষণ না এটি অপ্রত্যাশিতভাবে শেষ হয় না।
জর্ডান

উত্তর:


12

এইচটিএমএল + সিএসএস + জাভাস্ক্রিপ্ট (ইএস 6), 93 + 19 + 278 276 = 388 বাইট

w=7.8125
h=15
with(Math)r=round,
(onclick=e=>F.style=`margin:-3.5em -6.5ch;left:${x=r(e.x/w)*w}px;top:${y=r(e.y/h)*h}px`)({y:-40}),onmousemove=e=>(s=($,o)=>$.style=`left:${a=atan2(Y=r((e.y-y)/h),X=r((e.x-x)/w+o)),X|Y?w*r(cos(a)):0}px;top:${X|Y?h*r(sin(a)):0}px`)(L,3)&&s(R,-3)
*{position:relative
<pre id=F>.---. .---.
|   | |   |
| <a id=L>0</a> | | <a id=R>0</a> |
|   | |   |
'---' '---'


দুটি বাইট বাঁচাতে X||Yগল্ফ করা X|Yযেতে পারে।
কেভিন ক্রুইজসেন 17'18

আপনি যখন ধারকটির নীচের দিকে ক্লিক করেন এবং নীচে স্ক্রোল করতে হয় তখন এত ভাল কাজ করে না। i.stack.imgur.com/s44KU.png স্নিপেটের মোড়কের সাথে সুনির্দিষ্ট কিনা তা নিশ্চিত নয় তবে এটি উল্লেখ করার মতো ছিল।
ড্র্যাকো

2
@ Οurous এটি বরং অস্পষ্টভাবে বলা হয়েছে: "মাউস কার্সারের অবস্থানকে কেন্দ্র করে।" "অবস্থান" এর অর্থ "গ্রিড সেল" বা এর অর্থ "পিক্সেল"? আমি সম্মত হই যে অভিপ্রায়টি সম্ভবত পূর্ববর্তী ছিল, তবে শব্দবন্ধটি সম্ভবত পরবর্তীটিকে মঞ্জুরি দেয়।
DLosc

@ কেভিন ক্রুজসেন দুর্ভাগ্যক্রমে, এটি কার্যকর হয় না - |তিনটি প্রকাশের উপর প্রাধান্য অর্জন করে।
darrylyeo

পছন্দ করেছেন : এস এই জাভাস্ক্রিপ্ট অপারেটর অগ্রাধিকার সারণী দেখায় |এবং ||কিছুটা একই স্তরের এবং উপরে উভয় ?:.. উভয় X||Y?w*r(cos(a)):0এবং X||Y?h*r(sin(a)):0বর্তমানে ফর্মটিতে boolean_condition?A:B। সুতরাং আপনি যখন এতে পরিবর্তন X||Yকরবেন X|Yতখন কিছুটা বুদ্ধিমান OR করবেন এবং তারপরে আবার বুলিয়ান শর্ত হিসাবে ব্যাখ্যা করবেন। ( (X||Y)?A:Bবনাম (X|Y)?A:B, না X|(Y?A:B)) এছাড়াও, আমি কোনো পার্থক্য যখন আমি ব্যবহার এবং পরিবর্তন "কপি উত্তর দিতে snippet" দেখতে না পান ||করতে |। যতদূর আমি বলতে পারি সবকিছু ঠিক একইভাবে কাজ করে ..
কেভিন ক্রুইজসেন

12

এক্সেল ভিবিএ, 630 বাইট

ঘোষিত ওয়ার্কশিট সাবরুটিন যা মাউস ক্লিকে চলে যা কোনও ইনপুট নেয় না এবং কার্সার অনুসরণ করে এক জোড়া চোখ তৈরি করে। এটি অন্তর্ভুক্ত সহায়ক ফাংশন এবং প্রকারের ঘোষণার উপর নির্ভরশীল, যা অবশ্যই একটি সাধারণ মডিউলে স্থাপন করা উচিত।

এই সংস্করণটি 100% ডিফল্ট জুমে চালানোর জন্য ক্যালিবিরেটেড হয়। আপনি স্ক্রোল করার চেষ্টা করলে বিরতি।

দ্রষ্টব্য: ভিবিএ নতুন লাইনে নির্বিঘ্নিত স্ট্রিংটি স্বয়ংক্রিয়ভাবে সম্পূর্ণ করে, সুতরাং নীচের কোডে, এমন তিনটি দৃষ্টান্ত রয়েছে যাতে একটি টার্মিনাল "সম্পূর্ণরূপে হাইলাইট করার উদ্দেশ্যে অন্তর্ভুক্ত করা হয়েছে - এগুলি বাইটোকন্টে অবদান রাখে না

Sub Worksheet_SelectionChange(ByVal t As Range)
With Cells
.Clear
.Font.Name="Courier"'<--- `"` included only for highlighting
.ColumnWidth=1.3
.RowHeight=15
End With
[A1]=" "'<--------------- `"` included only for highlighting
Dim l As p,p As p
GetCursorPos l
While[A1]=" "'<---------- `"` included only for highlighting
DoEvents
GetCursorPos p
For i=0To 1
x=l.x+IIf(i,-56,56)
n=Evaluate("=-Int(-8/Pi()*ATan2("& x-p.x &","& l.y-p.y+0.1 &"))")
n=Asc(-Int(-IIf(Abs(p.x-x)<7And Abs(p.y-l.y)<10,9,IIf(n<-6,8,n)-1)/2)+4)
j=1
For Each c In t.Offset(-2,IIf(i,-5,1)).Resize(5,5)
d=Mid(".---.|567||498||321|'---'",j,1)
c.Value=IIf(d Like"[0-9]",IIf(Asc(d)=n,0," "),"'"&d)
j=j+1
Next c,i
Wend
End Sub

সহায়ক কার্যকারিতা এবং প্রকারের ঘোষণা

Declare Sub GetCursorPos Lib"user32"(l As p)
Type p
x As Long
y As Long
End Type

অবহেলিত এবং মন্তব্য করা হয়েছে

এই সংস্করণটি 400% এর একটি জুম স্তরে চালিত হতে ক্যালিব্রেট করা হয়।

''  must be placed in a worksheet code module

''  define this module to run whenever the user either clicks
''  or moves the selection with the arrow keys
Private Sub Worksheet_SelectionChange(ByVal T As Range)

    ''  Declare vars
    Dim refPos  As POSITION, _
        curPos  As POSITION, _
        c       As Range, _
        d       As String, _
        i       As Integer, _
        j       As Integer, _
        n       As Integer, _
        x       As Integer

    ''  Explicitly state that this works only on the
    ''  Worksheet for which this code has been defined
    With Application.ActiveSheet

        ''  Clear eyes and escape var
        Call .Cells.ClearContents

        ''  Define escape var
        Let .[A1] = " "

        ''  Define reference position
        Call GetCursorPos(refPos)

        ''  While not escaped
        Do While [A1] = " "

            ''  Prevent Excel from appearing to freeze
            Call VBA.DoEvents

            ''  Check where the cursor is
            Call GetCursorPos(curPos)

            ''  Iterate over the eyes' indexes
            For i = 0 To 1 Step 1

                ''  Define the reference center of the eye, left first
                Let x = refPos.x + IIf(i, -168, 168)

                '' figure out which of the directions to point the eye and assign that value to `n`
                Let n = Evaluate("=-Int(-8/Pi()*ATan2(" & x - curPos.x & "," & refPos.y - curPos.y + 0.1 & "))")
                Let n = Asc(-Int(-IIf(Abs(curPos.x - x) < 28 And Abs(curPos.y - refPos.y) < 40, 9, IIf(n < -6, 8, n) - 1) / 2) + 4)

                ''  define character index
                Let j = 1

                ''  Iterate over the range in which the eye is to be drawn
                For Each c In T.Offset(-2, IIf(i, -5, 1)).Resize(5, 5)

                    ''  get correct char from the reference data
                    Let d = Mid(".---.|567||498||321|'---'", j, 1)

                    ''  check if the char is a number, if so only keep it if it matches `n`
                    Let c.Value = IIf(d Like "[0-9]", IIf(Asc(d) = n, 0, " "), "'" & d)

                    '' iterate j
                    j = j + 1
            Next c, i
        Loop
    End With
End Sub

সহায়ক কার্যকারিতা এবং প্রকারের ঘোষণা

''  Declare the 64-Bit Window API function
Declare PtrSafe Function GetCursorPos Lib "user32" (ByRef posObj As POSITION) As LongLong

''  Define the POSITION type; 0,0 is top left of screen
Type POSITION
x As Long
y As Long
End Type

''  Pre-Operations for optimization
Sub Initialize()
    With Cells

        ''  Define the font as being mono-spaced
        .Font.Name = "Lucida Console"

        ''  Define the size of the cells to be tightly bound around a single char
        .ColumnWidth = 1.5
        .RowHeight = 15
    End With
End Sub

আউটপুট

gif

Moving_Eyes

উচ্চতর প্রতিচ্ছবি চিত্র

Static_Eyes


এটি কয়েকটি উপায়ে স্পেসিফিকেশনটির সাথে মেলে না। 1. "অক্ষরের গ্রিড" অর্থ স্বতন্ত্র অবস্থানের একক অক্ষর। যখন মাউস কার্সার চালু থাকে, তখন বলুন, ডান দিকের 'অক্ষরটি আউটপুটটি যখন বাম দিকের অক্ষরে থাকে তার থেকে আলাদা হবে '। ২. চোখের অবস্থান স্থির নয়। মাউস ক্লিকের কারণে তাদের ক্লিক করা অবস্থানে যেতে পারে। আমি ইনপুট পদ্ধতিতে নমনীয় (আমি গ্রহণ করব, বলুন, তীর কীগুলি দ্বারা নিয়ন্ত্রিত একটি ভার্চুয়াল মাউস কার্সার) তবে স্বতন্ত্র আচরণের সাথে দুটি স্বতন্ত্র ইনপুট ইভেন্ট রয়েছে: মাউস চলন এবং মাউস ক্লিক।
জর্দান

@ জর্ডান আমি নিশ্চিত নই যে আপনি 1 পয়েন্ট বলতে চাইছেন, আপনি কি দয়া করে বিস্তারিত বলতে পারবেন? বিন্দু 2 হিসাবে, চোখ স্ট্যাটিক নয়, এবং শীট উপর যেকোনো কক্ষ যা সাবরুটিন আরম্ভ করিবে স্থাপন করা হয় এ ক্লিক Worksheet_SelectionChangeইভেন্ট এবং কলিং পরিসীমা (পাস Targetবা Tএই ক্ষেত্রে) - যা চোখ এবং একটি redraws *কলিং মধ্যে সেল
টেলর স্কট

1
@ জর্ডান - আমি বিশ্বাস করি যে আমি আপনার যে কোনও এবং সমস্ত উদ্বেগকে সম্বোধন করেছি, যদিও এটি করার সময়, আমাকে আমার সমাধানটি -৪-বিট এক্সেলের মধ্যে সীমাবদ্ধ করতে হয়েছে এবং আমি এই মুহুর্তে একটি অব্যক্ত এবং মন্তব্য করা সংস্করণে কাজ করছি
টেলর স্কট

1
@ জর্দান এটি কারণ 32 এবং 64 এর জন্য উইন্ডোজ এপিআইয়ের ঘোষণাগুলি কিন্তু ভিবিএ পৃথক, যেখানে কনটেন্টেশন এবং ক্ষুদ্রতরকরণের নির্দিষ্টকরণ রয়েছে, যেখানে 32 বিট প্রায় সর্বদা সংক্ষিপ্ত থাকে - এবং আমার কাছে বর্তমানে অফিসের 32 বিট সংস্করণে অ্যাক্সেস নেই: পি
টেলর স্কট

3
স্ক্রিন-টু-জিআইএফ-তে দুটি স্ক্রিনশট পরিবর্তন করতে পারে ?
কেভিন ক্রুইজসেন

7

কিউবাসিক ( কিউবি 64 ), 361 305 বাইট

DO
WHILE _MOUSEINPUT
x=CINT(_MOUSEX)
y=CINT(_MOUSEY)
IF _MOUSEBUTTON(1)THEN l=x-3:k=y
IF(2<l)*(73>l)*(2<k)*(22>k)THEN CLS:FOR i=0TO 1:h=l+6*i:LOCATE k-2,h-2:?".---.":FOR j=1TO 3:LOCATE,h-2:?"|   |":NEXT:LOCATE,h-2:?"'---'":d=x-h:e=y-k:m=ABS(e/d):LOCATE k-SGN(e)*(m>=.5),h-SGN(d)*(m<=2):?"0":NEXT
WEND
LOOP

বাম-ক্লিক চোখ রাখে। যদি চোখের বসার ফলে চোখের কিছু অংশ সীমার বাইরে চলে যায়, বৈধ প্লেসমেন্ট না হওয়া পর্যন্ত প্রোগ্রামটি "হিমশীতল" হয়ে যায়।

মূল কৌতুকপূর্ণ অংশটি ছাত্রদের স্থাপন করা। বেশিরভাগ সময়, পুতুলের স্থানাঙ্কগুলি কেবল চোখের প্লাস (চিহ্ন ()x), সাইন ()y)) এর বাইরে থাকে, অক্টেন্ট 1 এবং 5 ব্যতীত, y- স্থানাঙ্কটি y- কেন্দ্রের সমান হয় এবং অক্টেন্টগুলিতে থাকে 3 এবং 7, এক্স-কো-অর্ডিনেট এক্স-সেন্টারের সমান। mচোখের কেন্দ্র থেকে মাউস স্থানাঙ্ক পর্যন্ত লাইনটির opeাল ব্যবহার করে অক্টেন্ট সীমানা গণনা করা যায় । সুবিধামতভাবে, opeাল গণনা করার সময় শূন্য দ্বারা ভাগ করা ত্রুটির পরিবর্তে ভাসমান-পয়েন্ট অনন্ত (+/-) দেয়।

কিউবি 64 তে ভিজ্যুয়াল চোখ eyes

Ungolfed

' Loop forever
DO
    ' Do stuff if there is new mouse data (movement or click)
    IF _MOUSEINPUT THEN
        ' Store the mouse coords rounded to the nearest integer
        mouse_x = CINT(_MOUSEX)
        mouse_y = CINT(_MOUSEY)
        ' If left mouse button was clicked, change location of eyes
        IF _MOUSEBUTTON(1) THEN
            ' Store center coordinates of left eye
            left_center_x = mouse_x - 3
            center_y = mouse_y
        END IF
        ' If eye location is in bounds, print the eyes and pupils
        x_in_bounds = left_center_x > 2 AND left_center_x < 73
        y_in_bounds = center_y > 2 AND center_y < 22
        IF x_in_bounds AND y_in_bounds THEN
            CLS
            FOR eye = 1 TO 2
                ' eye = 1 for left eye, eye = 2 for right eye
                IF eye = 1 THEN center_x = left_center_x
                IF eye = 2 THEN center_x = left_center_x + 6
                ' Print eye borders
                LOCATE center_y - 2, center_x - 2
                PRINT ".---."
                FOR row = 1 TO 3
                    LOCATE , center_x - 2
                    PRINT "|   |"
                NEXT row
                LOCATE , center_x - 2
                PRINT "'---'"
                ' Calculate coordinates of pupil
                xdiff = mouse_x - center_x
                ydiff = mouse_y - center_y
                slope = ydiff / xdiff
                ' For most cases, adding the sign of the diff to the center
                ' coordinate is sufficient
                pupil_x = center_x + SGN(xdiff)
                pupil_y = center_y + SGN(ydiff)
                ' But in octants 3 and 7, the x-coordinate is centered
                IF ABS(slope) > 2 THEN pupil_x = center_x
                ' And in octants 1 and 5, the y-coordinate is centered
                IF ABS(slope) < 0.5 THEN pupil_y = center_y
                LOCATE pupil_y, pupil_x
                PRINT "0"
            NEXT eye
        END IF   ' in bounds
    END IF   ' mouse data
LOOP   ' forever

আমি কিউবি ব্যবহার করে এক-দু' দশক হয়ে গেছে, তবে আপনি কি তার ?0পরিবর্তে ব্যবহার করতে পারবেন না ?"0"? এটি পরামর্শ দেয় আপনি স্ট্রিংয়ের পাশাপাশি সংখ্যাসূচক ভাবটিও ব্যবহার করতে পারেন।
জোয়ি

পছন্দ করুন এটিকে একটি সংখ্যা হিসাবে মুদ্রণ করা এর আগে এবং পরেও একটি জায়গা মুদ্রণ করে ... তবে এটি ভাবতে আসা করুন, আমি বাজি ধরেছি যে আমি প্রথমে শিক্ষার্থীদের মুদ্রণ করতে পারি এবং তারপরে কোনও সমস্যা হবে না। তারপরে আমাকে বাদে বাম এবং ডান সীমানা আলাদাভাবে মুদ্রণ করতে হবে "| |"। সুতরাং এটি সম্ভবত কিছু সংরক্ষণ করবে না। "0"আর মাত্র 2 বাইট লম্বা।
DLosc

7

6502 মেশিন কোড (সি 64 + 1351 মাউস ), 630 বাইট

00 C0 20 44 E5 A9 FF 85 5E A2 3F A9 00 8D 10 D0 8D 1B D0 9D C0 02 CA 10 FA A0
0A A2 1E B9 5A C2 9D C0 02 CA CA CA 88 10 F4 A9 0B 8D F8 07 A9 18 8D 00 D0 A9
32 8D 01 D0 A9 0D 8D 27 D0 A9 01 8D 15 D0 78 A9 60 8D 14 03 A9 C1 8D 15 03 58
D0 FE 84 FD 85 FE A8 38 E5 FD 29 7F C9 40 B0 04 4A F0 0A 60 09 C0 C9 FF F0 03
38 6A 60 A9 00 60 20 44 E5 A5 69 38 E9 05 B0 02 A9 00 C9 1E 90 02 A9 1D 85 FD
18 69 02 85 5C 69 06 85 5D A5 6A 38 E9 02 B0 02 A9 00 C9 15 90 02 A9 14 85 FE
18 69 02 85 5E A9 65 8D BB C0 A9 C2 8D BC C0 A9 04 85 02 A6 FE 20 F0 E9 A9 02
85 5F A4 FD A2 00 BD FF FF 91 D1 C8 E8 E0 05 D0 F5 C8 C6 5F D0 EE E6 FE A9 6A
8D BB C0 A9 C2 8D BC C0 C6 02 30 0E D0 D1 A9 6F 8D BB C0 A9 C2 8D BC C0 D0 C5
60 C5 69 90 0A F0 5D E5 69 85 5F A9 C6 D0 09 49 FF 38 65 69 85 5F A9 E6 8D 1C
C1 8D 23 C1 8D 3E C1 A5 6A C5 5E 90 21 F0 12 E5 5E C5 5F 90 12 4A C5 5F B0 02
C6 FD A6 5E E8 D0 33 C6 FD A6 5E D0 2D 0A C5 5F B0 EE 90 F3 49 FF 38 65 5E C5
5F 90 0C 4A C5 5F B0 02 C6 FD A6 5E CA D0 11 0A C5 5F B0 F4 90 D7 A5 6A C5 5E
90 EE F0 D1 B0 C8 20 F0 E9 A9 30 A4 FD 91 D1 60 AD 19 D4 A4 FB 20 4E C0 84 FB
85 5F 18 6D 00 D0 8D 00 D0 6A 45 5F 10 08 A9 01 4D 10 D0 8D 10 D0 AD 10 D0 4A
AD 00 D0 B0 08 C9 18 B0 16 A9 18 D0 0F C9 58 90 0E 24 5F 10 05 CE 10 D0 B0 EF
A9 57 8D 00 D0 AD 1A D4 A4 FC 20 4E C0 84 FC 49 FF 85 5F 38 6D 01 D0 8D 01 D0
6A 45 5F 10 06 24 5F 10 11 30 07 AD 01 D0 C9 32 B0 04 A9 32 D0 06 C9 FA 90 05
A9 F9 8D 01 D0 A5 69 85 6B A5 6A 85 6C AD 10 D0 4A AD 00 D0 6A 38 E9 0C 4A 4A
85 69 AD 01 D0 38 E9 32 4A 4A 4A 85 6A AD 01 DC 29 10 C5 6D F0 0B 85 6D 29 10
D0 05 20 6C C0 30 10 A5 5E 30 46 A5 69 C5 6B D0 06 A5 6A C5 6C F0 3A A6 5E CA
86 5F A9 03 85 02 A6 5F 20 F0 E9 A9 20 A2 03 A4 5C 88 91 D1 C8 CA D0 FA A2 03
A4 5D 88 91 D1 C8 CA D0 FA E6 5F C6 02 D0 DD A5 5C 85 FD 20 E9 C0 A5 5D 85 FD
20 E9 C0 4C 31 EA 80 C0 E0 F0 F8 FC F0 D8 18 0C 0C 2E 2D 2D 2D 2E 5D 20 20 20
5D 27 2D 2D 2D 27

কর্মে:

ডেমো

কোনও অনলাইন ডেমো নেই , দুঃখিত, কারণ আফাইক নেই কোনও জেএস সি 64 এমিউলেটর মাউসকে সমর্থন করছে। আপনি যদি নিজে চেষ্টা করে দেখতে চান, ভিসি ধরুন , বাইনারি এক্সিকিউটেবলটি ডাউনলোড করুন এবং সি 64 এমুলেটরটিতে এটি শুরু করুন:

x64sc -autoload xeyes.prg -controlport1device 3 -keybuf 'sys49152\n'

চলমান এমুলেটরটিতে মাউস ইনপুটটি ধরতে / অংগ্রেব করতে ctrl+mইউনিক্স / লিনাক্স এবং ctrl+qউইন্ডোতে ব্যবহার করুন ।


সব পরে,); হ্যাঁ, এই কাজ করা হয়েছিল হয় C64 জন্য একটি মূল কমোডর মাউস, তবে অবশ্যই, builtin অপারেটিং সিস্টেম এটিকে সমর্থন করে না, তাই আমি প্রথম একটি মাউস ড্রাইভার, যা ইতিমধ্যে 230 বাইট গ্রহণ (প্রয়োজন মাউস-কার্সার আকারের হার্ডওয়্যার স্প্রিট এবং পর্দার ক্ষেত্রের জন্য সীমানা পরীক্ষা করার কোড সহ, তবে পাঠ্য স্ক্রিনের স্থানাঙ্কগুলিতে পয়েন্টার স্থানাঙ্কটি অনুবাদ না করে)।

  • কিছু বাইট সুরক্ষিত করার জন্য, আমি ওএসের আইআরকিউকে কাজ করে রাখার সিদ্ধান্ত নিয়েছি এবং যেখানে সম্ভব সেখানে কয়েকটি কর্নাল রুটিন ব্যবহার করতে হবে (পর্দা সাফ করা এবং একটি পাঠ্য স্ক্রিন সারিটির জন্য বেস পয়েন্টার পেতে)।
  • কোডটি জেরোপেজে সমস্ত ভেরিয়েবল রাখে, যা আরও কিছু বাইট সংরক্ষণ করে, তবে বেসিক দ্বারা ব্যবহৃত ভাসমান পয়েন্ট মানগুলিকে ধ্বংস করে। প্রোগ্রামটি যেভাবে কোনওভাবেই প্রস্থান করে না, এটি কোনও বিষয় নয়।
  • আকার হ্রাস করার তৃতীয় কৌশলটি হ'ল স্ব-পরিবর্তন:: চোখের বাম দিকে পুতুলটি রাখার জন্য কেবলমাত্র কোড রয়েছে । ডান পাশের বর্ধনের নির্দেশাবলীতে কিছু হ্রাস নির্দেশাবলী প্যাচ করার পরে একই কোডটি পুনরায় ব্যবহার করা হয়েছে।

আপনি যদি আগ্রহী হন, তাহলে আপনি কোড পড়তে পারেন হিসাবে সমাবেশ উৎস এখানে :)


আমি মনে করি একমাত্র এখানেই সময়ে সময়ে সি 64৪ কোডের সাথে প্রতিযোগিতা করার চেষ্টা করছি। এই চ্যালেঞ্জটি পছন্দ হয়েছে , কারণ সি on64 এর একটি মাউস "বিদেশী" কিছু! যদি কেউ আশ্চর্য হয়ে যায় যে আমি কেন ইদানীং কম সক্রিয় আছি, এটি কারণ: csdb.dk/release/?id=161435 - অবশেষে সি
for64 এর

1
কেবল এটির মজাদার জন্য, আমি একটি "ডিলাক্স সংস্করণ" করেছি: csdb.dk/re कृपया
ফেলিক্স প্যালম্যান

7

পরিষ্কার , 1014 904 892 884 840 814 782 772 769 বাইট

-6 বাইট যদি গ্রিডে স্ন্যাপ করার প্রয়োজন না হয়

এটা সহজ ছিল না। ফাংশনাল ভাষায় ইউআই খুব কমই হয়।

import StdEnv,StdIO,osfont,ostoolbox
a=toReal
c=1>0
Start w#(d,w)=openId w
#(t,w)=worldGetToolbox w
#(_,f,_)=osSelectfont("Courier",[],9)t
=let$p#(s,p)=accPIO getProcessWindowSize p
    =snd(openWindow NilLS(Window""NilLS[WindowId d,WindowMouse(\_=c)Able(noLS1@),WindowViewSize s,WindowPen[PenFont f]])p);@(MouseUp p _)s={s&ls=p};@(MouseMove p _)s=:{ls={x,y},io}={s&io=setWindowLook d c(c,(\_{newFrame}i#(w,i)=getFontCharWidth f' '(unfill newFrame i)
    =let g v=let m=y-p.y;n=p.x-x-v*w;s=abs(a m/a n);k|abs m<9&&abs n<w=5|s<0.4142=if(n>0)6 4=sign if(s>2.4143)0n+if(m>0)2 8in[".---.":["|"+++{if(k==e)'0'' '\\e<-[j..j+2]}+++"|"\\j<-[1,4,7]]]++["'---'"]in foldr(\e=drawAt{x=(x/w-5)*w,y=(y/9+e-2)*9}([a+++" "+++b\\a<-g -3&b<-g 3]!!e))i[0..4]))io};@_ s=s
in startIO SDI zero$[]w

নিশ্চিত হয়ে নিন যে আপনি আইটাস্কস ক্লিন ব্যবহার করছেন, Courierফন্টটি ইনস্টল করেছেন এবং মডিউল অনুসন্ধানের পথে StdLibকোনও সাবফোল্ডার রয়েছে ObjectIO

সংকলন (উদাহরণস্বরূপ, পৃথক হতে পারে): clm -IL StdLib -IL ObjectIO -IL "ObjectIO/OS <YOUR_OS_HERE>" -IL Dynamics -IL Generics -IL Platform -nci <MODULE_NAME_HERE>

যদি আপনি এর আগে কখনই ক্লিন পরিচালনা করেন না, আশা করুন এই প্রকল্পটি সংকলিত হতে 5+ মিনিট সময় লাগবে।

Ungolfed:

module main
import StdEnv,StdIO,osfont,ostoolbox
height=9
SlopeFor225 :== 0.4142

StartSize :== 8

Universe :== {corner1={x=0,y=0},corner2={x=1,y=1}}

Start :: *World -> *World
Start world = startConsole (openIds 1 world)

startConsole :: ([Id],*World) -> *World
startConsole ([windowID],world)
    # (toolbox,world) = worldGetToolbox world
    # (_,font,toolbox) = osSelectfont ("Consolas",[],height) toolbox
    = startIO SDI {x=0,y=0} (initialise font) [ProcessClose closeProcess] world
where
    initialise font pst
        # (size,pst) = accPIO getProcessWindowSize pst
        # (error,pst) = openWindow undef (window font size) pst
        | error<>NoError = abort "bad window"
        = pst

    window font size
        = Window "Xeyes" NilLS
            [WindowId           windowID
            ,WindowClose        (noLS closeProcess)
            ,WindowMouse        mouseFilter Able (noLS1 track)
            ,WindowViewDomain   Universe//(getViewDomain StartSize)
            ,WindowViewSize     size
            ,WindowPen          [PenFont font]
            ]

    track (MouseDown pos _ _) state=:{ls=point=:{x,y},io}
        # point = pos
        // move to mouse position
        = {state & ls=pos}

    track (MouseMove pos _) state=:{ls=point=:{x,y},io}
        //redraw to point at mouse
        # io = setWindowLook windowID True (True, look) io
        = {state & ls=point,io=io}
    where
        look _ {newFrame} picture
            # picture = unfill newFrame picture
            # (width,picture) = getPenFontCharWidth' 'picture
            = let
                determineSector u
                    # yDist = (y - pos.y)
                    # xDist = (pos.x - u)
                    # slope = abs(toReal yDist / toReal xDist)
                    | (abs yDist) < height && (abs xDist) < width = '9'
                    | slope < SlopeFor225 = if(xDist > 0) '1' '5'
                    | yDist > 0
                        | slope > (2.0+SlopeFor225) = '7'
                        = if(xDist > 0) '8' '6'
                    | slope > (2.0+SlopeFor225) = '3'
                    = if(xDist > 0) '2' '4'
                getEye u=map(map(\e|isDigit e=if(e==determineSector(x+u*width))'0'' '=e))[['.---.'],['|678|'],['|591|'],['|432|'],['\'---\'']]
            in foldr(\i pic=drawAt{x=(x/width-5)*width,y=(y/height+i-2)*height}([toString(a++[' ':b])\\a<-getEye -3&b<-getEye 3]!!i)pic)picture[0..4]

    mouseFilter (MouseDown _ _ _) = True
    mouseFilter (MouseMove _ _) = True
    mouseFilter _ = False

আপনি অদম্য সংস্করণ থেকে দেখতে পাচ্ছেন, বেশিরভাগ কোডটি "মাউসের প্রতিক্রিয়া" সহ "মনসপ্যাসেড ফন্ট" এর সংমিশ্রণটি সেট করে। যদিও Courierএটি বলা সহজ করে না, এটি আসলে .গুলি এবং 'গুলি অঙ্কন করে । এর মতো কিছুতে অদলবদল আরও Consolasস্পষ্ট করে তোলে।

এখানে চিত্র বর্ণনা লিখুন


1
আমি এ সব ক্লিন জানি না, তাই সম্ভবত আমি কিছু অদ্ভুত বলছি, কিন্তু এটি পরিবর্তন করা সম্ভব (abs m)<9&&(abs n)<w='9'করতে (abs m)<9&(abs n)<w='9'? এছাড়াও, আমি স্ক্রিনশটের পরিবর্তে স্ক্রিন-টু-জিআইএফ যুক্ত করার পরামর্শ দিচ্ছি ।
কেভিন ক্রুইজসেন

1
@ কেভিন ক্রুইজসেন এটি একাধিক কারণে কাজ করবে না, তবে আমি একই অভিব্যক্তিতে বন্ধনী ফেলে 4 টি বাইট সংরক্ষণ করেছি, তাই ধন্যবাদ! আমি একটি স্ক্রিন জিআইএফ যোগ করেছি!
3urous

1

রুবি, 335 + 13 = 348 বাইট

-rio/consoleসক্ষম করার জন্য পতাকাটির জন্য +13 বাইট IO#getch

আক্ষরিক ESC ( 0x1b) অক্ষর রয়েছে যা নীচে দেখানো হয়েছে । xxd ডাম্প অনুসরণ করে।

সতর্কতা: এটি প্রস্থান করার পরে নিজের পরে পরিষ্কার হয় না। নীচে xxd ডাম্প নীচে নোট দেখুন ।

include Math
$><<"␛[?1003h"
s=""
(s<<STDIN.getch
($><<"␛[2J"
x,y=$3.ord-32,$4.ord-32
u,v=x,y if$2
u&&[x-u+3,x-u-3].map{|a|b=y-v
e=4*asin(b/sqrt(a**2+b**2))/PI
printf"␛[%d;%dH.---.@|567|@|480|@|321|@'---'".gsub(/(#{(a<0?4-e:b<0?8+e:e).round%8rescue 8})|([0-8])|@/){$1?0:$2?" ":"␛[5D␛[1B"},v-2,x-a-2}
s="")if /M(C|(#))(.)(.)$/=~s)while 1

Ungolfed

এটি আমার আসল রুবি বাস্তবায়নের একটি চমকপ্রদ গল্ফ ।

include Math       # Saves a few bytes for asin, sqrt, and PI
$> << "␛[?1003h"   # Print xterm control sequence to start mouse tracking
s = ""             # Variable to hold input-so-far
(
  s << STDIN.getch   # Read a character from STDIN
  (
    $> << "␛[2J"                     # Clear terminal
    x, y = $3.ord - 32, $4.ord - 32  # Get cursor x and y from last match
    u, v = x, y if $2                # Update eye position if last matched control sequence was click ("#")

    u && [x-u+3, x-u-3].map {|a|     # For each eye's x-position
      b = y - v                                       # Eye's y position
      e = 4 * asin(b / sqrt(a**2 + b**2)) / PI        # Convert cursor (x,y) to angle w/ x-axis as 1/8 turns

      printf "␛[%d;%dH.---.@|567|@|480|@|321|@'---'"  # Control code to move text cursor, followed by template for eye
        .gsub(
          /(#{
            (a < 0 ? 4-e : b < 0 ? 8+e : e).round % 8 rescue 8  # Octant number 0-7 or 8 for center
          })|([0-8])|@/
        ){ $1 ? 0 : $2 ? " " : "␛[5D␛[1B" },            # Replace octant number with pupil; other digits with space; and @s with code to move cursor left and down for next line of eye
        v-2, x-a-2                                      # (y, x) position of top left corner of eye
    }
    s = ""                           # Clear input-so-far
  ) if /M(C|(#))(.)(.)$/ =~ s      # ...when input-so-far matches a movement ("C") or click ("#") control sequence
) while 1                        # ...forever

এক্সএক্সডি ডাম্প

এই প্রোগ্রামটি এক্সটার্ম নিয়ন্ত্রণ ক্রম সহ মাউস ট্র্যাকিং \e[?1003hচালু করে তবে প্রস্থান করার সময় এটিকে বন্ধ করে না it এটি বন্ধ করতে, নিয়ন্ত্রণ ক্রম ব্যবহার করুন \e[?1003l, উদাহরণস্বরূপ:

ruby -rio/console visual_eyes.rb; printf '\e[1003l'

প্রোগ্রামটি যেহেতু সমস্ত ইনপুট খায় তাই প্রস্থান করা শক্ত। আপনি যদি Ctrl + C টিপে প্রস্থান করতে সক্ষম হতে চান তবে নীচের নীচের লাইনটি যুক্ত করুন (s<<STDIN.getch:

exit 130 if s.end_with?(?\003)

আরও ঝামেলা ছাড়া:

00000000: 696e 636c 7564 6520 4d61 7468 0a24 3e3c  include Math.$><
00000010: 3c22 1b5b 3f31 3030 3368 220a 733d 2222  <".[?1003h".s=""
00000020: 0a28 733c 3c53 5444 494e 2e67 6574 6368  .(s<<STDIN.getch
00000030: 0a28 243e 3c3c 221b 5b32 4a22 0a78 2c79  .($><<".[2J".x,y
00000040: 3d24 332e 6f72 642d 3332 2c24 342e 6f72  =$3.ord-32,$4.or
00000050: 642d 3332 0a75 2c76 3d78 2c79 2069 6624  d-32.u,v=x,y if$
00000060: 320a 7526 265b 782d 752b 332c 782d 752d  2.u&&[x-u+3,x-u-
00000070: 335d 2e6d 6170 7b7c 617c 623d 792d 760a  3].map{|a|b=y-v.
00000080: 653d 342a 6173 696e 2862 2f73 7172 7428  e=4*asin(b/sqrt(
00000090: 612a 2a32 2b62 2a2a 3229 292f 5049 0a70  a**2+b**2))/PI.p
000000a0: 7269 6e74 6622 1b5b 2564 3b25 6448 2e2d  rintf".[%d;%dH.-
000000b0: 2d2d 2e40 7c35 3637 7c40 7c34 3830 7c40  --.@|567|@|480|@
000000c0: 7c33 3231 7c40 272d 2d2d 2722 2e67 7375  |321|@'---'".gsu
000000d0: 6228 2f28 237b 2861 3c30 3f34 2d65 3a62  b(/(#{(a<0?4-e:b
000000e0: 3c30 3f38 2b65 3a65 292e 726f 756e 6425  <0?8+e:e).round%
000000f0: 3872 6573 6375 6520 387d 297c 285b 302d  8rescue 8})|([0-
00000100: 385d 297c 402f 297b 2431 3f30 3a24 323f  8])|@/){$1?0:$2?
00000110: 2220 223a 221b 5b35 441b 5b31 4222 7d2c  " ":".[5D.[1B"},
00000120: 762d 322c 782d 612d 327d 0a73 3d22 2229  v-2,x-a-2}.s="")
00000130: 6966 202f 4d28 437c 2823 2929 282e 2928  if /M(C|(#))(.)(
00000140: 2e29 242f 3d7e 7329 7768 696c 6520 31    .)$/=~s)while 1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.