दो बिंदुओं के बीच की सबसे छोटी दूरी एक रेखा है


27

आकार में कम से कम 400 पिक्सेल x 400 पिक्सेल की स्क्रीन पर एक इंटरैक्टिव कैनवास बनाने के लिए एक प्रोग्राम या फ़ंक्शन को कोड करें। कैनवास कोई भी रंग हो सकता है जिसे आप चाहें, बॉर्डर या बॉर्डरलेस, किसी टाइटल बार के साथ या बिना, आदि, स्पष्ट कैनवास के कुछ रूप।

उपयोगकर्ता कैनवास के दो अलग-अलग क्षेत्रों पर क्लिक करेगा और प्रोग्राम को कुछ फैशन में उन दो क्लिकों के बीच यूक्लिडियन दूरी (पिक्सेल में) का उत्पादन करना होगा (STDOUT, अलर्ट प्रदर्शित करना आदि)। दो क्लिक केवल बाएं क्लिक, केवल दाएं क्लिक, पहले के लिए एक बाएं क्लिक और दूसरे के लिए दायां क्लिक, दो डबल-बाएं-क्लिक आदि हो सकते हैं, कोई भी संयोजन स्वीकार्य है। विशेष नोट: क्लिकिंग-एंड-ड्रैगिंग (जैसे, दूसरे बिंदु के रूप में MOUSEUP का उपयोग करना) विशेष रूप से अनुमति नहीं है; उन्हें दो अलग-अलग क्लिक होने चाहिए।

उपयोगकर्ता को कई बार ऐसा करने में सक्षम होना चाहिए, और प्रत्येक बार एक आउटपुट प्राप्त करना होगा, जब तक कि कार्यक्रम बंद / बल-छोड़ दिया / मार डाला / आदि। आप अपने कोड के लिए जो कुछ भी गोल्फर है, उसे बंद करने (एक्स, सीटीएल-सी, आदि को क्लिक करने) की विधि चुन सकते हैं।

नियम

  • या तो एक पूर्ण कार्यक्रम या एक समारोह स्वीकार्य हैं। यदि कोई फ़ंक्शन, हालांकि, आपको अभी भी उपयोगकर्ता को किसी भी तरह आउटपुट दिखाना होगा (केवल मूल्य वापस करना स्वीकार्य नहीं है)।
  • आउटपुट कंसोल के लिए हो सकता है, एक चेतावनी के रूप में प्रदर्शित किया जाता है, कैनवास पर पॉप्युलेट किया जाता है, आदि।
  • मानक खामियों को मना किया जाता है।
  • यह इसलिए सभी सामान्य गोल्फिंग नियम लागू होते हैं, और सबसे छोटा कोड (बाइट्स में) जीतता है।

क्या हम सटीक परिणाम (जिसमें वर्गमूल हो सकते हैं) को आउटपुट कर सकते हैं या क्या इसे दशमलव होना चाहिए?
मार्टिन एंडर

@MartinEnder या तो / या। आउटपुट स्वरूपण इस चुनौती का दिलचस्प हिस्सा नहीं है।
AdmBorkBork

1
HTML / JS समाधान, दूसरे क्लिक से, उस क्लिक से पिछली क्लिक की दूरी को आउटपुट करता है। (इसलिए यदि उपयोगकर्ता nबार-बार, संख्याओं के n-1बजाय floor(n/2)मुद्रित होते हैं) तो क्या इसकी अनुमति है?
user202729

@ user202729 यह जो मैं कल्पना कर रहा था उससे थोड़ा बाहर है, लेकिन मैं देख सकता हूं कि यह मेरे द्वारा लिखे गए नियमों का अनुपालन कैसे करता है, इसलिए मैं इसकी अनुमति दूंगा।
AdmBorkBork

1
यदि हमारी भाषा ४०० x ४०० कैनवास का समर्थन नहीं कर सकती तो क्या हम एक छोटे कैनवास आकार का उपयोग कर सकते हैं?
स्कॉट मिलनर

जवाबों:


8

लोगो ( FMSLogo ), 54 52 बाइट्स

[mouseon[setpos mousepos]"[pr distance mousepos]"[]]

