Круги перекрываются?


21

Учитывая координаты центров и радиусы 2 окружностей, выведите истинное значение того, перекрывают они или нет.

вход

  • Входные данные могут быть получены через STDIN или эквивалентные аргументы функции, но не как переменная. Вы можете использовать их как одну переменную (список, строку и т. Д.) Или как несколько входов / аргументов в любом порядке.

  • На входе будет шесть поплавков. Эти числа будут до 3 знаков после запятой. Координаты могут быть положительными или отрицательными. Радиусы будут положительными.

Выход

  • Выход может быть через STDOUT или возврат функции.

  • Программа должна иметь ровно 2 разных выхода - один для значения True (кружки перекрываются) и один для False (они не перекрываются).

Контрольные примеры

(Входные данные представлены в виде списка кортежей [(x1, y1, r1), (x2, y2, r2)]для тестовых случаев; вы можете использовать входные данные в любом формате)

Правда

[(5.86, 3.92, 1.670), (11.8, 2.98, 4.571)]
[(8.26, -2.72, 2.488), (4.59, -2.97, 1.345)]
[(9.32, -7.77, 2.8), (6.21, -8.51, 0.4)]

Ложь

[(4.59, -2.97, 1.345), (11.8, 2.98, 4.571)]
[(9.32, -7.77, 2.8), (4.59, -2.97, 1.345)]
[(5.86, 3.92, 1.670), (6.21, -8.51, 0.4)]

Это Code Golf, самый короткий ответ в байтах выигрывает.


4
Что нам нужно вернуть, если два круга соприкасаются снаружи?
JungHwan Мин

6
Технический термин для «касания, но не наложения» является «касательным», и это вещь в геометрии, если нигде больше.
dmckee

2
Взятие поплавков кажется довольно строгим требованием. Не могли бы вы смягчить это до более общего представления? Я хотел бы решить эту проблему в Brain-Flak, но я вряд ли найду время для реализации операций с плавающей запятой IEEE, и если бы я это сделал, в любом случае это было бы на 90% от числа байтов, так что я бы просто играл в игру с плавающей запятой.
Пшеничный волшебник

4
Я также хотел бы отметить, что во многих случаях значения с плавающей точкой не являются точными с точностью до «трех знаков после запятой». Я не уверен, какие именно ответы вы хотите получить, но сейчас это немного сбивает с толку.
Пшеничный волшебник

2
Я думаю, у вас может быть фундаментальное недопонимание того, как работают поплавки. Поскольку они имеют фиксированный размер, при увеличении значений точность снижается. Существует точка, за которой число с плавающей точкой не может точно представлять все значения в пределах 3 десятичных знаков. Кроме того, редактирование задачи для удаления ненужных ограничений не рекомендуется.
Mego

Ответы:


18

Желе , 5 байт

IA<S}

Принимает два комплексных числа (центры) в качестве первого аргумента и два действительных числа (радиуса) в качестве второго аргумента.

Попробуйте онлайн!

Как это устроено

IA<S}  Main link.
       Left argument:  [x1 + iy1, x2 + iy2]
       Right argument: [r1, r2]

I      Increments; yield (x2 - x1) + i(y2 - y1).
 A     Absolute value; yield √((x2 - x1)² + (y2 - y1)²).
   S}  Take the sum of the right argument, yielding r1 + r2.
  <    Compare the results.

Блин, я забыл об использовании комплексных чисел для координат. Хороший! : D
HyperNeutrino

Из интереса можно Aли считать результат здесь нормой вектора "центров" строки? ( ÆḊсамо по себе ошибки со сложным содержанием.)
Джонатан Аллан

1
@JonathanAllan Да, Aвычисляет расстояния между центрами как норму их разностного вектора.
Деннис

11

JavaScript (ES6), 38 байт

Вводит в виде 6 различных переменных x1 , y1 , r1 , x2 , y2 , r2 .

(x,y,r,X,Y,R)=>Math.hypot(x-X,y-Y)<r+R

Контрольные примеры


Для тех, кто раньше не казался Math.hypot .
Pureferret


@ V.Courtois Способ передачи параметров не соответствует объявлению метода. Так и должно быть a:Double,x:Double,b:Double,y:Double,r:Double,q:Double.
Арно

