Jarak terpendek antara dua titik adalah garis


27

Kode program atau fungsi untuk membuat kanvas interaktif di layar dengan ukuran setidaknya 400 piksel x 400 piksel. Kanvas dapat berupa warna apa pun yang Anda inginkan, berbatasan atau tanpa batas, dengan atau tanpa bilah judul, dll., Hanya beberapa bentuk kanvas yang jelas.

Pengguna akan mengklik dua area kanvas yang berbeda dan program harus menampilkan jarak Euclidean (dalam piksel) antara dua klik tersebut dengan cara tertentu (STDOUT, menampilkan peringatan, dll.). Dua klik hanya bisa berupa klik kiri, hanya klik kanan, klik kiri untuk klik pertama dan kanan untuk klik kedua, dua klik kiri ganda, dll., Kombinasi apa pun dapat diterima. Catatan Khusus: Mengklik-dan-menyeret (misalnya, menggunakan MOUSEUP sebagai titik kedua) secara khusus tidak diizinkan; mereka harus dua klik berbeda.

Pengguna harus dapat melakukan ini beberapa kali, dan harus mendapatkan output setiap kali, sampai program ditutup / dicabut-paksa / dibunuh / dll. Anda dapat memilih metode penutupan (mengklik X, ctrl-C, dll.), Apa pun yang golfier untuk kode Anda.

Aturan

  • Program lengkap atau fungsi dapat diterima. Namun, jika suatu fungsi, Anda tetap harus menampilkan output ke pengguna (hanya mengembalikan nilai tidak dapat diterima).
  • Output bisa ke konsol, ditampilkan sebagai peringatan, diisi ke kanvas, dll.
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.

Bisakah kita mengeluarkan hasil yang tepat (yang mungkin mengandung akar kuadrat) atau harus desimal?
Martin Ender

@MartinEnder Baik / atau. Pemformatan keluaran bukan bagian yang menarik dari tantangan ini.
AdmBorkBork

1
Solusi HTML / JS, dari klik kedua, menampilkan jarak dari klik itu ke klik sebelumnya. (jadi jika pengguna mengklik nkali, n-1alih-alih floor(n/2)angka dicetak) Apakah itu diizinkan?
user202729

@ user202729 Ini sedikit di luar dari apa yang saya bayangkan, tapi saya bisa melihat bagaimana itu sesuai dengan aturan yang saya tulis di atas, jadi saya akan mengizinkannya.
AdmBorkBork

1
Bisakah kita menggunakan ukuran kanvas yang lebih kecil jika bahasa kita tidak dapat mendukung kanvas 400 x 400?
Scott Milner

Jawaban:


8

LOGO ( FMSLogo ), 54 52 byte

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

Sayangnya, saya tidak dapat menemukan penerjemah logo dukungan penerjemah mouse online seperti FMSLogo.

Ini adalah "template slot eksplisit", yang mirip dengan lambda dalam bahasa pemrograman lain. Klik kiri mouse untuk titik pertama dan kanan mouse untuk titik kedua (jarak cetak).

Penjelasan: (Logo adalah bahasa pemrograman grafis penyu)

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

Ini "adalah kata kosong. Biasanya templat diharapkan menjadi daftar (di mana [], daftar kosong, tidak melakukan apa-apa), memberikan kata dapat diterima (dibungkus dalam daftar), dan dalam hal ini menyimpan 2 byte.

Menjalankan:

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

Ini applyadalah salah satu cara untuk menjalankan template di Logo, []daftar argumen is, di mana template tidak menerima.


Bagaimana ini menjamin kanvas minimum 400x400?
David Mulder

1
@DavidMulder FMSLogo secara default (tanpa baris perintah tambahan) mulai dengan kanvas 1000 × 1000.
user202729

7

Mathematica, 94 byte

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

Kanvas adalah gambar skala abu-abu acak, klik pertama harus berupa klik kiri dan yang kedua klik kanan. Perilaku sebenarnya adalah klik kanan yang mencetak jarak ke klik terakhir (kiri atau kanan), jadi jika Anda menggunakan klik kanan berulang kali, Anda juga bisa mendapatkan jarak yang berurutan.

Hasilnya tepat, sehingga mungkin berisi akar kuadrat.

Jika resolusi webcam Anda setidaknya 400x400, Anda bisa menggunakan CurrentImage[]alih-alih 1~RandomImage~400untuk kanvas Anda, menghemat 3 byte.


@Jenny_mathy Versi Mathematica mungkin? Saya menguji ini pada 11.1.
Martin Ender

6

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

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

Akan lebih pendek dengan AWT, tapi saya belum pernah menggunakannya.


Saya pikir truebisa saja 0<1.
Jonathan Frech

Juga, main(String args[])tidak mungkin main(String[]Z)?
Jonathan Frech

Saya pikir {F f=new F();}bisa {new F();}.
Jonathan Frech

setVisible(0<1);dapat dihapus, dan Anda dapat menambahkan .show()ke Frame; printlnbisa print.
Kevin Cruijssen

1
@KevinCruijssen Saya tidak tahu bagaimana OP menginginkan output untuk beberapa hasil
Roberto Graham

5

Java (OpenJDK 8) , 282 byte

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

Saya tidak dapat menguji ini sekarang; jika seseorang bisa memberi tahu saya jika ada kesalahan kompiler yang akan bagus.