दुर्भाग्य से, मैं FMSLogo की तरह किसी भी लोगो दुभाषिया ऑनलाइन समर्थन माउस हैंडलिंग नहीं मिल सकता है।

यह एक "स्पष्ट-स्लॉट टेम्पलेट" है, जो अन्य प्रोग्रामिंग भाषाओं में लैम्ब्डा के समान है। पहले बिंदु के लिए बाएं माउस और दूसरे बिंदु (प्रिंट दूरी) के लिए दाएं माउस पर क्लिक करें।

स्पष्टीकरण: (लोगो एक कछुआ ग्राफिक्स प्रोग्रामिंग भाषा है)

mouseon                  Turn on mouse handling, with the following action:
[setpos mousepos]        Set the turtle to `mousepos` (the position of the mouse) on left mouse down
"                        Do nothing on left mouse up
[pr distance mousepos]   Print the distance from turtle position (`distance` is Logo builtin for that purpose) to `mousepos` on right mouse down
"                        Do nothing on right mouse up
[]                       Do nothing on mouse movement

"एक खाली शब्द है। आम तौर पर टेम्पलेट एक सूची (जहां [], एक खाली सूची, कुछ भी नहीं करता है) होने की उम्मीद है , एक शब्द पारित करना स्वीकार्य है (यह एक सूची में लिपटा हुआ है), और इस मामले में यह 2 बाइट्स बचाता है।

चलाएँ:

apply [... <put the code here> ...] []

applyएक तरह से लोगो में टेम्पलेट को चलाने के लिए है, []तर्क सूची है, जिसके लिए टेम्पलेट से कोई भी प्राप्त करते हैं।


यह न्यूनतम 400x400 कैनवास की गारंटी कैसे देता है?
डेविड मुल्डर

1
@DavidMulder FMSLogo डिफ़ॉल्ट रूप से (अतिरिक्त कमांड लाइन के बिना) कैनवास 1000 × 1000 से शुरू होता है।
user202729

7

मैथेमेटिका, 94 बाइट्स

e="MouseDown";m:=x=MousePosition[];1~RandomImage~400~EventHandler~{e:>m,{e,2}:>Echo@Norm[x-m]}

कैनवास एक यादृच्छिक ग्रे-स्केल छवि है, पहला क्लिक बाएं क्लिक और दूसरा राइट-क्लिक होना चाहिए। सटीक व्यवहार वास्तव में यह है कि राइट-क्लिक अंतिम क्लिक (बाएं या दाएं) की दूरी को प्रिंट करता है , इसलिए यदि आप बार-बार राइट-क्लिक का उपयोग करते हैं, तो आप लगातार दूरी भी प्राप्त कर सकते हैं।

परिणाम सटीक हैं, इसलिए उनमें एक वर्गमूल हो सकता है।

यदि आपके वेबकैम का रिज़ॉल्यूशन कम से कम 400x400 है, तो आप अपने कैनवास के CurrentImage[]बजाय 1~RandomImage~4003 बाइट्स का उपयोग कर सकते हैं ।


@ जेनी_मैथी मैथमेटिका संस्करण शायद? मैंने 11.1 को यह परीक्षण किया।
मार्टिन एंडर

6

जावा 8, 469 389 388 385 380 357 348 325 बाइट्स

import java.awt.event.*;interface F{static void main(String[]a){new java.awt.Frame(){{setSize(400,400);double[]a={-1,0};addMouseListener(new MouseAdapter(){public void mouseClicked(MouseEvent e){if(a[0]<0){a[0]=e.getX();a[1]=e.getY();}else{System.out.println(Math.hypot(e.getX()-a[0],e.getY()-a[1]));a[0]=-1;}}});}}.show();}}

import javafx.application.*;import javafx.scene.*;import javafx.scene.layout.*;import javafx.stage.*;public class E extends Application{double[]a={-1,0};public void start(Stage s)throws Exception{Pane p=new Pane();s.setScene(new Scene(p,400,400));s.show();p.setOnMouseClicked(e->{if(a[0]<0){a[0]=e.getX();a[1]=e.getY();}else {System.out.println(Math.sqrt(Math.pow(e.getX()-a[0],2)+Math.pow(e.getY()-a[1],2)));a[0]=-1;}});}public static void main(String[]a){launch(a);}}