1
@ Arnauld ооо ~ спасибо! Должен ли я разместить его отдельно?
В. Куртуа

@ В.Куртуа: Конечно. Действуй!
Арно


7

MATL , 5 байтов

ZPis<

Формат ввода:

[x1, y1]
[x2, y2]
[r1, r2]

Попробуйте онлайн! Или проверьте все тестовые случаи .

Как это устроено

ZP   % Take two vectors as input. Push their Euclidean distance
i    % Input the vector of radii
s    % Sum of vector
<    % Less than?

Не уверен, что это я, но когда я использую пробную ссылку и нажимаю run, я получаю «Ошибка. Не удалось расшифровать ответ сервера» - также Не уверен, что это помогает, но вы думали о (ab), используя комплексные числа, такие как в желе ответ?
Деннис Джаэруддин

@DennisJaheruddin Эй, рад снова видеть тебя здесь! (1) Кэширование вины, вероятно. Вы пытались освежить? (2) Я сделал, но я думаю, что это также 5байты ( -|вместо ZP)
Луис Мендо

Я полагаю, это брандмауэр. Теперь мне интересно, есть ли формат ввода с чем-то вроде-r2r2 поможет вместо , потому что тогда вам понадобятся три различия, а не 2 различия и дополнение ... Я бы лучше побежал, пока я не погрузился слишком глубоко!
Деннис Джаэруддин

Я не думаю, что отрицание одного ввода приемлемо в качестве формата ввода. Если вы обнаружите какие-либо проблемы со службой Try It Online, сообщите, пожалуйста, здесь ?
Луис Мендо

6

R , 39 байт

function(k,r)dist(matrix(k,2,2))<sum(r)

принимает вход k=c(x1,x2,y1,y2)и r=c(r1,r2); возвращаетсяFALSE для касательных окружностей.

Попробуйте онлайн!

27 байт:

function(m,r)dist(m)<sum(r)

Принимает данные в виде матрицы с центрами окружностей, заданными в виде строк и вектора радиусов.

Попробуйте онлайн!


-2 байтаfunction(k,r)dist(matrix(k,2))<sum(r)
djhurio

Как насчет dist(matrix(scan(),2))<sum(scan())?
Джурио

6

питон , 40 байт

lambda x,y,r,X,Y,R:abs(x-X+(y-Y)*1j)<r+R

Попробуйте онлайн!

Использует сложную арифметику Python для вычисления расстояния между двумя центрами. Я предполагаю, что мы не можем принимать входные точки непосредственно как комплексные числа, поэтому код выражает их как x+y*1j.





4

APL (Дьялог) , 10 байт

Запрашивает для центров круга как список двух комплексных чисел, затем для радиусов как список двух чисел

(+/⎕)>|-/

Попробуйте онлайн!

(+/⎕) [является] сумма радиусов

> больше чем

| величина

-/⎕ разница в центрах


3

Mathematica, 16 байтов

Norm[#-#2]<+##3&

Входные данные: [{x1, y1}, {x2, y2}, r1, r2]


Mathematica имеет RegionIntersectionвстроенную функцию , но только она имеет длину 18 байт ...

Встроенная версия:

RegionIntersection@##==EmptyRegion@2&

Занимает 2 Diskобъекта. [Disk[{x1, y1}, r1], Disk[{x2, y2}, r2]],



3

Желе , 12 байт

I²+⁴I²¤<⁵S²¤

Попробуйте онлайн!

-2 байта благодаря Денису


Не создаст ли новую ссылку с ạ/²теми же байтами?
Caird Coneheringaahing

@cairdcoinheringaahing?
HyperNeutrino

Не берите в голову, я получил 14 байтов, делая это
caird coinheringaahing

Вы можете использовать Iвместо уменьшения на абсолютную разницу.
Деннис

@ Денис Ооо спасибо
HyperNeutrino


3

Java 8, 41 38 байт

(x,y,r,X,Y,R)->Math.hypot(x-X,y-Y)<r+R

Попробуй это здесь.

По-видимому, Java также имеет Math.hypot, что на 3 байта короче.

РЕДАКТИРОВАТЬ: только что понял, что этот ответ теперь точно так же, как ответ @ 8 OlivierGrégoire Java , поэтому, пожалуйста, поставьте его вместо меня, если вам нравится 38-байтовый ответ.

Старый ответ (41 байт) :

(x,y,r,X,Y,R)->(x-=X)*x+(y-=Y)*y<(r+=R)*r

Попробуй это здесь.


1
Ой! Так вот почему я получил 3 отзыва сегодня, но 0, когда задание было опубликовано? ^^ Мне было интересно, что вызвало это странное поведение;) Так как мне нравится мой ответ, и вы отправили то же самое, вы также получаете +1! : p
Оливье Грегуар


