İki nokta arasındaki en kısa mesafe bir çizgidir.


27

Ekranda en az 400 piksel x 400 piksel boyutunda etkileşimli bir tuval oluşturmak için bir program veya işlev kodlayın. Tuval, istediğiniz bir renk olabilir, kenarlıksız veya kenarlıksız, başlık çubuklu veya başlıksız vb.

Kullanıcı, kanvasın iki farklı alanını tıklar ve program, bu iki tıklama arasındaki Öklid mesafesini (piksel cinsinden) bir şekilde (STDOUT, bir uyarı göstererek vb.) Çıkarmalıdır. İki tıklama yalnızca sol tıklamalar, sadece sağ tıklamalar, ikincisi için ilk ve sağ tıklamalar, iki çift sol tıklamalar vb. Olabilir, herhangi bir kombinasyon kabul edilebilir. Özel Not: Tıklatma ve sürükleme (örneğin, MOUSEUP'ı ikinci nokta olarak kullanmak) özel olarak yasaktır; iki farklı tıklama olması gerekir.

Kullanıcı bunu birden çok kez yapabilmeli ve program kapanana / zorla çıkma / öldürme / etc olana kadar her defasında bir çıktı almalıdır. Kodunuz için ne olursa olsun, kapatma yöntemini (bir X, ctrl-C, vb. Tıklayarak) seçebilirsiniz.

kurallar

  • Tam bir program veya bir işlev kabul edilebilir. Bununla birlikte, eğer bir işlev, yine de kullanıcıya çıktıyı görüntülemeye devam etmelisiniz (sadece değeri döndürmek kabul edilemez).
  • Çıktı konsola olabilir, bir uyarı olarak gösterilir, tuval üzerine yerleştirilir, vb.
  • Standart boşluklar yasaktır.
  • Bu olduğundan, tüm normal golf kuralları geçerlidir ve en kısa kod (bayt cinsinden) kazanır.

Kesin sonuçlar çıkarabilir miyiz (karekök içerebilir) ya da ondalık mı olmak zorunda?
Martin Ender

@MartinEnder Ya / ya. Çıktı biçimlendirme bu zorluğun ilginç bir parçası değil.
AdmBorkBork

1
HTML / JS çözümü, ikinci tıklamayla, o tıklamayla önceki tıklamaya olan mesafeyi verir. (böylece kullanıcı tıklarsanız n, kat n-1yerine floor(n/2)Buna izin var mı sayılar yazdırılır)?
user202729 15 Kasım’da

@ user202729 Bu benim düşündüğümün biraz dışında, ama yukarıda yazdığım kurallara nasıl uyduğunu görebiliyorum, bu yüzden izin vereceğim.
AdmBorkBork

1
Dilimiz 400 x 400 tuvali destekleyemezse, daha küçük bir tuval boyutu kullanabilir miyiz?
Scott Milner

Yanıtlar:


8

LOGO ( FMSLogo ), 54 52 bayt

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

Ne yazık ki, FMSLogo gibi herhangi bir Logo tercümanı çevrimiçi destek faresinin kullanımını bulamıyorum.

Bu, diğer programlama dillerinde lambda'ya benzeyen bir "açık yuva şablonu" dür. Birinci nokta için sol fare ve ikinci nokta için sağ fare (baskı mesafesi) üzerine tıklayın.

Açıklama: (Logo bir kaplumbağa grafik programlama dilidir)

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

Bu "boş bir kelimedir. Normalde şablonun bir liste olması beklenir (burada []boş bir liste hiçbir şey yapmaz), bir sözcüğü iletmek kabul edilebilir (bir listeye sarılır) ve bu durumda 2 bayt kazandırır.

Koşmak:

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

applyLogo şablonu çalıştırmak için tek yoldur, []şablon hiçbiri aldığınız argüman listesidir.


Bu minimum 400x400 tuvali nasıl garanti eder?
David Mulder

1
@DavidMulder FMSLogo varsayılan olarak (ek komut satırı olmadan) tuval 1000 × 1000 ile başlar.
user202729

7

Mathematica, 94 bayt

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

Tuval rastgele gri tonlamalı bir görüntüdür, ilk tıklama sol tıklama, ikincisi sağ tıklama olmalıdır. Kesin davranış aslında sağ tıklamanın son tıklanmaya olan mesafeyi (sol veya sağ) yazdırmasıdır; bu nedenle, art arda sağ tıklamayı kullanırsanız, ardışık mesafeler de alabilirsiniz.

Sonuçlar kesindir, bu yüzden kare bir kök içerebilirler.

Web kameranızın çözünürlüğü en az 400x400 ise, tuvalinizi CurrentImage[]yerine 1~RandomImage~4003 bayttan tasarruf ederek kullanabilirsiniz .


@ Jenny_mathy Mathematica sürümü belki? Bunu 11.1'de test ettim.
Martin Ender

6

Java 8, 469 389 388 385 380 357 348 325 bayt

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 ile daha kısa olurdu, ama hiç kullanmadım.


Bence trueolabilir 0<1.
Jonathan Frech

Ayrıca, olabilir main(String args[])olmayabilir main(String[]Z)?
Jonathan Frech

Bence {F f=new F();}olabilir {new F();}.
Jonathan Frech

setVisible(0<1);kaldırılabilir ve .show()Çerçeveye ekleyebilirsiniz ; printlnolabilir print.
Kevin Cruijssen

1
@KevinCruijssen OP'un birden fazla sonuç için çıktıyı nasıl istediğini bilmiyorum
Roberto Graham

5

Java (OpenJDK 8) , 282 bayt

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();}};}}

