저를 최소 마법 합계로 만드십시오


27

이 도전을 짧게 유지하십시오.

p1, p2, p3 및 p4의 4 가지 숫자가 제공됩니다.

숫자의 마법 합계는 다음과 같이 정의됩니다.

magic_sum = |p1 - p2| + |p2 - p3| + |p3 - p4| + |p4 - p1|

위의 정수 값 중 하나만 변경할 수 있습니다 (p1, p2, p3 또는 p4). 값의 마법 합계가 최소값에 도달하도록 값을 변경해야합니다.

예를 들면 다음과 같습니다.

p1, p2, p3, p4 = 17, -6, 15, 33.이 경우 매직 합의 값은 78입니다.

여기에서 -6을 16으로 변경할 수 있으며, 매직 합의 값은 36이 될 수 있으며 이는 최소값입니다.

숫자는 양수 또는 음수 일 수 있습니다.

이것은 코드 골프이므로 코드의 바이트 수가 가장 적습니다. 브라우니는 레크리에이션 언어보다 실용 언어를 사용하는 것에 대한 포인트입니다. 네 번째가 당신과 함께 있기를 바랍니다.

반복해서 :

샘플 1

입력 1

17 -6 15 33

출력 1

36

설명 1

-6은 16으로 대체 될 수 있으며 가능한 최소한의 마법 합계를줍니다.

샘플 2

입력 2

10 10 10 10

출력 2

0 or 2

어느 쪽이든 괜찮습니다

설명 2

4 개의 양의 정수의 최소 합계가 0이므로 최소 도달 가능 매직 합계는 0입니다. 숫자를 변경해야하는 경우 10 중 하나를 9로 변경하여 출력 2를 얻을 수 있습니다.

샘플 3

입력 3

1 2 3 4

출력 3

4

설명 3

입력 자체는 6을 마법 합계로 나타냅니다. 4에서 1로 변경하고 최소 마법 합계 인 4를 얻습니다.


10
+1이지만 더 많은 예제와 관련이 있습니다.
Jonathan Allan

2
완벽하게 작동하는 예제와 몇 가지 테스트 사례가 +1있습니다.
Shaggy

@Shaggy 님. 내 +1은 어디에 있습니까? : P
Koishore Roy

1
@KoishoreRoy 테스트 케이스 3을 변경하지 않고 6으로하지 않겠습니까?
wizzwizz4

@ wizzwizz4 | 1-2 | + | 2-3 | + | 3-4 | + | 4-1 | = 1 + 1 + 1 + 3 = 6. 당신이 올바른지. 편집했습니다.
Koishore Roy

답변:



20

파이썬 2 , 44 바이트

a,b,c,d=sorted(input())
print min(c-a,d-b)*2

온라인으로 사용해보십시오!

입력을 a,b,c,d,오름차순으로 정렬하고 c-aand 중 더 작은 값을 가져와 d-b두 배로 늘립니다. 왜 이것이 작동합니까?

먼저 요소를 총주기 거리의 총합으로 최대화 할 때와 같이 이웃과 동일하게 변경하는 것이 가장 17, -6, 15, 33 -> 17, 17, 15, 33좋습니다 (또는 최적을 위해 묶여 있음) . 왼쪽 및 오른쪽 순환 이웃에 대한 새로운 총 거리는 적어도 그 이웃 사이의 거리이므로,이를 동일하게 만드는 것이 우리가 할 수있는 최선입니다.

이제 숫자의 인접한 두 사본 중 하나를 삭제하면 동일한 주기적 거리 합이 제공됩니다. 이 예에서는 17, 15, 33거리를 지정 2 + 18 + 16합니다. 따라서 네 개의 숫자 중 하나를 바꾸는 대신 세 개의 숫자를 남기고 주기적 거리의 합을 사용하여 삭제하는 것과 같습니다.

숫자가 3 개인 경우 가장 큰 거리는 두 개의 작은 거리의 합입니다. 우리가하는 숫자를 정렬하면 때문이다 a ≤ b ≤ c다음 |a - c| = |a - b| + |b - c|. 다시 말해, 중간 숫자를 피트 스탑으로 한 번만 사용하여 가장 큰 숫자와 가장 작은 숫자를 두 번 이동합니다. 따라서 세 거리의 합은 최소와 최대 사이의 거리의 두 배에 불과합니다 (c-a)*2.

따라서 남은 3 개의 숫자 중 최소값과 최대 값 사이의 가장 작은 거리를 얻기 위해 어떤 숫자를 삭제하는지가 문제입니다. 분명히 가장 작은 숫자 또는 가장 큰 숫자를 삭제합니다. a, b, c, d정렬 된 순서로 호출하고 , a나뭇잎 d - b을 삭제 하고, d나뭇잎을 삭제 하면 c - a, 최종 결과는 더 작은 값의 두 배입니다.