AWT से छोटा होगा, लेकिन मैंने इसका उपयोग कभी नहीं किया।


मुझे लगता है कि trueहो सकता है 0<1
जोनाथन फ्रेच

इसके अलावा, main(String args[])नहीं हो सकता है main(String[]Z)?
जोनाथन फ्रेच

मुझे लगता है कि {F f=new F();}हो सकता है {new F();}
जोनाथन फ्रेच

setVisible(0<1);हटाया जा सकता है, और आप .show()फ़्रेम में जोड़ सकते हैं ; printlnहो सकता है print
केविन क्रूज़सेन 14

1
@ केविनक्रूजसेन मुझे नहीं पता कि कैसे ओपी कई परिणामों के लिए आउटपुट चाहता है
रॉबर्टो ग्राहम

5

जावा (ओपनजेडके 8) , 282 बाइट्स

import java.awt.event.*;interface M{static void main(String[]a){new java.awt.Frame(){int k,x,y;{addMouseListener(new MouseAdapter(){public void mouseClicked(MouseEvent e){x=e.getX()-k*x;y=e.getY()-k*y;k^=1;if(k<1)System.out.prin‌​tln(Math.hypot(x,y))‌​;}});setSize(800,600‌​);show();}};}}

मैं अभी इसका परीक्षण नहीं कर सकता; अगर कोई मुझे बता सकता है कि क्या कोई संकलक त्रुटियां हैं जो महान होंगी।

AWT शायद कम होगा लेकिन मुझे उस lol के लिए एक वास्तविक IDE की आवश्यकता है। मैंने पहले कभी AWT का उपयोग नहीं किया है, लेकिन अगर मेरे पास एक आईडीई होता तो मैं यह काम कर सकता था। मैं डॉक्स का उपयोग कर सकता हूं, लेकिन यह वास्तव में कठिन है

-10 बाइट्स का उपयोग कर केविन क्रूज़सेन
-44 बाइट्स के लिए एडिटज़र ब्लॉक का उपयोग करके AWT धन्यवाद ; रॉबर्टो ग्राहम के स्वतंत्र रूप से विकसित, हालांकि अब मैं देखता हूं कि उन्होंने भी यही काम किया है, मुझे लगता है कि
-6 बाइट्स केविन
-11 बाइट्स के लिए धन्यवाद के साथ कुछ घोषणाओं को जोड़ते हुए interfaceकेविन
-35 बाइट्स के लिए धन्यवाद का उपयोग करते हुए कुछ अनावश्यक चरों को नष्ट कर देता है mellamacb
-9 बाइट्स हटाने के लिए धन्यवाद अनावश्यक आयात और mellamokb
-44 बाइट्स mellamokb और aditsu के लिए धन्यवाद के लिए एक योग्य नाम का उपयोग कर


4

TI-Basic (TI-84 Plus CE), 49 बाइट्स (45 टोकन) (संभवतः गैर-प्रतिस्पर्धात्मक)

