Вот быстрый вызов в понедельник утром ...
Напишите функцию или программу с наименьшим числом байтов, которые:
- Принимает в качестве ввода список
[x,y]
координат - В качестве входных данных принимает список
[x,y]
соответствующих масс координат. - Выводит рассчитанный центр масс в виде
[xBar,yBar]
.
Замечания:
- Входные данные могут быть приняты в любой форме, если используется массив.
Центр масс можно рассчитать по следующей формуле:
На простом английском ...
- Чтобы найти
xBar
, умножьте каждую массу на соответствующую ей координату x, суммируйте полученный список и разделите его на сумму всех масс. - Чтобы найти
yBar
, умножьте каждую массу на ее соответствующую координату y, суммируйте полученный список и разделите его на сумму всех масс.
Тривиальный пример Python 2.7:
def center(coord, mass):
sumMass = float(reduce(lambda a, b: a+b, mass))
momentX = reduce(lambda m, x: m+x, (a*b for a, b in zip(mass, zip(*coord)[0])))
momentY = reduce(lambda m, y: m+y, (a*b for a, b in zip(mass, zip(*coord)[1])))
xBar = momentX / sumMass
yBar = momentY / sumMass
return [xBar, yBar]
Тестовые случаи:
> center([[0, 2], [3, 4], [0, 1], [1, 1]], [2, 6, 2, 10])
[1.4, 2.0]
> center([[3, 1], [0, 0], [1, 4]], [2, 4, 1])
[1.0, 0.8571428571428571]
Это код-гольф, поэтому выигрывает наименьшее количество байтов!
code-golf
arithmetic
array-manipulation
Мистер Паблик
источник
источник
[x,y,m],[x,y,m]...
?[(x1,y1,m1), (x2,y2,m2)]
списка кортежей? Или не имеет значения, являются ли аргументы кортежами, списками или массивами? Как насчет трех списков / массивов?Ответы:
MATL ,
65 байтФормат ввода - вектор строки с массами, затем матрица из двух столбцов с координатами (в которых пробелы или запятые являются необязательными).
Первый пример:
Второй пример:
Попробуйте онлайн!
объяснение
Обозначим
m
через вектор масс (первый вход) иc
матрицу координат (второй вход).источник
y
довольно полезно !! +1Mathematica, 10 байт
Пример:
источник
Dot
. Но я, увидев ваше использование выше!Mathcad, 19 "байтов"
Поскольку Mathcad использует «белую доску» 2D и специальные операторы (например, оператор суммирования, интегральный оператор) и сохраняет в формате XML, фактическая рабочая таблица может содержать несколько сотен (или более) символов. Для целей Code Golf я взял число байтов Mathcad в качестве количества символов или операторов, которые пользователь должен ввести для создания таблицы.
Первая (программная) версия запроса занимает 19 «байтов», используя это определение, а версия функции занимает 41 «байтов».
источник
MATLAB / Octave,
1816 байтовСпасибо пользователю beaker и Don Muesli за удаление 2 байтов!
Учитывая, что координаты находятся в
N x 2
матрице,x
где первый столбец является координатой X, а второй столбец является координатой Y, а массы находятся в1 x N
матрицеy
(или в векторе строки):Объяснение этого кода довольно простое. Это анонимная функция, которая принимает два входа
x
иy
. Мы выполняем взвешенное суммирование (числовое выражение каждой координаты) в линейном алгебраическом подходе с использованием умножения матрицы на вектор. Взяв векторy
масс и умножив его на матрицу координатx
умножением матрицы на вектор, вы бы вычислили взвешенную сумму обеих координат по отдельности, а затем мы разделили каждую из этих координат на сумму масс, таким образом найдя нужный центр масса возвращается как вектор строки 1 x 2 для каждой координаты соответственно.Пример работает
Попробуйте онлайн!
https://ideone.com/BzbQ3e
источник
;
, а также'
, правильно выбрав формат ввода (x
как вектор строки)Желе, 6 байт
или
Ввод осуществляется через два аргумента командной строки, сначала массы, а затем координаты.
Попробуйте онлайн!
объяснение
или
источник
Юлия,
2517 байтПропустил очевидный подход: / Звоните, как
f([3 1;0 0;1 4], [2 4 1])
.источник
CJam, 14 байтов
Неименованная функция ожидает список пар координат и список масс в стеке (в этом порядке) и оставляет центр масс на своем месте.
Проверьте это здесь.
объяснение
источник
Perl 6,
363330 байтисточник
Серьезно, 16 байт
Принимает вход как
[x-coords]\n[y-coords]\n[masses]
и выводит какxbar\nybar
Попробуйте онлайн!
Объяснение:
источник
Haskell,
5550 байтЭто определяет двоичную функцию
f
, используемую следующим образом:Смотрите, как пройти оба теста.
объяснение
Haskell не очень подходит для обработки многомерных списков, поэтому я прыгаю здесь через несколько обручей. Первая строка определяет короткий псевдоним для
zipWith
которого нам нужно дважды. По сути,f
это функция, которая берет список весовa
и производитf a
, функция, которая берет список позиций и производит центр масс.f a
это композиция из трех функций:источник
JavaScript (ES6), 60 байт
Принимает массив (x, y, mass) «троек» и возвращает «кортеж».
источник
[x,y,m]
? iirc, они не требуются, если есть только один входной аргумент для функции стрелки.R,
3225 байтотредактируйте -7 байтов, переключившись на матричную алгебру (спасибо @ Sp3000 Julia answer)
передать массив (матрицу с 2 столбцами, x, y) в качестве координат и вектора
m
весов, возвращает массив с необходимыми координатамиисточник
PHP, 142 байта
В разобранном виде Требуется ввод ВозвращениеArray: [ xbar, ybar ]
p()
Функция является базовой картой, умножение каждого[m]
значения с соответствующим[x]
или[y]
значением.c()
Функция принимает вArray[Array]
, представленаarray_sum
иarray_map
функции для пространства, затем вычисляетΣmx/Σm
иΣmy/Σm
.Можно было бы превратить сам расчет в функцию для пространства, увидим.
источник
Mathcad, 8 "байтов"
Я не знаю, о чем я не думал в своем предыдущем ответе. Вот более короткий способ правильного использования умножения матриц. Переменная p содержит данные - если установка переменной ведет к сумме, то добавьте еще 2 «байта» (создание входной таблицы = 1 байт, имя переменной = 1 байт).
источник
Python 3, 63 байта
Векторные операции над списками длинные: /
Это анонимная лямбда-функция - дайте ей имя и вызовите как
f([[0,2],[3,4],[0,1],[1,1]],[2,6,2,10])
.источник
Python 3,
959088 байтРешение
Результаты
благодаря @Zgarb, экономящему 2 байта
Рекурсивное решение для веселья (95 байт)
Результаты
источник
*([c]+[m])
можно сократить до*[c,m]
.Аксиома, 158 байт
раскрутить это
Результаты
источник
к, 13 байт
Попробуйте онлайн!
источник