2

Perl 6 , 13 байт

*+*>(*-*).abs

Попробуйте онлайн!

Первые два аргумента - это радиусы в любом порядке. Третий и четвертый аргументы - это координаты центров в виде комплексных чисел в любом порядке.


2

Такси , 1582 байта

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to The Babelfishery.Pickup a passenger going to Tom's Trims.Pickup a passenger going to Tom's Trims.Go to Tom's Trims:n.[a]Go to Post Office:s.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to What's The Difference.Pickup a passenger going to What's The Difference.Go to What's The Difference:n 5 l.Pickup a passenger going to Cyclone.Go to Cyclone:e 1 r.Pickup a passenger going to Multiplication Station.Pickup a passenger going to Multiplication Station.Go to Multiplication Station:s 1 l 2 r 4 l.Pickup a passenger going to Addition Alley.Go to Tom's Trims:s 1 r 3 r.Pickup a passenger going to The Babelfishery.Switch to plan "b" if no one is waiting.Switch to plan "a".[b]Go to Addition Alley:n 1 r 1 l 3 l 1 l.Pickup a passenger going to Magic Eight.Go to Post Office:n 1 r 1 r 3 r 1 l.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:s 1 l 1 r.Pickup a passenger going to Addition Alley.Pickup a passenger going to Addition Alley.Go to Addition Alley:n 5 l 1 l.Pickup a passenger going to Cyclone.Go to Cyclone:n 1 l 1 l.Pickup a passenger going to Multiplication Station.Pickup a passenger going to Multiplication Station.Go to Multiplication Station:s 1 l 2 r 4 l.Pickup a passenger going to Magic Eight.Go to Magic Eight:s 1 r.Switch to plan "c" if no one is waiting.'1' is waiting at Writer's Depot.[c]'0' is waiting at Writer's Depot.Go to Writer's Depot:w 1 l 2 l.Pickup a passenger going to Post Office.Go to Post Office:n 1 r 2 r 1 l.

Попробуйте онлайн!

Выходы 1для перекрывающихся кругов.
Выходы0 для непересекающихся кругов (включая тангенциальные круги).

Разгруженный / отформатированный:

Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to The Babelfishery.
Pickup a passenger going to Tom's Trims.
Pickup a passenger going to Tom's Trims.
Go to Tom's Trims: north.
[a]
Go to Post Office: south.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 1st right.
Pickup a passenger going to What's The Difference.
Pickup a passenger going to What's The Difference.
Go to What's The Difference: north 5th left.
Pickup a passenger going to Cyclone.
Go to Cyclone: east 1st right.
Pickup a passenger going to Multiplication Station.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station: south 1st left 2nd right 4th left.
Pickup a passenger going to Addition Alley.
Go to Tom's Trims: south 1st right 3rd right.
Pickup a passenger going to The Babelfishery.
Switch to plan "b" if no one is waiting.
Switch to plan "a".
[b]
Go to Addition Alley: north 1st right 1st left 3rd left 1st left.
Pickup a passenger going to Magic Eight.
Go to Post Office: north 1st right 1st right 3rd right 1st left.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: south 1st left 1st right.
Pickup a passenger going to Addition Alley.
Pickup a passenger going to Addition Alley.
Go to Addition Alley: north 5th left 1st left.
Pickup a passenger going to Cyclone.
Go to Cyclone: north 1st left 1st left.
Pickup a passenger going to Multiplication Station.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station: south 1st left 2nd right 4th left.
Pickup a passenger going to Magic Eight.
Go to Magic Eight: south 1st right.
Switch to plan "c" if no one is waiting.
'1' is waiting at Writer's Depot.
[c]
'0' is waiting at Writer's Depot.
Go to Writer's Depot: west 1st left 2nd left.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st right 2nd right 1st left.

