Мінімальний скалярний продукт


16

Мінімальний скалярний продукт

Натхнення для цієї проблеми коду гольфу від конкуренції код варення від 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

Правила

  • Ви можете використовувати кожне ціле число в обох векторах один раз.
  • Ви повинні використовувати всі цілі числа у векторах.
  • Вихід повинен включати лише кінцевий продукт
  • Я виберу рішення з найменшою кількістю коду, яке відповідає всім переліченим вище технічним умовам, будь-якою мовою!

Підказка: Вам не потрібно жорстоко змушувати цю проблему, якщо вона не скоротить ваш код. Існує конкретний метод, що займається пошуком мінімального скануючого скаляра :).


Я справді не хочу нікого псувати, тому не відкривайте цього, якщо ви вже не знаєте відповіді. це так добре відомо, що це смішно. en.m.wikipedia.org/wiki/Rearrangement_inequality
гордий haskeller

Відповіді:


8

Желе, 6 байт

ṢṚ×Ṣ}S

Спробуйте в Інтернеті!

Застосування грубої сили однаково коротке:

Œ!×S€Ṃ

Як це працює

ṢṚ×Ṣ}S  Main link. Arguments: u (vector), v (vector)

Ṣ       Sort the components of u.
 Ṛ      Reverse.
   Ṣ}   Sort the components of v.
  ×     Multiply the results, element by element.
     S  Compute the sum of the products.


5

APL, 15 байт

{+/⍺[⍒⍺]×⍵[⍋⍵]}

Це діадійна функція, яка приймає масиви зліва та справа і повертає ціле число. Він використовує той самий підхід, що і моя відповідь Юлії : крапковий добуток відсортованих масивів, один низхідний і один висхідний.

Спробуйте тут



4

Математика, 30 17 байт

-13 байт по морфі

Sort@#.-Sort@-#2&

Функція, вхід - вектор1 (список), вектор2 (список) Кілька змін:

Plus@@(Sort@#*Reverse@Sort@#2)&(*me*)
Total[Sort@#*Reverse@Sort@#2]& 
Sort@#.Reverse@Sort@#2&        (*alephalpha*)
Sort@#.Sort[#2,#>#2&]&         (*murphy*)
Sort@#.SortBy[#2,-#&]          (*me*)
Sort@#.-Sort@-#2&              (*murphy*)

розумне рішення!
baseman101

2
Sort@#.Reverse@Sort@#2&
алефальфа

Sort@#.Sort[#2,#>#2&]&
murphy

1
Sort@#.-Sort@-#2&
murphy

Або для вашого рішення 1,Sort@#.SortBy[#2,-#&]
CalculatorFeline


2

Джулія, 32 25 байт

x->y->-sort(-x)⋅sort(y)

Це анонімна функція, яка приймає два масиви і повертає ціле число. Щоб викликати його, призначте його змінній і зробітьf(x)(y) .

Для входів x і y ми просто обчислюємо крапковий добуток x, відсортований у зворотному порядку з відсортованим y . Ми отримуємо х у зворотному відсортованому порядку, відкидаючи всі значення, сортуючи, а потім знову відкидаючи.

Збережено 7 байт завдяки Деннісу!


2

Javascript ES6, 69 байт

a=>b=>a.sort((x,y)=>x-y).map((x,y)=>i+=b.sort((x,y)=>y-x)[y]*x,i=0)|i

Нічого собі, це занадто довго.


Я думаю, що спроба повторно використовувати функцію сортування коштує вам 3 байти.
Ніл

Я займався більше гольфу. Краще?
Mama Fun Roll

Можливо, ви можете зберегти байт |iзамість&&i
ETHproductions

Thx @ETHproductions
Mama Fun Roll

Так, саме про це я і думав.
Ніл



1

Пітон, 139 байт

def mdp(n, a, b):
    a = list(reversed(sorted(a)))
    b = sorted(b)
    res = sum([a[i] * b[i] for i in range(len(a))])
    return res

1
Ви можете зберегти кілька байт, видаливши пробіли поруч із рівними, наприклад, b = sorted(b)перетворюється на b=sorted(b)(2 байти збережено). Ви можете додатково поставити кілька заяв на один рядок, відокремивши їх крапкою з комою, наприкладa=list(reversed(sorted(a)));b=sorted(b);res=0
charredgrass

@charredgrass Я тут новий. Яка потреба зберегти кожен можливий байт? Я намагався зробити його читабельним.
повстанець

Ласкаво просимо до PPCG! Це питання - змагання з кодового гольфу, де метою є написання коду, щоб виконати виклик у найменших можливих байтах, що зазвичай означає менш читабельний код.
charredgrass

@charredgrass отримав це!
повстанець

2
Набагато коротше: lambda a,b,s=sorted:sum(x*y for x,y in zip(s(a)[::-1],s(b))). Ми не вимагаємо, щоб подання функцій було названо (тому неназвана лямбда є дійсною), а nпараметр є непотрібним (багато інших подань пропускають його повністю).
Мего

1

C ++, 124 байти

#include<algorithm>
int m(int*a,int*b,int n){std::sort(a,a+n);std::sort(b,b+n);int r=0;while(--n>=0)r+=a[n]**b++;return r;}

неозорений:

#include<algorithm>
int m(int*a,int*b,int n){
 std::sort(a,a+n);
 std::sort(b,b+n);
 int r=0;
 while(--n>=0)
  r+=a[n]*(*b++);
return r;
}

Спочатку я використовував std::greater<int>()для сортування, bале просто повернути порядок у підсумовуванні простіше.



0

ПОВЕРНЕННЯ , 29 байт

[{␆␃}\{␆}␄␅[¤¥][×␌]#}␁[¤][+]#]

Try it here.

Замініть будь-яку ␆␃␄␇ своїми недрукованими аналогами.

Анонімна лямбда, яка залишає результат у стеці2. Використання:

""{1 3 0 5-}""{0 2- 4 1}[{␆␃}\{␆}␄␅[¤¥][×␌]#}␁[¤][+]#]!

Пояснення

[                                 ]  lambda
 {␆␃}                              sort and reverse first stack
       \{␆}                         sort second stack
            ␄␅                     transpose and flatten
               [  ][  ]#             while loop
                ¤¥                     check if 2 items exist in stack
                    ×                  if so, multiply top 2 items
                     ␌                 and push to stack2
                        }␁          switch to stack2
                           [¤][+]#   sum stack2

0

J, 14 байт

+/@(*|.)&(/:~)

Використовується той же принцип, що й інші.

Пояснення

+/@(*|.)&(/:~)  Input: x on LHS and y on RHS
        &(/:~)  Sort both x and y
     |.         Reverse the sorted y
    *           Multiply the sorted x and reversed sorted y elementwise
+/@             Reduce the products using addition and return
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.