ผลิตภัณฑ์เกลาขั้นต่ำ


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 ไบต์

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

นี่คือฟังก์ชัน dyadic ที่ยอมรับอาร์เรย์ทางซ้ายและขวาและส่งกลับจำนวนเต็ม มันใช้วิธีการเดียวกันกับคำตอบ Julia ของฉัน: ผลคูณดอทของอาเรย์เรียงลำดับหนึ่งรายการจากมากไปน้อยและหนึ่งจากน้อยไปมาก

ลองที่นี่


5

MATL , 6 ไบต์

รหัส:

SiSP*s

คำตอบ MATL ครั้งแรกของฉัน :)

คำอธิบาย:

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

ลองออนไลน์!


1
ฉันดีใจที่ได้เห็นสิ่งนี้! :-)
Luis Mendo

4

Mathematica, 30 17 ไบต์

-13 ไบต์โดย murphy

Sort@#.-Sort@-#2&

ฟังก์ชั่นอินพุตเป็น vector1 (รายการ), vector2 (รายการ) การแก้ไขหลายประการ:

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&
alephalpha

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

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

หรือวิธีแก้ปัญหาของคุณ 1Sort@#.SortBy[#2,-#&]
CalculatorFeline

2

Pyth - 14 8 ไบต์

ฉันคิดว่าฉันรู้เคล็ดลับ

s*VSQ_SE

ลองมันออนไลน์ได้ที่นี่


2

Julia, 32 25 ไบต์

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

นี่คือฟังก์ชันที่ไม่ระบุชื่อที่ยอมรับสองอาร์เรย์และส่งกลับจำนวนเต็ม f(x)(y)เรียกว่ากำหนดให้ตัวแปรและทำ

สำหรับอินพุตxและyเราเพียงแค่คำนวณจุดผลิตภัณฑ์ของxเรียงตามลำดับกลับกันด้วยการเรียงลำดับy เราได้xในลำดับที่เรียงกลับกันโดยลบค่าทั้งหมดเรียงลำดับแล้วลบอีกครั้ง

บันทึกไปแล้ว 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 ไบต์
Neil

ฉันเล่นกอล์ฟมากขึ้น ดีขึ้นหรือไม่
Mama Fun Roll

คุณสามารถบันทึกไบต์ด้วย|iแทนที่จะเป็น&&i
ETHproductions

ขอบคุณ @ETHproductions
Mama Fun Roll

ใช่นั่นคือสิ่งที่ฉันคิด
Neil



1

Python ขนาด 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 ฉันใหม่ที่นี่ จำเป็นต้องบันทึกทุกไบต์ที่เป็นไปได้อย่างไร ฉันพยายามทำให้อ่านได้
rebelliard

ยินดีต้อนรับสู่ PPCG แล้ว! คำถามนี้เป็นการแข่งขันรหัส - กอล์ฟโดยมีเป้าหมายคือการเขียนรหัสเพื่อให้การแข่งขันเสร็จสิ้นในจำนวนไบต์น้อยที่สุดเท่าที่จะเป็นไปได้ซึ่งโดยปกติจะหมายถึงรหัสที่อ่านได้น้อยกว่า
charredgrass

@ charredgrass เข้าใจแล้ว!
rebelliard

2
สั้นกว่ามาก: lambda a,b,s=sorted:sum(x*y for x,y in zip(s(a)[::-1],s(b))). เราไม่ต้องการให้มีการตั้งชื่อการส่งฟังก์ชั่น (ดังนั้นแลมบ์ดาที่ไม่มีชื่อนั้นถูกต้อง) และnพารามิเตอร์นั้นไม่จำเป็น (การส่งอื่น ๆ จำนวนมากตัดออกไปโดยสิ้นเชิง)
Mego

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

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

ตอนแรกฉันใช้std::greater<int>()เรียงลำดับbแต่การกลับคำสั่งในการรวมนั้นง่ายกว่า



0

ผลตอบแทน 29 ไบต์

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

Try it here.

แทนที่ใด ๆ ␆␃␄␇ด้วยคู่ที่ไม่สามารถพิมพ์ได้ของพวกเขา

แลมบ์ดานิรนามที่ส่งผลให้เกิด stack2 การใช้งาน:

""{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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.