AWT mungkin akan lebih pendek tetapi saya membutuhkan IDE sebenarnya untuk lol itu. Saya belum pernah menggunakan AWT sebelumnya tetapi saya bisa membuatnya bekerja jika saya memiliki IDE. Saya bisa menggunakan dokumen tetapi itu benar-benar sulit lol

-10 byte menggunakan AWT terima kasih kepada Kevin Cruijssen
-44 byte menggunakan blok inisialisasi; dikembangkan secara independen dari Roberto Graham meskipun sekarang saya melihat bahwa mereka melakukan hal yang sama, saya pikir
-6 byte menggabungkan beberapa deklarasi berkat Kevin
-11 byte menggunakan interfaceterima kasih kepada Kevin
-35 byte menghilangkan beberapa variabel yang tidak perlu berkat mellamokb
-9 byte menghapus impor yang tidak perlu dan menggunakan nama yang memenuhi syarat berkat mellamokb
-44 byte berkat mellamokb dan aditsu


4

TI-Basic (TI-84 Plus CE), 49 byte (45 token) (mungkin tidak bersaing)

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

-7 byte dengan saran dari kamoroso94

Pengguna tidak 'mengklik' per se, tetapi bergerak di sekitar kursor pada layar grafik dengan tombol panah dan klik enteruntuk memilih titik, dan gerakan terkecil adalah ~ 1,5 untuk x dan ~ 2,4 untuk y.

Penjelasan:

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
Karena ukurannya paling tidak hanya 400, Anda bisa bermain golf yang konstan ke sesuatu seperti yang lebih besar dari 400 tetapi kurang satu byte.
kamoroso94

1
Anda juga dapat mengurangi Dispgaris dengan dua byte dengan {X-A,Y-B:Disp √(sum(Ans²(titik dua atau baris jelas bekerja).
kamoroso94

@ kamoroso94 TI-BASIC saya berkarat tetapi bukankah itu 8^2, jumlah byte yang sama?
Todd Sewell

@ToddSewell no, 8^2(8 kuadrat) adalah 64 dan kurang dari 400. Saya katakan (8 potong dadu) yang lebih besar dari 400 dan menggunakan dua token, masing-masing satu byte: 8dan ³.
kamoroso94

1
@ToddSewell: Pasti (MATI → 3).
Nick Matteo

4

JavaScript (ES6) + HTML, 58 byte

Halaman web itu sendiri berfungsi sebagai "kanvas" yang dimaksud; Saya pikir cukup aman untuk mengasumsikan jendela browser setidaknya 400x400 piksel.

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


JavaScript (ES6) + HTML, 51 byte

Kita dapat menyimpan 7 byte jika kita mengabaikan NaNoutput pada klik pertama. ( @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 byte

Sunting : Dengan tambahan 13 byte CSS, kami dapat memastikan area gulir akan cukup besar untuk memenuhi persyaratan 400x400.

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


2

Memproses / Java, 149 byte

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

Cukup mudah, menggunakan 2 variabel global dan 3 fungsi bawaan untuk melakukan semuanya.

  • Setup: hanya menginisialisasi jendela ke 400x400
  • Gambar: kosong, tetapi harus ada untuk Memproses menjadi interaktif untuk> 1 bingkai
  • MousePressed: jika klik kiri, simpan koordinat mouse ke dalam bilangan bulat a dan b. Jika klik kanan, ukur jarak dari titik (a, b) ke posisi saat ini, dan cetak ke konsol.

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

Mencetak jarak antara klik terakhir (yang pertama mencetak jarak dari 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

Autohotkey, 146 byte

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

Anda akan berpikir bahasa yang dibangun khusus untuk menangkap dan mensimulasikan tindakan keyboard dan mouse akan lebih efisien pada tantangan ini ...

Ini menciptakan jendela dengan kotak teks 400 x 400 piksel dengan batas untuk membuatnya jelas. Tanpa perbatasan, ada ruang di sekitar tepi yang ada di jendela tetapi di luar kotak teks dan Anda tidak bisa mengatakannya. Menambahkan perbatasan adalah cara terpendek untuk membedakannya. The gCpilihan membuatnya berjalan subroutine Csetiap kali Anda klik pada kotak teks. Urutan perintah adalah, oleh karena itu, Klik Kiri diikuti oleh Klik Kiri berbeda.

Saya menemukan solusi lain yang 144 byte tetapi memungkinkan klik di seluruh layar, bukan hanya di "kanvas jelas". Menjengkelkan untuk mengakhiri karena baik klik kiri maupun kanan ditangkap dan tidak berakhir saat Anda menutup 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

Python 2 ( TigerJython ), 125 123 byte

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 hadir dengan kanvas ukuran standar (800x, 600y).

Ini memunculkan gambar kura-kura sementara untuk setiap titik 'mulai' yang diklik, yang menghilang setelah titik 'mulai' berikutnya dipilih. Perilaku ini disetujui oleh OP.


0

SmileBASIC, 86 byte

@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

Menggunakan layar sentuh untuk input.


0

Java 8, 228 byte

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

Berikut adalah solusi Java yang menggunakan metode AWT yang sudah usang mouseDownyang harus Anda gali lebih dalam ke API untuk menemukannya. Saya hanya mengetahuinya karena kursus pemrograman yang saya ambil sebagai mahasiswa sekolah menengah atas, dan salah satu proyeknya adalah membuat program cat kecil menggunakan metode itu dan yang serupa. Saya tidak pernah berpikir saya punya alasan yang bagus untuk menggunakannya sampai sekarang.


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}

masukkan deskripsi gambar di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.