Bunu şu anda test edemiyorum; Birisi bana derleyici hataları olup olmadığını söyleyebilirdi eğer büyük olurdu.

AWT muhtemelen daha kısa olurdu ama bu lol için gerçek bir IDE'ye ihtiyacım var. Daha önce hiç AWT kullanmadım, ancak bir IDE olsaydı çalışmasını sağlayabilirdim. Belgeleri kullanabilirdim ama bu gerçekten zor lol

Kevin Cruijssen sayesinde AWT kullanarak -10 bayt
Bir başlatıcı bloğu kullanarak -44 bayt; Şimdi aynı şeyi yaptı görüyoruz olsa bağımsız Roberto Graham gelişmiş, bence
-6 bayt Kevin birkaç bildirimler sayesinde birleştirerek
-11 bir kullanarak bayt interfaceKevin sayesinde
-35 bazı gereksiz değişkenler mellamokb sayesinde ortadan kaldırarak bayt
-9 bayt çıkarmadan Gereksiz ithalat ve mellamokb
-44 bayt sayesinde kaliteli bir isim kullanma mellamokb ve aditsu sayesinde


4

TI-Basic (TI-84 Plus CE), 49 bayt (45 belirteç) (muhtemelen rekabet etmeyen)

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

-7 kambeso94 gelen önerileri ile bayt

Kullanıcı kendi başına “tıklamaz”, ancak ok tuşları ile bir imleç etrafında hareket eder ve enterbir nokta seçmek için vurur ve en küçük hareket x için ~ 1.5 ve y için ~ 2.4'tür.

Açıklama:

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
Boyutun yalnızca en az 400 olması gerektiğinden, bu sabit değeri 400'den büyük ancak bir bayttan daha düşük olan bir şeye sabitleyebilirsiniz.
kamoroso94

