Минимальный скалярный продукт
Источником вдохновения для решения этой проблемы является гольф- конкурс Google . Причиной проблемы является, учитывая вход двух векторов различной длины, найти минимально возможный скаляр. Скаляр можно найти по следующей формуле:
x1 * y1 + x2 * y2 + ... + xn * yn
Проблема, однако, заключается в том, что можно найти несколько значений для скаляра в зависимости от порядка чисел во входном регистре (см. Ниже). Ваша цель состоит в том, чтобы определить минимально возможное скалярное целочисленное решение, вставив входные числа наблюдений в уравнение и найдя для него решение. Вы можете использовать каждое число на входе только один раз, и должны использовать все числа.
Позвольте мне привести пример со следующими векторами.
вход
3
1 3 -5
-2 4 1
Выход
-25
Первое целое число в строке представляет количество чисел n в каждом векторе. В этом случае у нас есть три числа в каждом векторе.
Число n может варьироваться в зависимости от каждого теста, но всегда будет два вектора.
В приведенном примере минимальное скалярное произведение будет равно -25.
(-5 * 4) + (1 * 1) + (3 * -2) = 25
правила
- Вы можете использовать каждое целое число в обоих векторах только один раз.
- Вы должны использовать все целые числа в векторах.
- Ваш вывод должен включать только конечный продукт
- Я выберу решение с наименьшим количеством кода, которое соответствует всем перечисленным выше спецификациям, на любом языке!
Подсказка: вам не нужно грубо форсировать эту проблему, если она не делает ваш код короче. Существует определенный метод поиска минимального охватывающего скаляра :).
источник
Ответы:
Желе, 6 байт
Попробуйте онлайн!
Использование грубой силы одинаково коротко:
Как это устроено
источник
Серьезно , 6 байт
Попробуйте онлайн!
Объяснение:
источник
APL, 15 байт
Это двоичная функция, которая принимает массивы слева и справа и возвращает целое число. Он использует тот же подход, что и мой ответ Джулии : скалярное произведение отсортированных массивов, одного по убыванию и одного по возрастанию.
Попробуй здесь
источник
MATL , 6 байтов
Код:
Мой первый ответ MATL :)
Объяснение:
Попробуйте онлайн!
источник
Mathematica,
3017 байт-13 байтов от Murphy
Функция, input это vector1 (список), vector2 (список) Несколько ревизий:
источник
Sort@#.Reverse@Sort@#2&
Sort@#.Sort[#2,#>#2&]&
Sort@#.-Sort@-#2&
Sort@#.SortBy[#2,-#&]
Pyth -
148 байтЯ думаю, я понял трюк.
Попробуйте это онлайн здесь .
источник
Юлия,
3225 байтЭто анонимная функция, которая принимает два массива и возвращает целое число. Чтобы вызвать его, назначьте его переменной и выполните
f(x)(y)
.Для входов x и y мы просто вычисляем скалярное произведение x, отсортированное в обратном порядке по y . Мы получаем x в обратном порядке, отрицая все значения, сортируя и снова отрицая.
Сэкономили 7 байт благодаря Денису!
источник
Javascript ES6, 69 байт
Вау, это слишком долго.
источник
|i
вместо&&i
Perl 6,
3330 байтисточник
{sum @^a.sort Z*[R,] @^b.sort}((1,3,-5),(-2,4,1)).say
CJam, 11 байт
Попробуйте онлайн!
источник
Python, 139 байт
источник
b = sorted(b)
превращается вb=sorted(b)
(сохранено 2 байта). Вы можете дополнительно поместить несколько операторов в одну строку, например, разделив их точкой с запятойa=list(reversed(sorted(a)));b=sorted(b);res=0
lambda a,b,s=sorted:sum(x*y for x,y in zip(s(a)[::-1],s(b)))
. Нам не нужно, чтобы имена функций были названы (так что лямбда без имени действительна), аn
параметр не нужен (во многих других представлениях он полностью отсутствует).C ++, 124 байта
ungolfed:
Сначала я использовал
std::greater<int>()
для сортировки,b
но проще поменять порядок в суммировании.источник
Haskell, 59 байт
источник
ВОЗВРАТ , 29 байт
Try it here.
Заменить любой
␆␃␄␇
их непечатными копиями.Анонимная лямбда, которая оставляет результат на stack2. Использование:
объяснение
источник
J, 14 байт
Использует тот же принцип, что и другие.
объяснение
источник