2

C #, 50 41 байт

(x,y,r,X,Y,R)=>(x-=X)*x+(y-=Y)*y<(r+=R)*r

Сохранено 9 байтов благодаря @KevinCruijssen.


Не могли бы вы сохранить несколько байтов, написав (r+R)*2вместо (r+R)+(r+R)?
Ян Х.

@IanH. Да, не знаю, как я это пропустил.
TheLethalCoder

Я что-то упустил или это не работает ?
Ян Х.

@IanH. Я сделал опечатку, +на RHS должен был быть *.
TheLethalCoder

И мои отзывы даже усугубили это. Хорошая работа по решению, хотя!
Ян Х.


1

PostgreSQL, 41 символ

prepare f(circle,circle)as select $1&&$2;

Подготовленный оператор, принимает входные данные в виде 2 параметров в любой circleзаписи .

Образец прогона:

Tuples only is on.
Output format is unaligned.
psql (9.6.3, server 9.4.8)
Type "help" for help.

psql=# prepare f(circle,circle)as select $1&&$2;
PREPARE

psql=# execute f('5.86, 3.92, 1.670', '11.8, 2.98, 4.571');
t

psql=# execute f('8.26, -2.72, 2.488', '4.59, -2.97, 1.345');
t

psql=# execute f('9.32, -7.77, 2.8', '6.21, -8.51, 0.4');
t

psql=# execute f('4.59, -2.97, 1.345', '11.8, 2.98, 4.571');
f

psql=# execute f('9.32, -7.77, 2.8', '4.59, -2.97, 1.345');
f

psql=# execute f('5.86, 3.92, 1.670', '6.21, -8.51, 0.4');
f

1

Java, 50 38 байт

(x,y,r,X,Y,R)->Math.hypot(x-X,y-Y)<r+R

Используя идеи в другие ответы, это может быть сокращен до 38 следующим образом: (x,y,r,X,Y,R)->Math.hypot(x-X,y-Y)<r+R. На самом деле, только что понял, что это точно так же, как ответ Арно в JavaScript.
laszlok

Спасибо ... Этот ответ был ранее предназначен для игры в гольф ... я думал, что это был такой простой вызов, не было бы ничего, что можно было бы сыграть в гольф ...
Роман Грэф,

Боюсь, ваш ответ теперь точно такой же, как уже опубликованный ответ от @ OlivierGrégoire ..
Кевин Круйссен,

1

Машинный код x86 (с SSE2), 36 байт

; bool CirclesOverlap(double x1, double y1, double r1,
;                     double x2, double y2, double r2);
F2 0F 5C C3        subsd   xmm0, xmm3      ; x1 - x2
F2 0F 5C CC        subsd   xmm1, xmm4      ; y1 - y2
F2 0F 58 D5        addsd   xmm2, xmm5      ; r1 + r2
F2 0F 59 C0        mulsd   xmm0, xmm0      ; (x1 - x2)^2
F2 0F 59 C9        mulsd   xmm1, xmm1      ; (y1 - y2)^2
F2 0F 59 D2        mulsd   xmm2, xmm2      ; (r1 + r2)^2
F2 0F 58 C1        addsd   xmm0, xmm1      ; (x1 - x2)^2 + (y1 - y2)^2
66 0F 2F D0        comisd  xmm2, xmm0
0F 97 C0           seta    al              ; ((r1 + r2)^2) > ((x1 - x2)^2 + (y1 - y2)^2)
C3                 ret

Вышеупомянутая функция принимает описания двух окружностей (x- и y-координаты центральной точки и радиуса) и возвращает логическое значение, указывающее, пересекаются они или нет.

Он использует векторное соглашение о вызовах, в котором параметры передаются в регистры SIMD. В x86-32 и 64-битной Windows это __vectorcallсоглашение о вызовах . На 64-битных Unix / Linux / Gnu это стандартное соглашение о вызовах System64 AMD64 .

Возвращаемое значение остается в младшем байте EAX , как это стандартно для всех соглашений о вызовах x86.

Этот код одинаково хорошо работает на 32-разрядных и 64-разрядных процессорах x86, если они поддерживают набор инструкций SSE2 (который будет Intel Pentium 4 и более поздних версий или AMD Athlon 64 и более поздних).