테스트 케이스로 도와주세요. 매직 합계가 이미 0이고 달성 가능한 가장 낮은 수인 경우 어떻게해야합니까? 이 경우 대답은 0이어야합니까? 또는 다음으로 가장 낮은 숫자입니다. 입력이 [10,10,10,10] 인 경우, 매직 합은 0입니다. 가능한 두 번째로 가장 낮은 것은 2입니다. 의견을 보내주세요.
Koishore Roy

내가 당신이 말하는 것은 주어진 네 숫자의 순서를 무시할 수 있다는 것입니다 (첫 번째 단계는 그것들을 정렬하는 것입니다). 그러나 를 통해 5 개의 숫자 p1를 요청 p5했지만 여전히 하나의 숫자 만 변경할 수 있다면 어떨까요? 4 자리 숫자가 너무 쉬운 것 같습니다 (답을 본 후에 만).
Jeppe Stig Nielsen

@KoishoreRoy 하나를 허용하는 솔루션이 마음에 듭니다.
xnor

@JeppeStigNielsen 예, 순서가 중요하지 않다는 사실은 4 개의 숫자에 특별하며 1을 삭제하여 3 개의 숫자를 만든 후에는 모든 숫자 쌍이 주기적으로 인접하기 때문에 발생합니다. 다섯 개의 숫자를 사용하면 이것이 작동하지 않으며 (예를 찾을 수 있습니다) 도전은 매우 다릅니다.
xnor

내가 두 번 투표 할 수 있으면 좋겠다. 아름다운 관찰, 잘 설명했다.
요나

9

R , 66 33 바이트

function(x)2*min(diff(sort(x),2))

온라인으로 사용해보십시오!

xnor의 알고리즘으로 훨씬 짧습니다 (설명을 읽고 게시물을 올리십시오!).

구 버전:

R , 66 바이트

function(x,m=matrix(x,3,4))min(colSums(abs(diff(rbind(m,m[1,])))))

온라인으로 사용해보십시오!

입력을 4 개의 정수로 구성된 벡터로 취합니다.

2212|12|+|2|2=1.

변경할 번호를 선택하는 4 가지 방법이 있습니다. 이들 각각에 대해 3 가지 절대 차이의 합만 계산하면됩니다.

×4rbind


4

젤리 , 11 10 바이트

I;SASƲ$-ƤṂ

온라인으로 사용해보십시오!

정수가 입력 인 경우 목록을 가져 오는 모나드 링크입니다. 임의의 목록 크기에 적합합니다. 목록에서 각 숫자를 제거하고, 마법 합계를 계산하고 최소값을 취하여 테스트하여 최소 합계를 얻을 수 있음을 기반으로 작동합니다.


3

젤리 , 8 바이트

ṁ-Ƥ⁸IA§Ṃ

정수 목록을 허용하는 정수 링크 *

*가 1보다 많으면 임의의 숫자가 될 수 있습니다. 같은 스타일의 마법 공식을 사용하여 주변의 차이점을 요약합니다.

온라인으로 사용해보십시오!

방법?

ṁ-Ƥ⁸IA§Ṃ - Link: list of integers, X       e.g. [17,-6,15,33]
 -Ƥ      - for overlapping "outfixes" of length length(X)-1:
         -                                      [[-6,15,33],[17,15,33],[17,-6,33],[17,-6,15]]
ṁ  ⁸     -   mould like X                       [[-6,15,33,-6],[17,15,33,17],[17,-6,33,17],[17,-6,15,17]]
    I    - incremental differences              [[21,18,-39],[-2,18,-16],[-23,39,-16],[-23,21,2]]
     A   - absolute (vectorises)                [[21,18,39],[2,18,16],[23,39,16],[23,21,2]]
      §  - sums                                 [78,36,78,46]
       Ṃ - minimum                              36

3

Japt -Q , 11 바이트

ñÍó ®r- ÑÃn

@xnor의 알고리즘을 사용하여 4 바이트를 절약했습니다.

@Shaggy 덕분에 5 바이트 절약

시도 해봐


잘 작동하는 것 같지만 왜 작동하는지 설명해 주시겠습니까?
Koishore Roy

@KoishoreRoy 설명 추가
무지의 구현

29 바이트 (제 생각에 )
Shaggy

@Shaggy 답변을 업데이트했을 때 실수로 합계를지도로 대체하여 일부 골프는 유효하지 않지만 다른 골프는 유효합니다.
무지의 구현

멋지게 (더) 골프 :) ÃÃ줄 바꿈 으로 바꾸어 1 바이트를 더 절약 할 수 있습니다 .
Shaggy

3

J , 24 20 18 17 바이트

