Соревнование
Эта задача очень проста. По четырем трехмерным точкам вычислите площадь поверхности тетраэдра, который они образуют. Это код-гольф , поэтому выигрывает самый короткий код. Применяются стандартные лазейки с дополнительным условием, что любая встроенная функция для выполнения этой задачи с учетом четырех пунктов запрещена.
Вы можете предположить, что все четыре точки будут различаться и будут передаваться через STDIN, 1 балл за линию. Каждая точка будет состоять из трех 16-битных целых чисел без знака. Точный формат каждой точки можно изменить, если это упрощает задачу, например, три целых числа через пробел. Однако наличие каждой точки на отдельной линии обязательно. Вывод должен быть через STDOUT, по крайней мере, до 2 десятичных знаков.
Для тех из вас, кто не знает, тетраэдр - это трехмерное тело, образованное четырьмя треугольными гранями.
пример
# input (format is up to you, see clarification above)
[23822, 47484, 57901]
[3305, 23847, 42159]
[19804, 11366, 14013]
[52278, 28626, 52757]
# output
2932496435.95
Пожалуйста, оставьте записку, если вы заметили, что моя математика неверна.
[[list],[of],[lists]]
?Ответы:
Питон,
198 178161 символовФормат ввода такой же, как в вопросе.
Он вычисляет длину ребер, прилегающих к каждой из граней, а затем использует формулу Герона .
источник
Matlab / Octave 103
Я предполагаю, что значения будут храниться в переменной
c
. При этом используется тот факт, что площадь треугольника равна половине длины перекрестного произведения двух его боковых векторов.источник
Input[]
Input[]
,InputString[]
,Import[]
иImportString[]
.APL, 59
Работает путем расчета перекрестных произведений
Пояснение
В первой строке определяется функция, которая принимает два аргумента (именованная безусловность
⍺
и⍵
), неявно ожидает, что они будут числовыми массивами длины 3, обрабатывает их как трехмерные векторы и вычисляет квадратичную величину их перекрестного произведения.Вторая строка делает все остальное.
источник
Питон 3,
308 298 292 279 258254Это использует:
источник
for i in">"*4
умныйx**0.5
вместоmath.sqrt(x)
.def a(t,u,v)
на одну строку следующим образом:def a(t,u,v):w=(t+u+v)/2;return(w*(w-t)*(w-u)*(w-v))**0.5
.Mathematica
168154Он находит длины ребер тетраэдра и использует формулу Герона для определения площадей граней.
Существует более прямой маршрут, который требует только 60 символов , но он нарушает правила, поскольку он вычисляет площадь каждого лица с помощью встроенной функции
Area
:источник
Мудрец - 103
Часть для чтения ввода адаптирована из ответа Кейта Рэндалла .
источник
Питон - 260
Я не уверен, что такое этикет для публикации ответов на ваши собственные вопросы, но она - мое решение, которое я использовал для проверки своего примера, игры в гольф:
Он использует ту же процедуру, что и laurencevs.
источник
r=range
.lambda
короче чемdef
.math.sqrt
можно заменить на(…)**.5
.p=copy.copy(P);p.pop(j);
можно сократить доp=P[:j-1]+P[j:]
.A
используется только один раз.С, 303
Исключая ненужные пробелы. Тем не менее, здесь еще предстоит много игры в гольф (я постараюсь вернуться и сделать это позже.) Я впервые объявил
for
петлю в#define
. Я всегда находил способы минимизировать количество циклов раньше.Мне пришлось изменить с
float
на,double
чтобы получить тот же ответ, что и ОП для контрольного примера. До этого это был раунд 300.scanf
работает одинаково, независимо от того, разделяете ли вы ввод пробелами или символами новой строки, поэтому вы можете отформатировать его в любое количество строк или в несколько строк.источник