Версия AVX, все еще 36 байтов

Если вы ориентируетесь на AVX , возможно, вы захотите добавить в инструкции префикс VEX. Это не меняет количество байтов; только фактические байты, используемые для кодирования инструкций:

; bool CirclesOverlap(double x1, double y1, double r1,
;                     double x2, double y2, double r2);
C5 FB 5C C3      vsubsd   xmm0, xmm0, xmm3   ; x1 - x2
C5 F3 5C CC      vsubsd   xmm1, xmm1, xmm4   ; y1 - y2
C5 EB 58 D5      vaddsd   xmm2, xmm2, xmm5   ; r1 + r2
C5 FB 59 C0      vmulsd   xmm0, xmm0, xmm0   ; (x1 - x2)^2
C5 F3 59 C9      vmulsd   xmm1, xmm1, xmm1   ; (y1 - y2)^2
C5 EB 59 D2      vmulsd   xmm2, xmm2, xmm2   ; (r1 + r2)^2
C5 FB 58 C1      vaddsd   xmm0, xmm0, xmm1   ; (x1 - x2)^2 + (y1 - y2)^2
C5 F9 2F D0      vcomisd  xmm2, xmm0
0F 97 C0         seta     al                 ; ((r1 + r2)^2) > ((x1 - x2)^2 + (y1 - y2)^2)
C3               ret

Преимущество инструкций AVX состоит в том, что они берут три операнда, что позволяет вам выполнять неразрушающие операции, но это не помогает нам сжать код здесь. Однако смешивание инструкций с префиксами VEX и без них может привести к неоптимальному коду, поэтому вы, как правило, хотите придерживаться всех инструкций AVX, если вы ориентируетесь на AVX, и в этом случае это даже не повредит количеству байтов.



1

PHP , 66 байт

<?php $i=$argv;echo hypot($i[1]-$i[4],$i[2]-$i[5])<$i[3]+$i[6]?:0;

Попробуйте онлайн!

Запускается из командной строки, принимая входные данные в качестве 6 аргументов параметра командной строки, и печатает 1, если кружки перекрываются, иначе 0.



0

Clojure, 68 байт

#(<(+(*(- %4 %)(- %4 %))(*(- %5 %2)(- %5 %2)))(*(+ %6 %3)(+ %6 %3)))

Принимает шесть аргументов: x1, y1, r1, x2, y2, r2. Возвращает истину или ложь.

К сожалению, Clojure не имеет powфункции какого-то рода. Стоит много байтов.


0

На самом деле , 8 байт

-)-(h@+>

Попробуйте онлайн!

Объяснение:

-)-(h@+>  (implicit input: [y1, y2, x1, x2, r1, r2])
-         y2-y1 ([y2-y1, x1, x2, r1, r2])
 )-       move to bottom, x1-x2 ([x1-x2, r1, r2, y2-y1])
   (h     move from bottom, Euclidean norm ([sqrt((y2-y1)**2+(x2-x1)**2), r1, r2])
     @+   r1+r2 ([r1+r2, norm])
       >  is r1+r2 greater than norm?

0

R (+ pryr), 31 байт

pryr::f(sum((x-y)^2)^.5<sum(r))

Который оценивает функцию

function (x, y, z) 
sum((x - y)^2)^0.5 < sum(z)

Где xнаходятся координаты круга 1, yесть координаты круга 2 иz радиусы.

Вычисляет расстояние между двумя центрами, используя Пифагор, и проверяет, меньше ли это расстояние, чем сумма радиусов.

Использует векторизацию R для одновременного вычисления (x1-x2)^2и (y1-y2)^2. Затем они суммируются и имеют квадратные корни.


0

Go , 93 байта

package q
import c "math/cmplx"
func o(a,b complex128,r,R float64)bool{return c.Abs(b-a)<r+R}

Довольно простой алгоритм, как и несколько других ответов, за исключением того, что он использует встроенный complexтип и вызывает math / cmplx.Abs ().

Принятие радиусов в качестве комплексных чисел не помогает, потому что приведение к float64 добавляет больше байтов, чем сохраняет объявление переменной (не может сделать float64 < complex128).

Попробуйте онлайн! Включает тестовые наборы и использует основной пакет вместо библиотеки.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.