최소 스칼라 제품


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 바이트

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

이것은 왼쪽과 오른쪽의 배열을 받아들이고 정수를 반환하는 2 차원 함수입니다. 내 줄리아 답변 과 같은 접근법을 사용합니다 : 정렬 된 배열의 내적, 내림차순 및 오름차순.

여기 사용해보십시오



4

Mathematica, 30 17 바이트

murphy에 의해 -13 바이트

Sort@#.-Sort@-#2&

함수, 입력은 vector1 (list), vector2 (list)입니다.

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&]&
머피

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

또는 솔루션 1,Sort@#.SortBy[#2,-#&]
CalculatorFeline


2

줄리아, 32 25 바이트

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

이것은 두 개의 배열을 허용하고 정수를 반환하는 익명 함수입니다. 호출하려면 변수에 할당하고 수행하십시오 f(x)(y).

입력 xy의 경우 , 우리는 단순히 x 의 내적 을 y 정렬 과 역순으로 정렬하여 계산합니다 . 모든 값을 무시하고 정렬 한 다음 다시 부정 하면 x 가 역순으로 정렬됩니다.

Dennis 덕분에 7 바이트가 절약되었습니다!


2

자바 스크립트 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

Thx @ETHproductions
Mama Fun Roll

네, 제가 생각한 것입니다.
Neil



1

파이썬, 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 나는 여기에 처음입니다. 가능한 모든 바이트를 저장해야합니까? 읽을 수 있도록하려고했습니다.
반군

PPCG에 오신 것을 환영합니다! 이 질문은 가능한 최소한의 바이트로 문제를 해결하기 위해 코드를 작성하는 것이 목표 인 코드 골프 경쟁입니다.
charredgrass

@charredgrass는 그것을 얻었다!
반군

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

언 골프 :

#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했지만 요약에서 순서를 반대로하는 것이 더 쉽습니다.


1

하스켈, 59 바이트

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

0

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