Усильте свою позицию


11

Вступление

Представьте, что вы находитесь в двухмерной декартовой плоскости и хотите определить свою позицию на ней. Вы знаете 3 точки на этой плоскости и ваше расстояние до каждой из них. Хотя из этого всегда можно рассчитать свою позицию, сделать это в своей голове довольно сложно. Таким образом, вы решили написать программу для этого.

Соревнование

Учитывая 3 балла и ваше расстояние до них, выведите свои координаты.

  • Ввод и вывод могут быть в любом удобном формате, включая использование сложных, а не вещественных чисел. Укажите в своем ответе, какой формат вы используете.
  • Вы всегда получите ровно 3 разных очка с их расстоянием до вас.
  • Координаты и расстояния будут плавать с произвольной точностью. Ваш вывод должен быть правильным с точностью до 3 знаков после запятой. Округление зависит от вас. Пожалуйста, уточните в своем ответе.
  • Вы можете предположить, что эти три точки не коллинеарны, поэтому всегда найдется уникальное решение.
  • Вам не разрешено брутфорс решения.
  • Вы не можете использовать любые встроенные функции, которые упрощают эту конкретную проблему. Хотя встроенные функции для векторных норм и т. Д. Допускаются.

Подсказка для начала:

Подумайте о круге вокруг каждой из этих трех точек с их расстоянием до вас в качестве радиуса.

правила

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

Формат ввода для одной точки здесь [[x,y],d]с xи yбыть координаты и dбыть расстояние до этой точки. 3 из этих пунктов расположены в списке. Вывод будет xи тогда yв список.

[[[1, 2], 1.414], [[1, 1], 2.236], [[2, 2], 1.0]] -> [2, 3]
[[[24.234, -13.902], 31.46], [[12.3242, 234.12], 229.953], [[23.983, 0.321], 25.572]] -> [-1.234, 4.567]
[[[973.23, -123.221], 1398.016], [[-12.123, -98.001], 990.537], [[-176.92, 0], 912.087]] -> [12.345, 892.234]

С помощью этой программы Pyth вы можете создавать дополнительные тестовые случаи . Расположение идет в первой строке ввода, а 3 точки находятся в следующих 3 строках.

Удачного кодирования!


Поскольку он должен соответствовать двумерной декартовой плоскости, код должен быть максимально коротким.
wizzwizz4

Вы, очевидно, используете неточные результаты, которые все еще могут привести к неоднозначности, как мы должны справиться с этим?
flawr

@flawr Просто предположите, что все результаты являются точными и уникальными. Ваша программа должна работать в случаях с очень небольшим количеством десятичных знаков, не беспокойтесь о двусмысленности. Я уберу вызов, когда буду дома.
Денкер

Поскольку принятый ответ по сути является просто графическим калькулятором, я упомяну, что в TI-Basic есть 96-байтовое решение (версия 68k). Чтобы прояснить, является ли solve(учитывая три круговых уравнения) тривиализирующей проблему? Я думал, что это так, но если ты в порядке с такими вещами, я пойду и опубликую это.
Fox

Ответы:


4

Desmos, 122 байта

Использование онлайн . Скопируйте + вставьте каждое уравнение в поле уравнения, нажмите «добавить все» для каждого поля, затем щелкните точку пересечения и введите соответствующее значение. каждый из A, Bи Cявляются расстояния для точек (a,b), (c,d), и (E,f), соответственно. Чтобы получить квадратный корень в значении, введите sqrtзначение в поле.

\left(x-a\right)^2+\left(y-b\right)^2=AA
\left(x-c\right)^2+\left(y-d\right)^2=BB
\left(x-E\right)^2+\left(y-f\right)^2=CC

Проверьте первый контрольный пример .

Или вы можете посмотреть здесь:

круги!


Это выглядит довольно хорошо, но удовлетворяет ли это нашим критериям для языков программирования? Для меня это выглядит как инструмент для черчения, никогда не использовал его, так что я могу ошибаться.
Денкер

1
@DenkerAffe Я уже задавал вопрос об этом на мета , и это действительно считается.
Конор О'Брайен

2
Хорошо, тогда возьми мой голос :)
Денкер

Я оспариваю количество байтов. Вы нажимаете на точку пересечения бесплатно, что кажется неправильным.
lirtosiast

@lirtosiast Я бы сказал, что по определению всегда есть смысл, и далее утверждают, что ОП сказал, что такого рода взаимодействие было в порядке. Однако, если вы считаете, что должно быть какое-то наказание, я открыт для предложений.
Конор О'Брайен

4

C 362 348 345 байт

Ввод задается в виде последовательности разделенных пробелами плавает на поверхности стандартного ввода: x1 y1 d1 x2 y2 d2 x3 y3 d3. Выход похож на стандартный вывод: x y.

#define F"%f "
#define G float
#define T(x)(b.x*b.x-a.x*a.x)
typedef struct{G a;G b;G c;}C;G f(C a,C b,G*c){G x=b.b-a.b;*c=(T(a)+T(b)-T(c))/x/2;return(a.a-b.a)/x;}main(){C a,b,c;G x,y,z,t,m;scanf(F F F F F F F F F,&a.a,&a.b,&a.c,&b.a,&b.b,&b.c,&c.a,&c.b,&c.c);x=f(a,a.b==b.b?c:b,&y);z=f(b.b==c.b?a:b,c,&t);m=t-y;m/=x-z;printf(F F"\n",m,x*m+y);}

Cтип структуры, членами которой являются x-координата a, y-координата bи расстояние (радиус) c. Функция fпринимает две Cструктуры и указатель на число с плавающей точкой и определяет линию, на которой Cпересекаются (круги). Y-точка пересечения этой линии помещается в указатель-поплавок, и наклон возвращается.

Программа вызывает fдве пары окружностей, затем определяет пересечение полученных линий.


Поскольку мы выяснили, что входные данные не коллинеарны, fпроизводимые линии никогда не будут параллельными. Тесты должны гарантировать, что они также не вертикальные, так как я использую форму перехвата с уклоном. Таким образом, всегда есть только один ответ.
Фокс

2

Питон - 172

Принимает ввод как список кортежей формы (x, y, d). Дайте мне знать, если вы видите способ игры в гольф дальше, я чувствую, что должно быть, но я не могу понять это!

import numpy as N
def L(P):
    Z=[p[2]**2-p[0]**2-p[1]**2 for p in P];return N.linalg.solve([[P[i][0]-P[0][0],P[i][1]-P[0][1]]for i in[1,2]],[(Z[0]-Z[i])*0.5 for i in [1,2]])

Вы можете опустить некоторые пробелы здесь. Нечто подобное -1 if 1 else 1может стать -1if 1else 1например. Это также работает с скобками. Есть несколько мест, где вы можете воспользоваться этим. И тоже .5самое 0.5.
Денкер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.