1
Ayrıca Dispçizgiyi iki bayt ile azaltabilirsiniz {X-A,Y-B:Disp √(sum(Ans²(iki nokta üst üste veya yeni satır açık bir şekilde çalışır).
kamoroso94

@ kamoroso94 TI-BASIC paslı, ancak 8^2aynı sayıda bayt olmaz mı?
Todd Sewell

@ToddSewell no, 8^2(8 kare) 64 ve 400'den küçüktür. 400'den büyük olan ve her biri bir bayt olmak üzere iki jeton kullanan (8 küp) dedim : 8ve ³.
kamoroso94

1
@ToddSewell: Kesinlikle var (MATH → 3).
Nick Matteo,

4

JavaScript (ES6) + HTML, 58 bayt

Web sayfasının kendisi söz konusu "tuval" olarak hizmet ediyor; Tarayıcı penceresinin en az 400x400 piksel olacağını varsaymanın oldukça güvenli olduğunu düşünüyorum.

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


JavaScript (ES6) + HTML, 51 bayt

NaNİlk tıklamadaki çıktıyı göz ardı edersek 7 bayt kaydedebiliriz . ( @Nate )

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


JavaScript (ES6) + HTML + CSS, 58 + 0 + 13 = 71 bayt

Düzenleme : Ek 13 bayt CSS ile kaydırma alanının 400x400 gereksinimine uyacak kadar büyük olmasını sağlayabiliriz.

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


2

İşlem / Java, 149 bayt

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));}

Oldukça basit, her şeyi yapmak için 2 global değişken ve 3 dahili fonksiyon kullanır.

  • Kurulum: sadece pencereyi 400x400 e başlatır
  • Çizim: boş, ancak İşleme için> 1 kare için etkileşimli olması gerekir
  • MousePressed: sol tıklarsanız, fare koordinatlarını a ve b tam sayılarına kaydedin. Sağ tıklarsanız, (a, b) noktasından o anki konuma kadar olan mesafeyi ölçün ve konsola yazdırın.

2

Processing.org 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

Python 2, 144

Son tıklamalar arasındaki mesafeyi yazdırır (ilki 400,400'den mesafeyi yazdırır).

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

Otomatik tuş, 146 bayt

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

Klavye ve fare eylemlerini yakalamak ve simüle etmek için özel olarak oluşturulmuş bir dilin bu zorlukla daha etkili olacağını düşünürdünüz ...

Bu, açık yapmak için kenarlıklı 400 x 400 piksel metin kutulu bir pencere oluşturur. Kenarlık olmadan, kenarda pencerede olan ancak metin kutusunun dışında bir boşluk var ve bunu söyleyemezsiniz. Bir sınır eklemek onları ayırt etmenin en kısa yoluydu. gCSeçenek alt yordamı çalıştırmak yapmak Cmetin kutusuna tıkladığında. Bu nedenle komut dizisi Sol Tıklama ve ardından farklı bir Sol Tıklamadır.

144 byte'lık başka bir çözüm buldum, ancak sadece "bariz tuval" yerine ekranın her yerine tıklamaya izin veriyor. Ayrıca, hem sol hem de sağ tıklamalar yakalandığından ve GUI'yi kapattığınızda sona ermeyeceğinden, sonlanması can sıkıcıdır.

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

Python 2 ( TigerJython ), 125 123 bayt

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, varsayılan boyutta (800x, 600y) boyutunda tuval ile birlikte gelir.

Bu, bir sonraki 'başlangıç' noktası seçildikten sonra kaybolan her 'başlangıç' noktası için geçici bir kaplumbağa resmi ortaya çıkarır. Bu davranış OP tarafından onaylanmıştır.


0

SmileBASIC, 86 bayt

@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

Giriş için dokunmatik ekran kullanır.


0

Java 8, 228 bayt

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();}}

İşte mouseDownbulmak için API'ye derinlemesine girmeniz gereken kullanımdan kaldırılmış bir AWT yöntemi kullanan bir Java çözümü . Bunu sadece bir lise ikinci sınıf öğrencisi olarak aldığım programlama dersi nedeniyle biliyorum ve projelerden biri de bu ve benzeri yöntemleri kullanarak küçük bir boya programı yapmaktı. Şimdiye kadar kullanmak için iyi bir nedenim olacağını asla düşünmedim.


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}

görüntü tanımını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.