Sản phẩm vô hướng tối thiểu


16

Sản phẩm vô hướng tối thiểu

Cảm hứng cho vấn đề golf mã này là từ cuộc thi kẹt mã của Google . Tiền đề đằng sau vấn đề này, được đưa vào đầu vào của hai vectơ có độ dài khác nhau, tìm vô hướng tối thiểu có thể. Một vô hướng có thể được tìm thấy bằng cách sử dụng công thức sau đây:

x1 * y1 + x2 * y2 + ... + xn * yn

Tuy nhiên, vấn đề là có thể tìm thấy nhiều giá trị cho vô hướng tùy thuộc vào thứ tự của các chữ số trong trường hợp đầu vào (xem bên dưới). Mục tiêu của bạn là xác định giải pháp số nguyên vô hướng tối thiểu có thể bằng cách cắm các số trường hợp đầu vào vào phương trình và giải cho nó. Bạn chỉ có thể sử dụng mỗi số trong đầu vào một lần và phải sử dụng tất cả các số.

Cho phép tôi cung cấp một ví dụ với các vectơ sau.

Đầu vào

3
1 3 -5
-2 4 1

Đầu ra

-25

Số nguyên đầu tiên trên dòng biểu thị số lượng số, n, trong mỗi vectơ. Trong trường hợp này, chúng ta có ba số trong mỗi vector.

Số n có thể thay đổi theo từng trường hợp thử nghiệm, nhưng sẽ luôn có hai vectơ.

Trong ví dụ đầu vào, sản phẩm vô hướng tối thiểu sẽ là -25.

(-5 * 4) + (1 * 1) + (3 * -2) = 25

Quy tắc

  • Bạn chỉ có thể sử dụng mỗi số nguyên trong cả hai vectơ một lần.
  • Bạn phải sử dụng tất cả các số nguyên trong các vectơ.
  • Đầu ra của bạn chỉ phải bao gồm sản phẩm cuối cùng
  • Tôi sẽ chọn giải pháp có số lượng mã ít nhất, tuân theo tất cả các thông số kỹ thuật được liệt kê ở trên, bằng bất kỳ ngôn ngữ nào!

Gợi ý: Bạn không cần phải xử lý vấn đề này, trừ khi nó làm cho mã của bạn ngắn hơn. Có một phương pháp cụ thể liên quan đến việc tìm vô hướng kéo dài tối thiểu :).


Tôi thực sự không muốn làm hỏng bất cứ ai, vì vậy đừng mở cái này trừ khi bạn đã biết câu trả lời. Điều này nổi tiếng đến mức buồn cười. en.m.wikipedia.org/wiki/Rearrangement_inequality
tự hào

Câu trả lời:


8

Thạch, 6 byte

ṢṚ×Ṣ}S

Hãy thử trực tuyến!

Sử dụng vũ lực cũng ngắn không kém:

Œ!×S€Ṃ

Làm thế nào nó hoạt động

ṢṚ×Ṣ}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 byte

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

Đây là một hàm dyadic chấp nhận các mảng ở bên trái và bên phải và trả về một số nguyên. Nó sử dụng cách tiếp cận giống như câu trả lời Julia của tôi : chấm sản phẩm của các mảng được sắp xếp, một giảm dần và một tăng dần.

Hãy thử nó ở đây


5

MATL , 6 byte

Mã số:

SiSP*s

Câu trả lời MATL đầu tiên của tôi :)

Giải trình:

S       # Sort the first array
 iS     # Take the second array and sort it
   P    # Flip the array
    *   # Multiply both arrays with each other
     s  # Sum of the result

Hãy thử trực tuyến!


1
Tôi rất vui khi thấy điều này! :-)
Luis Mendo

4

Toán học, 30 17 byte

-13 byte bởi tiếng vang

Sort@#.-Sort@-#2&

Hàm, đầu vào là vector1 (danh sách), vector2 (danh sách) Một số sửa đổi:

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*)

giải pháp thông minh!
baseman101

2
Sort@#.Reverse@Sort@#2&
alephalpha

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

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

Hoặc cho giải pháp của bạn 1,Sort@#.SortBy[#2,-#&]
Máy


2

Julia, 32 25 byte

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

Đây là một hàm ẩn danh chấp nhận hai mảng và trả về một số nguyên. Để gọi nó, gán nó cho một biến và làm f(x)(y).

Đối với đầu vào xy , chúng ta chỉ cần tính sản phẩm chấm của x được sắp xếp theo thứ tự ngược với y được sắp xếp. Chúng tôi nhận x theo thứ tự sắp xếp ngược bằng cách phủ định tất cả các giá trị, sắp xếp, sau đó phủ định lại.

Đã lưu 7 byte nhờ Dennis!


2

Javascript ES6, 69 byte

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

Wow, đây là cách quá dài.


Tôi nghĩ rằng việc cố gắng sử dụng lại chức năng sắp xếp sẽ khiến bạn tốn 3 byte.
Neil

Tôi đã chơi golf nhiều hơn. Tốt hơn?
Mama Fun Roll

Bạn có thể có thể lưu một byte |ithay vì&&i
ETHproductions 13/03/2016

Thx @ETHproductions
Mama Fun Roll

Vâng, đó là những gì tôi đã nghĩ đến.
Neil



1

Python, 139 byte

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ạn có thể lưu một vài byte bằng cách xóa các khoảng trắng bên cạnh bằng, ví dụ, b = sorted(b)biến thành b=sorted(b)(2 byte được lưu). Ngoài ra, bạn có thể đặt nhiều câu lệnh trên cùng một dòng bằng cách tách chúng bằng dấu chấm phẩy, chẳng hạna=list(reversed(sorted(a)));b=sorted(b);res=0
charredgrass

@charredgrass Tôi mới ở đây. Cần gì để lưu mỗi byte có thể? Tôi đã cố gắng để làm cho nó có thể đọc được.
rebelliard

Chào mừng bạn đến với PPCG rồi! Câu hỏi này là một cuộc thi golf-code trong đó mục tiêu là viết mã để hoàn thành thử thách trong ít byte nhất có thể, điều này thường có nghĩa là mã ít đọc hơn.
charredgrass

@charredgrass hiểu rồi!
rebelliard

2
Ngắn hơn nhiều : lambda a,b,s=sorted:sum(x*y for x,y in zip(s(a)[::-1],s(b))). Chúng tôi không yêu cầu đệ trình hàm phải được đặt tên (vì vậy lambda không tên là hợp lệ) và ntham số này là không cần thiết (nhiều lần gửi khác bỏ qua hoàn toàn).
Mego

1

C ++, 124 byte

#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;}

vô dụng:

#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;
}

Lúc đầu tôi sử dụng std::greater<int>()để sắp xếp bnhưng chỉ cần đảo ngược thứ tự trong tổng kết là dễ dàng hơn.


1

Haskell, 59 byte

import Data.List
v?u=sum$zipWith(*)(sort v)$reverse$sort u

0

TRẢ LẠI , 29 byte

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

Try it here.

Thay thế bất kỳ ␆␃␄␇với các đối tác không thể in của họ.

Lambda ẩn danh mà kết quả trên stack2. Sử dụng:

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

Giải trình

[                                 ]  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 byte

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

Sử dụng nguyên tắc giống như những người khác.

Giải trình

+/@(*|.)&(/:~)  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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.