Minimum Skaler Ürün


16

Minimum Skaler Ürün

Bu kod golf sorununun ilham kaynağı Google'ın kod sıkışması yarışmasından kaynaklanmaktadır . Sorunun arkasındaki dayanak, değişen uzunluklarda iki vektörün girdisi göz önüne alındığında, mümkün olan minimum skaleri bulmaktır. Aşağıdaki formül kullanılarak bir skaler bulunabilir:

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

Ancak sorun, giriş durumundaki sayıların sırasına bağlı olarak skaler için birden fazla değerin bulunabilmesidir (aşağıda görülmektedir). Amacınız, giriş senaryosu sayılarını denkleme takarak ve bunun için çözerek olası minimum skaler tamsayı çözümünü belirlemektir. Girişteki her sayıyı yalnızca bir kez kullanabilirsiniz ve tüm sayıları kullanmanız gerekir.

Aşağıdaki vektörlerle bir örnek vereyim.

Giriş

3
1 3 -5
-2 4 1

Çıktı

-25

Satırdaki ilk tam sayı, her vektördeki n sayısını, n sayısını temsil eder. Bu durumda, her vektörde üç sayı vardır.

N sayısı her test durumuna göre değişebilir, ancak her zaman iki vektör olacaktır.

Örnek girişte, minimum skaler ürün -25 olacaktır.

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

kurallar

  • Her tamsayıyı her iki vektörde de yalnızca bir kez kullanabilirsiniz.
  • Vektörlerdeki tüm tam sayıları kullanmalısınız.
  • Çıktınız yalnızca son ürünü içermelidir
  • Yukarıda listelenen tüm özellikleri takip eden en az kod içeren çözümü herhangi bir dilde seçeceğim!

İpucu: Kodunuzu kısaltmadıkça bu sorunu zorlamanız gerekmez. Minimum yayılma skalerini bulmak için spesifik bir yöntem vardır :).


Gerçekten kimseyi mahvetmek istemiyorum, bu yüzden cevabı zaten bilmiyorsanız bunu açmayın. bu çok iyi biliniyor komik. en.m.wikipedia.org/wiki/Rearrangement_inequality
gururlu haskeller

Yanıtlar:


8

Jöle, 6 bayt

ṢṚ×Ṣ}S

Çevrimiçi deneyin!

Kaba kuvvet kullanmak eşit derecede kısadır:

Œ!×S€Ṃ

Nasıl çalışır

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

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

Bu, sol ve sağdaki dizileri kabul eden ve bir tamsayı döndüren ikili bir işlevdir. Benim Julia ile aynı yaklaşımı kullanan cevap sıralı Dizilerin nokta ürünün, bir azalan ve bir artan:.

Burada deneyin


5

MATL , 6 bayt

Kod:

SiSP*s

İlk MATL cevabım :)

Açıklama:

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

Çevrimiçi deneyin!


1
Bunu gördüğüme sevindim! :-)
Luis Mendo

4

Mathematica, 30 17 bayt

Murphy tarafından -13 bayt

Sort@#.-Sort@-#2&

İşlev, girdi vektör1 (liste), vektör2 (liste). Birkaç revizyon:

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

akıllı çözüm!
baseman101

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

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

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

Veya çözümünüz için 1,Sort@#.SortBy[#2,-#&]
CalculatorFeline


2

Julia, 32 25 bayt

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

Bu, iki diziyi kabul eden ve bir tamsayı döndüren anonim bir işlevdir. Bunu çağırmak için bir değişkene atayın ve yapın f(x)(y).

Girişleri için x ve y , biz sadece nokta ürünü hesaplamak x ters olarak sıralanmış y kriteri. Biz almak x sonra, sıralama, tüm değerleri negating tekrar olumsuzlaştırılmasıyla ters sıralı düzende.

Dennis sayesinde 7 bayt kurtardı!


2

Javascript ES6, 69 bayt

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

Vay be, bu çok uzun.


Ben sıralama fonksiyonu yeniden kullanmak için size 3 bayt mal olduğunu düşünüyorum.
Neil

Daha fazla golf yaptım. Daha iyi?
Mama Fun Roll

Muhtemelen |iyerine bir bayt kaydedebilirsiniz&&i
ETHproductions 13:16

Thx @ETHproductions
Mama Fun Roll

Evet, ben de öyle düşünüyordum.
Neil



1

Python, 139 bayt

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
Eşitliklerin yanındaki boşlukları kaldırarak birkaç bayt kaydedebilirsiniz, örneğin b = sorted(b), dönüşür b=sorted(b)(2 bayt kaydedildi). Ayrıca, birden çok ifadeyi noktalı virgülle ayırarak aynı satıra koyabilirsiniz, örneğina=list(reversed(sorted(a)));b=sorted(b);res=0
charredgrass

@charredgrass Burada yeniyim. Olası her baytı kaydetmeye ne gerek var? Okunabilir hale getirmeye çalışıyordum.
rebelliard

PPCG'ye hoş geldiniz! Bu soru, hedefi mümkün olan en az baytta tamamlamak için kod yazmak olduğu, genellikle daha az okunabilir kod anlamına gelen bir kod golf yarışmasıdır.
charredgrass

@charredgrass anladım!
rebelliard

2
Çok kısa: lambda a,b,s=sorted:sum(x*y for x,y in zip(s(a)[::-1],s(b))). İşlev gönderimlerinin adlandırılmasını istemiyoruz (bu nedenle adlandırılmamış bir lambda geçerlidir) ve nparametre gereksizdir (diğer birçok gönderim tamamen atlar).
Mego

1

C ++, 124 bayt

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

İlk başta ben std::greater<int>()sıralama için kullanılan bama sadece toplamı düzeni tersine çevirmek daha kolaydır.


1

Haskell, 59 bayt

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

0

DÖNÜŞ , 29 bayt

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

Try it here.

␆␃␄␇Bunları yazdırılamaz eşleriyle değiştirin .

Yığın2'de sonuç bırakan anonim lambda. Kullanımı:

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

açıklama

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

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

Diğerleriyle aynı prensibi kullanır.

açıklama

+/@(*|.)&(/:~)  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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.