Produk Skalar Minimum

16

Produk Skalar Minimum

Inspirasi untuk masalah golf kode ini berasal dari kompetisi kode jam Google . Premis di balik masalah ini adalah, mengingat input dari dua vektor dengan panjang yang bervariasi, temukan skalar minimum yang mungkin. Skalar dapat ditemukan menggunakan rumus berikut:

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

Masalahnya, bagaimanapun, adalah bahwa beberapa nilai untuk skalar dapat ditemukan tergantung pada urutan angka dalam kasus input (lihat di bawah). Tujuan Anda adalah untuk menentukan solusi integer skalar minimum yang mungkin dengan memasukkan angka kasus input ke dalam persamaan dan menyelesaikannya. Anda dapat menggunakan setiap angka dalam input hanya sekali, dan harus menggunakan semua nomor.

Izinkan saya untuk memberikan contoh dengan vektor-vektor berikut.

Memasukkan

3
1 3 -5
-2 4 1

Keluaran

-25

Bilangan bulat pertama pada garis mewakili jumlah angka, n, dalam setiap vektor. Dalam hal ini, kami memiliki tiga angka di setiap vektor.

Angka n dapat bervariasi dengan setiap test case, tetapi akan selalu ada dua vektor.

Pada input contoh, produk skalar minimum adalah -25.

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

Aturan

  • Anda hanya dapat menggunakan setiap bilangan bulat di kedua vektor satu kali.
  • Anda harus menggunakan semua bilangan bulat di vektor.
  • Output Anda hanya harus mencakup produk akhir
  • Saya akan memilih solusinya dengan jumlah kode paling sedikit, yang mengikuti semua spesifikasi yang tercantum di atas, dalam bahasa apa pun!

Petunjuk: Anda tidak perlu memaksa masalah ini, kecuali jika itu membuat kode Anda lebih pendek. Ada metode khusus yang terlibat dalam menemukan skalar spanning minimum :).

baseman101
sumber
Saya benar-benar tidak ingin merusak siapa pun, jadi jangan buka ini kecuali Anda sudah tahu jawabannya. ini sangat terkenal itu lucu. en.m.wikipedia.org/wiki/Rearrangement_inequality
bangga haskeller

Jawaban:

8

Jelly, 6 byte

ṢṚ×Ṣ}S

Cobalah online!

Menggunakan brute force sama pendeknya:

Œ!×S€Ṃ

Bagaimana itu bekerja

ṢṚ×Ṣ}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.
Dennis
sumber
6

Serius , 6 byte

,SR,S*

Cobalah online!

Penjelasan:

,SR,S*
,SR     input first vector, sort, reverse
   ,S   input second vector, sort
     *  dot product
Mego
sumber
5

APL, 15 byte

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

Ini adalah fungsi diad yang menerima array di kiri dan kanan dan mengembalikan integer. Ia menggunakan pendekatan yang sama dengan jawaban Julia saya : produk titik dari array yang diurutkan, satu turun dan satu naik.

Coba di sini

Alex A.
sumber
5

MATL , 6 byte

Kode:

SiSP*s

Jawaban MATL pertama saya :)

Penjelasan:

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

Cobalah online!

Adnan
sumber
1
Saya senang melihat ini! :-)
Luis Mendo
4

Mathematica, 30 17 byte

-13 byte oleh murphy

Sort@#.-Sort@-#2&

Fungsi, input adalah vector1 (daftar), vector2 (daftar) Beberapa revisi:

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*)
CalculatorFeline
sumber
solusi cerdas!
baseman101
2
Sort@#.Reverse@Sort@#2&
alephalpha
Sort@#.Sort[#2,#>#2&]&
murphy
1
Sort@#.-Sort@-#2&
murphy
Atau untuk solusi Anda 1,Sort@#.SortBy[#2,-#&]
CalculatorFeline
2

Pyth - 14 8 byte

Saya pikir saya sudah tahu caranya.

s*VSQ_SE

Cobalah online di sini .

Maltysen
sumber
2

Julia, 32 25 byte

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

Ini adalah fungsi anonim yang menerima dua array dan mengembalikan integer. Untuk menyebutnya, tetapkan ke variabel dan lakukan f(x)(y).

Untuk input x dan y , kita cukup menghitung produk titik dari x diurutkan dalam urutan terbalik dengan y diurutkan. Kami mendapatkan x dalam urutan terbalik dengan meniadakan semua nilai, mengurutkan, lalu meniadakan lagi.

Disimpan 7 byte berkat Dennis!

Alex A.
sumber
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, ini terlalu lama.

Mama Fun Roll
sumber
Saya pikir mencoba menggunakan kembali fungsi semacam ini dikenakan biaya 3 byte.
Neil
Saya melakukan lebih banyak bermain golf. Lebih baik?
Mama Fun Roll
Anda mungkin dapat menyimpan byte dengan |ibukannya&&i
ETHproduksi
Thx @ETHproductions
Mama Fun Roll
Ya, itulah yang saya pikirkan.
Neil
2

Perl 6, 33 30 byte

{sum @^a.sort Z*@^b.sort.reverse}
Tombol cepat
sumber
Kenapa tidak{sum @^a.sort Z*[R,] @^b.sort}((1,3,-5),(-2,4,1)).say
Aleks-Daniel Jakimenko-A.
1

CJam, 11 Bytes

q~$\$W%.*:+

Cobalah online!

A Simmons
sumber
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
pemberontak
sumber
1
Anda dapat menyimpan beberapa byte dengan menghapus spasi di sebelah sama dengan, misalnya b = sorted(b)berubah menjadi b=sorted(b)(2 byte disimpan). Anda juga dapat menambahkan beberapa pernyataan pada baris yang sama dengan memisahkannya dengan tanda titik koma, misalnyaa=list(reversed(sorted(a)));b=sorted(b);res=0
charredgrass
@Chredredgrass Saya baru di sini. Apa perlunya menyimpan setiap byte yang mungkin? Saya mencoba membuatnya mudah dibaca.
Pemberontak
Selamat datang di PPCG! Pertanyaan ini adalah kompetisi kode-golf di mana tujuannya adalah untuk menulis kode untuk menyelesaikan tantangan dalam byte sesedikit mungkin, yang biasanya berarti kode lebih mudah dibaca.
charredgrass
@charredgrass mengerti!
pemberontak
2
Jauh lebih pendek: lambda a,b,s=sorted:sum(x*y for x,y in zip(s(a)[::-1],s(b))). Kami tidak memerlukan pengajuan fungsi untuk dinamai (jadi lambda yang tidak disebutkan namanya valid), dan nparameternya tidak perlu (banyak pengajuan lainnya mengabaikan sepenuhnya).
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;}

ungolfed:

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

Pada awalnya saya digunakan std::greater<int>()untuk menyortir btetapi hanya membalik urutan dalam penjumlahan lebih mudah.

Karl Napf
sumber
1

Haskell, 59 byte

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

KEMBALI , 29 byte

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

Try it here.

Ganti apa saja ␆␃␄␇ dengan rekan-rekan mereka yang tidak diinginkan.

Lambda anonim yang meninggalkan hasil di stack2. Pemakaian:

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

Penjelasan

[                                 ]  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
Mama Fun Roll
sumber
0

J, 14 byte

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

Menggunakan prinsip yang sama dengan yang lain.

Penjelasan

+/@(*|.)&(/:~)  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
mil
sumber