xnor 알고리즘을 사용하는 대체 버전 :

2*[:<./2 2-/@$\:~

방법

입력을 분류하여 형성된 2x2 행렬 의 첫 번째 행에서 두 번째 행 2 *의 최소값을 두 배로 [:<./뺀 값[:-/2 2$\:~

온라인으로 사용해보십시오!

원래 답변 : J , 24 바이트

[:<./1(1#.2|@-/\],{.)\.]

온라인으로 사용해보십시오!

Nick Kennedy의 아이디어를 사용합니다.

  • 1(...)\.] 길이 1의 모든 접두사에 괄호로 동사를 적용하십시오 (길이 n의 접두사는 n 개의 연속 된 요소가 제거 된 목록이므로 1m이 제거 된 모든 가능한 목록을 생성합니다)
  • (1 #. 2 |@-/\ ] , {.)이것은 입력에 첫 번째 elm을 추가하고 길이 2의 접두사에 ] , {.abs 차이 |@-/를 적용 2 ...\하고 결과를 합산하여 magic sum을 계산합니다 1 #..
  • [:<./ 분을 반환

2

05AB1E , 11 7 바이트

@xnor 포트 의 젤리 답변 . @Emigna@Grimy
덕분에 -4 바이트 .

{2ô`αß·

온라인으로 사용해보십시오.

레거시 버전 05AB1E에서만 작동하는 7 바이트 대안 ( 새 버전 에서는 이전 버전이 필요함 ¥) :

{2ôø¥W·

온라인으로 사용해보십시오.

설명:

{        # Sort the (implicit) input-list
         #  i.e. [17,-6,15,33] → [-6,15,17,33]
 2ô      # Split this list into parts of size 2
         #  → [[-6,15],[17,33]]
   `     # Push both separated to the stack
    α    # And take their absolute differences
         #  → [23,18]
     ß   # Pop and push the minimum
         #  → 18
      ·  # Double it (and output implicitly as result)
         #  → 36

{        # Sort the (implicit) input-list
         #  i.e. [17,-6,15,33] → [-6,15,17,33]
 2ô      # Split this list into parts of size 2
         #  → [[-6,15],[17,33]]
   ø     # Zip/transpose, swapping rows/columns
         #  → [[-6,17],[15,33]]
    ¥    # Get the deltas/forward differences of the inner lists
         #  → [[23],[18]]
     W   # Get the flattened minimum (without popping)
         #  → 18
      ·  # Double it (and output implicitly as result)
         #  → 36

1
레거시 : 7 바이트 {2ôø¥W·또는 다시 쓰기 : 8 바이트
Emigna

2
레거시가 아닌 7 바이트 :{2ô`αW·
Grimmy

@Emigna Smart, 감사합니다!
Kevin Cruijssen

@Grimy 감사합니다!
Kevin Cruijssen


0

, 20 바이트

I⌊EEθΦθ⁻κμΣEι↔⁻λ§ι⊕μ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. @NickKennedy의 아이디어를 사용하고 있습니다. 설명:

   Eθ                   Map over input array
     Φθ                 Filter over input array where
       ⁻κμ              Outer and inner indices differ
  E                     Map over resulting list of lists
           Eι           Map over remaining values in list
                §ι⊕μ    Get the next value in the list
             ↔⁻λ        Compute the absolute difference with the current value
          Σ             Take the sum of absolute differences
 ⌊                      Take the minimum sum
I                       Cast to string and implicitly print



0

자바 8 , 235 바이트

@xnor의 Python 응답 및 알고리즘 포트

import java.util.*;interface M{static void main(String[]A){Scanner I=new Scanner(System.in);int a[]={0,0,0,0};for(int i=0;i<4;a[i++]=I.nextInt());java.util.Arrays.sort(a);System.out.print(2*(a[2]-a[0]>a[3]-a[1]?a[3]-a[1]:a[2]-a[0]));}}

온라인으로 사용해보십시오!

입증되지 않은 Java 10 , 222 바이트

Java 10을 var사용하면 온라인으로 컴파일 할 수 없으므로 스캐너 선언의 왼쪽을로 대체 할 수 있어야 하므로 퀴즈로 추가 할 수 있습니다. 죄송합니다.

interface M{static void main(String[]A){var I=new java.util.Scanner(System.in);int a[]={0,0,0,0};for(int i=3;i<4;a[i++]=I.nextInt());java.util.Arrays.sort(a);System.out.print(2*(a[2]-a[0]>a[3]-a[1]?a[3]-a[1]:a[2]-a[0]));}}

1
AFAIK 당신은 다른 답변이했던 것처럼 제출물로 기능을 가질 수 있습니다. 주변 클래스, 인터페이스 등을 포함 할 필요가 없습니다.
Tau
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.