0→Xmin
0→Ymin
8³→Xmax
Ans→Ymax
While 1
Input 
{X,Y
Input 
Ans-{X,Y
Disp √(sum(Ans²
Pause
End

-7 बाइट्स kamoroso94 के सुझावों के साथ

उपयोगकर्ता प्रति क्लिक 'क्लिक' नहीं करता है, लेकिन एक तीर के साथ ग्राफ स्क्रीन पर कर्सर के चारों ओर घूमता है और enterएक बिंदु का चयन करने के लिए हिट करता है, और सबसे छोटा आंदोलन x के लिए ~ 1.5 और y के लिए ~ 2.4 है।

स्पष्टीकरण:

0→Xmin                # 5 bytes
0→Ymin                # 5 bytes
8³→Xmax               # 6 bytes, 
Ans→Ymax              # 5 bytes, Set up graph screen size (512x512)
While 1               # 3 bytes, Until interrupted with `on` button
Input                 # 2 bytes, Get user input as a point on the graph screen in X and Y
{X,Y                  # 5 bytes, store the list {X,Y} in Ans
Input                 # 2 bytes, Get second user input as a point on the graph screen in X and Y
Ans-{X,Y              # 7 bytes, store {X1-X2,Y1-Y2} in Ans
Disp √(sum(Ans²       # 6 bytes, Display the distance between the two points
Pause                 # 2 bytes, Let the user see it (press `enter` to continue)
End                   # 1 bytes, End while loop

1
चूंकि आकार केवल कम से कम 400 होना चाहिए, आप उस चीज़ को स्थिर कर सकते हैं जैसे कि 400 से अधिक लेकिन एक बाइट कम।
kamoroso94

1
इसके अलावा, आप Dispदो बाइट्स के साथ लाइन को कम कर सकते हैं {X-A,Y-B:Disp √(sum(Ans²(बृहदान्त्र या न्यूलाइन स्पष्ट रूप से काम करता है)।
kamoroso94

@ kamoroso94 मेरा TI-BASIC जंग खा गया है 8^2, लेकिन यह नहीं होगा , बाइट्स की समान संख्या?
टॉड सीवेल

@ToddSewell नहीं, 8^2(8 वर्ग) 64 है और 400 से कम है। मैंने कहा (8 घन) जो 400 से अधिक है और दो टोकन का उपयोग करता है, प्रत्येक बाइट: 8और ³
kamoroso94

1
@ToddSewell: निश्चित है कि (MATH → 3)।
निक

4

जावास्क्रिप्ट (ईएस 6) + एचटीएमएल, 58 बाइट्स

वेबपेज स्वयं प्रश्न में "कैनवास" के रूप में कार्य करता है; मुझे लगता है कि यह मान लेना काफी सुरक्षित है कि ब्राउज़र विंडो कम से कम 400x400 पिक्सेल की होगी।

E=0,onclick=e=>(E&&alert(Math.hypot(E.x-e.x,E.y-e.y)),E=e)


जावास्क्रिप्ट (ईएस 6) + एचटीएमएल, 51 बाइट्स

यदि हम NaNपहले क्लिक पर आउटपुट को अनदेखा करते हैं तो हम 7 बाइट्स बचा सकते हैं। ( @Ateate )

E=onclick=e=>alert(Math.hypot(E.x-e.x,E.y-e.y),E=e)


जावास्क्रिप्ट (ES6) + HTML + CSS, 58 + 0 + 13 = 71 बाइट्स

संपादित करें : CSS की एक अतिरिक्त 13 बाइट्स के साथ, हम यह सुनिश्चित कर सकते हैं कि स्क्रॉल क्षेत्र 400x400 आवश्यकता को पूरा करने के लिए पर्याप्त रूप से पर्याप्त होगा।

E=0,onclick=e=>(E&&alert(Math.hypot(E.x-e.x,E.y-e.y)),E=e)
*{padding:9in


2

प्रसंस्करण / जावा, 149 बाइट्स

void setup(){size(400,400);}void draw(){}int a,b;void mousePressed(){if(mouseButton==LEFT){a=mouseX;b=mouseY;}else println(dist(a,b,mouseX,mouseY));}

बहुत सरल, 2 वैश्विक चर और 3 अंतर्निहित कार्यों का उपयोग करता है सब कुछ करने के लिए।

  • सेटअप: बस 400x400 विंडो को इनिशियलाइज़ करता है
  • ड्रा: खाली, लेकिन प्रसंस्करण के लिए> 1 फ्रेम के लिए इंटरैक्टिव होना चाहिए
  • माउसप्रेस्ड: यदि बायाँ-क्लिक किया जाता है, तो माउस निर्देशांक को पूर्णांक a और b में सहेजें। यदि राइट क्लिक करें, तो बिंदु (ए, बी) से दूरी को वर्तमान स्थिति तक मापें, और कंसोल पर प्रिंट करें।

2

प्रसंस्करण। Com 126

float i,d,x,y;void setup(){fullScreen();}void draw(){}void mousePressed(){d=dist(x,y,x=mouseX,y=mouseY);print(i++%2<1?" ":d);}

1

अजगर 2, 144

अंतिम क्लिक के बीच प्रिंट की दूरी (पहले एक प्रिंट की दूरी 400,400 से)।

import Tkinter as t,math
r=t.Tk()
p=[400]*2
r.minsize(*p)
def f(e):print math.hypot(p[0]-e.x,p[1]-e.y);p[:]=e.x,e.y
r.bind('<1>',f)
r.mainloop()

0

ऑटोहोटेक, 146 बाइट्स

A=0
Gui,Add,Text,W400 H400 gC Border
Gui,Show
Return
C:
If A=0
MouseGetPos,A,B
Else{
MouseGetPos,C,D
Msgbox % Sqrt((A-C)**2+(B-D)**2)
A=0
}
Return

आपको लगता है कि विशेष रूप से कीबोर्ड और माउस कार्यों को कैप्चर और अनुकरण करने के लिए बनाई गई भाषा इस चुनौती पर अधिक कुशल होगी ...

यह एक पाठ बॉक्स के साथ एक खिड़की बनाता है 400 x 400 पिक्सल एक सीमा के साथ यह स्पष्ट करने के लिए। सीमा के बिना, किनारे के चारों ओर एक जगह है जो खिड़की में है लेकिन पाठ बॉक्स के बाहर है और आप नहीं बता सकते। एक सीमा जोड़ना उन्हें अलग करने का सबसे छोटा तरीका था। gCविकल्प यह सबरूटीन चलाने कर Cजब भी आप टेक्स्ट बॉक्स पर क्लिक करें। इसलिए, अनुक्रम अनुक्रम वामपंथी क्लिक के बाद एक अलग वामपंथी है।

मुझे एक और समाधान मिला जो 144 बाइट्स का है लेकिन यह केवल "स्पष्ट कैनवास" के बजाय स्क्रीन पर सभी क्लिकों की अनुमति देता है। यह समाप्त होने के लिए भी कष्टप्रद है क्योंकि बाएँ और दाएँ दोनों क्लिक कैप्चर किए गए हैं और जब आप GUI को बंद करते हैं तो यह समाप्त नहीं होता है।

Gui,Add,Text,W400 H400 Border
Gui,Show
Return
LButton::
MouseGetPos,A,B
Return
RButton::
MouseGetPos,C,D
Msgbox % Sqrt((A-C)**2+(B-D)**2)
Return

0

पायथन 2 ( टाइगरजाइटन ), 125 123 बाइट्स

from gturtle import*
n=0
def c(x,y):
 global n
 if n:print distance(x,y)
 else:setPos(x,y)
 n^=1
makeTurtle(mousePressed=c)

TigerJython एक डिफ़ॉल्ट आकार (800x, 600y) आकार के कैनवास के साथ आता है।

यह हर 'आरंभ' बिंदु पर क्लिक के लिए एक अस्थायी कछुए की छवि बनाता है, जो अगले 'आरंभ' बिंदु के चयन के बाद गायब हो जाता है। यह व्यवहार ओपी द्वारा अनुमोदित है।


0

स्माइलबासिक, 86 बाइट्स

@L
TOUCH OUT F,X,Y
S=S-X
T=T-Y
IF!O*F*M THEN?SQR(S*S+T*T)
S=X
T=Y
M=M!=!O*F
O=F
GOTO@L

इनपुट के लिए टच स्क्रीन का उपयोग करता है।


0

जावा 8, 228 बाइट्स

interface A{static void main(String[]a){new java.awt.Frame(){{setSize(400,400);}int i,j,t;public boolean mouseDown(java.awt.Event e,int x,int y){if(t++%2==1)System.out.println(Math.hypot(x-i,y-j));i=x;j=y;return 1>0;}}.show();}}

यहां एक जावा समाधान है जो एक पदावनत AWT पद्धति का उपयोग करता है mouseDownजिसे खोजने के लिए आपको एपीआई में गहरी खुदाई करनी होगी। मुझे केवल इस बारे में पता है कि प्रोग्रामिंग कोर्स के कारण मैंने एक हाई स्कूल के परिष्कार के रूप में लिया था, और परियोजनाओं में से एक उस और इसी तरह के तरीकों का उपयोग करके एक छोटा पेंट प्रोग्राम बनाना था। मैंने कभी नहीं सोचा था कि मेरे पास अब तक इसका उपयोग करने का एक अच्छा कारण होगा।


0

Tcl / Tk, 94 104

wm ge . 400x400
bind . <1> {if [info ex x] {puts [expr hypot(%x-$x,%y-$y)]}
set x %x
set y %y}

यहाँ छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.