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 :).


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.


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


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!


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

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

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!


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.


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



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
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.


1

Haskell, 59 byte

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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.