Найкоротша відстань між двома точками - це лінія


27

Зашифруйте програму чи функцію для побудови інтерактивного полотна на екрані розміром не менше 400 пікселів х 400 пікселів. Полотно може бути будь-якого кольору, яке ви бажаєте, облямоване або без полів, із заголовком або без нього тощо. Просто якась форма очевидного полотна.

Користувач буде натискати на дві окремі області полотна, і програма повинна виводити евклідову відстань (у пікселях) між цими двома клацаннями (STDOUT, показ попередження тощо). Два клацання можуть бути лише лівими клацаннями, лише клацанням правою кнопкою миші, лівим клацанням для першого та правим клацанням для другого, двома клавішами подвійного лівого клацання тощо, будь-яка комбінація є прийнятною. Спеціальна примітка: Клацання та перетягування (наприклад, використання MOUSEUP як другої точки) спеціально не дозволено; вони повинні бути двома різними клацаннями.

Користувач повинен це вміти робити кілька разів і повинен отримувати вихід кожного разу, поки програма не буде закрита / примусово закрити / вбити / тощо. Ви можете вибрати спосіб закриття (натискання на X, ctrl-C тощо), незалежно від того, що є гравцем для вашого коду.

Правила

  • Прийнятна або повна програма, або функція. Якщо функція, однак, ви все одно повинні якось відображати вихід користувачеві (просто повернення значення не прийнятне).
  • Вихід може бути на консолі, відображатися як попередження, заповнюватися на полотні тощо.
  • Стандартні лазівки заборонені.
  • Це тому діють усі звичайні правила гольфу, і найкоротший код (у байтах) виграє.

Чи можемо ми вивести точні результати (які можуть містити квадратні корені) чи це повинні бути десяткові числа?
Мартін Ендер

@MartinEnder або / або. Форматування вихідних даних не є цікавою частиною цього завдання.
AdmBorkBork

1
Рішення HTML / JS після другого клацання видає відстань від цього клацання до попереднього клацання. (тож якщо користувач натискає nраз, n-1замість floor(n/2)цифр друкується) Це дозволено?
користувач202729

@ user202729 Це трохи поза тим, що я передбачав, але я бачу, як воно відповідає правилам, про які я писав вище, тому дозволю це.
AdmBorkBork

1
Чи можемо ми використовувати менший розмір полотна, якщо наша мова не може підтримувати полотно розміром 400 x 400?
Скотт Мілнер

Відповіді:


8

LOGO ( 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Один спосіб запустити шаблон в логотипі, то []є список аргументів, для яких шаблон не отримує нічого.


Як це гарантує мінімальне полотно 400х400?
Девід Малдер

1
@DavidMulder FMSLogo за замовчуванням (без додаткового командного рядка) починайте з полотна 1000 × 1000.
користувач202729

7

Математика, 94 байти

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

Полотно - це випадкове зображення сірого масштабу, перший клацання повинен бути клацанням лівою кнопкою миші, а другий клацанням правою кнопкою миші. Точна поведінка насправді полягає в тому, що клацання правою кнопкою миші друкує відстань до останнього клацання (ліворуч або праворуч), тож якщо ви кілька разів користуєтеся правою кнопкою миші, ви також можете отримувати відстані послідовно.

Результати точні, тому вони можуть містити квадратний корінь.

Якщо роздільна здатність веб-камери становить принаймні 400x400, ви можете використовувати CurrentImage[]замість 1~RandomImage~400свого полотна, зберігаючи 3 байти.


@Jenny_mathy Математична версія, можливо? Я перевірив це 11.1.
Мартін Ендер

6

Java 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.
Kevin Cruijssen

1
@KevinCruijssen Я не знаю, як ОП хоче отримати результат для декількох результатів
Роберто Грем

5

Java (OpenJDK 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, ймовірно, буде коротшим, але мені потрібна справжня IDE для цього lol. Я ніколи раніше не використовував AWT, але я міг би змусити його працювати, якби у мене був IDE. Я міг би використовувати документи, але це дуже важко хаха

-10 байт з використанням AWT завдяки Кевіну Крейсейну
-44 байти з використанням ініціалізаційного блоку; розроблений незалежно від Роберто Грема, хоча зараз я бачу, що вони зробили те саме, я думаю, що
-6 байт поєднує в собі кілька декларацій завдяки Кевіну
-11 байтів, використовуючи interfaceзавдяки
байту Кевіна -35, усуваючи деякі непотрібні змінні завдяки
видаленню байтів mellamokb -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щоб вибрати точку, а найменший рух становить ~ 1,5 для х та ~ 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

JavaScript (ES6) + HTML, 58 байт

Сама веб-сторінка виступає як «полотно», про яке йдеться; Я думаю, що цілком безпечно припустити, що вікно браузера буде не менше 400x400 пікселів.

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


JavaScript (ES6) + HTML, 51 байт

Ми можемо зберегти 7 байт, якщо проігнорувати NaNвихід у перший клік. ( @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 байт

Редагувати : Завдяки додатковим 13 байтам CSS ми можемо гарантувати, що область прокрутки буде достатньо великою, щоб відповідати вимогам 400x400.

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


2

Обробка / Java, 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. Якщо клацнути правою кнопкою миші, виміряйте відстань від точки (a, b) до поточного положення та надрукуйте на консолі.

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

Пітон 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,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 ( TigerJython ), 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

SmileBASIC, 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

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

Ось Java-рішення, яке використовує застарілий метод AWT, mouseDownякий вам доведеться заглибитись в API, щоб знайти. Я знаю про це лише через програмування, яке я взяв за навчання другокласником, і один із проектів полягав у тому, щоб зробити невелику програму фарб, використовуючи той і подібні методи. Я ніколи не думав, що буду мати вагомі причини використовувати його до цих пір.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.