Làm cho tôi một khoản tiền ma thuật tối thiểu


27

Giữ thử thách này ngắn.

Bạn được cho 4 số: p1, p2, p3 và p4.

Tổng số ma thuật của các số được xác định như sau:

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

Bạn chỉ được phép thay đổi một trong các giá trị nguyên ở trên (p1, p2, p3 hoặc p4). Bạn cần thay đổi giá trị sao cho tổng ma thuật của các giá trị đạt được giá trị tối thiểu của nó.

Ví dụ:

p1, p2, p3, p4 = 17, -6, 15, 33. Giá trị của tổng ma thuật là 78 ​​trong trường hợp này.

Bạn có thể thay đổi -6 ở đây thành 16 và giá trị của tổng ma thuật sẽ trở thành 36, đây là giá trị tối thiểu có thể đạt được.

Hãy nhớ rằng các số có thể là số nguyên dương hoặc âm.

Đây là mã golf, do đó, ít byte nhất trong mã thắng. Brownie chỉ cho việc sử dụng một ngôn ngữ thực tế trên một ngôn ngữ giải trí. Có thể thứ 4 được với bạn.

Để nhắc lại:

Mẫu 1

Đầu vào 1

17 -6 15 33

Đầu ra 1

36

Giải thích 1

-6 có thể được thay thế bằng 16 và điều đó cho chúng ta tổng ma thuật tối thiểu có thể đạt được.

Mẫu 2

Đầu vào 2

10 10 10 10

Đầu ra 2

0 or 2

hoặc là chấp nhận được

Giải thích 2

Tổng ma thuật tối thiểu có thể đạt được là 0 vì tổng tối thiểu của 4 số nguyên dương là 0. Nếu một số phải thay đổi, thì một trong 10 số có thể được thay đổi thành 9 và do đó thu được đầu ra 2.

Mẫu 3

Đầu vào 3

1 2 3 4

Đầu ra 3

4

Giải thích 3

Đầu vào tự nó mang lại 6 như tổng ma thuật của nó. Thay đổi 4 thành 1 và tổng ma thuật tối thiểu đạt được, là 4.


10
+1, nhưng có thể làm với nhiều ví dụ hơn.
Jonathan Allan

2
Một ví dụ hoạt động đầy đủ và một vài trường hợp thử nghiệm nữa và đó là +1từ tôi.
Xù xì

@Shaggy xong. +1 của tôi ở đâu? : P
Koishore Roy

1
@KoishoreRoy Sẽ không kiểm tra trường hợp 3 thành 6 mà không thay đổi?
wizzwizz4

@ wizzwizz4 | 1 - 2 | + | 2 - 3 | + | 3 - 4 | + | 4 - 1 | = 1 + 1 + 1 + 3 = 6. Bạn nói đúng. Thực hiện chỉnh sửa.
Koishore Roy

Câu trả lời:



20

Python 2 , 44 byte

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

Hãy thử trực tuyến!

Sắp xếp các đầu vào như a,b,c,d,thứ tự tăng dần, lấy nhỏ hơn c-ad-b, và tăng gấp đôi nó. Tại sao điều này làm việc?

Đầu tiên, lưu ý rằng khi chúng ta thay đổi một yếu tố để tối đa hóa thành tổng khoảng cách theo chu kỳ, thì nó tối ưu (hoặc được gắn cho tối ưu) để thay đổi nó thành một hàng xóm, chẳng hạn như 17, -6, 15, 33 -> 17, 17, 15, 33. Đó là bởi vì tổng khoảng cách mới của nó với các hàng xóm tuần hoàn bên trái và bên phải của nó ít nhất là khoảng cách giữa các hàng xóm đó, vì vậy làm cho chúng bằng nhau là điều tốt nhất chúng ta có thể làm.

Bây giờ, xóa một trong hai bản sao liền kề của một số sẽ cho cùng một khoảng cách theo chu kỳ. Trong ví dụ, đây là 17, 15, 33, đưa ra khoảng cách 2 + 18 + 16. Vì vậy, thay vì thay thế một trong bốn số, nó tương đương với việc chỉ xóa nó để lại ba số và sử dụng tổng khoảng cách theo chu kỳ của chúng.

Lưu ý rằng với 3 số, khoảng cách lớn nhất là tổng của hai số nhỏ hơn. Điều này là bởi vì nếu chúng ta sắp xếp các số để có a ≤ b ≤ c, sau đó |a - c| = |a - b| + |b - c|. Nói cách khác, chúng ta di chuyển giữa số lớn nhất và số nhỏ nhất hai lần, sử dụng số trung bình làm điểm dừng một trong những lần. Vì vậy, tổng của ba khoảng cách chỉ bằng hai lần khoảng cách giữa tối thiểu và tối đa, vì vậy (c-a)*2.

Vì vậy, câu hỏi là số nào chúng ta xóa để có khoảng cách nhỏ nhất giữa tối thiểu và tối đa của ba số còn lại. Rõ ràng chúng ta xóa số nhỏ nhất hoặc lớn nhất trong các số. Gọi chúng a, b, c, dtheo thứ tự được sắp xếp, xóa ad - bvà xóa dc - a, và kết quả cuối cùng là gấp đôi cái nào nhỏ hơn.


giúp tôi với một trường hợp thử nghiệm ở đây. Điều gì xảy ra nếu tổng ma thuật đã là 0, con số thấp nhất có thể đạt được. trong trường hợp đó, câu trả lời có nên là 0 không? hoặc số thấp nhất tiếp theo có thể. Trong trường hợp đầu vào là [10,10,10,10], tổng ma thuật là 0. mức thấp thứ hai có thể là 2. Hãy cho tôi biết bạn nghĩ gì.
Koishore Roy

Những gì tôi nghe bạn nói, là bạn có thể bỏ qua thứ tự của bốn số đã cho (bước đầu tiên của bạn là sắp xếp chúng). Nhưng điều gì sẽ xảy ra nếu chúng ta đã yêu cầu năm số p1thông qua p5và vẫn chỉ cho phép thay đổi một số? Trường hợp bốn số có vẻ quá dễ dàng (chỉ sau khi nhìn thấy câu trả lời của bạn).
Jeppe Stig Nielsen

@KoishoreRoy Tôi thích giải pháp của bạn là cho phép một trong hai.
xnor

@JeppeStigNielsen Có, thực tế là thứ tự không quan trọng đối với 4 số và điều đó xảy ra bởi vì sau khi xóa một để tạo ba số, tất cả các cặp số đều liền kề nhau. Với năm con số này sẽ không hoạt động (bạn chắc chắn có thể tìm thấy một ví dụ) và thử thách sẽ rất khác.
xnor

Ước gì tôi có thể upvote hai lần. Quan sát đẹp, giải thích tốt.
Giô-na

9

R , 66 33 byte

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

Hãy thử trực tuyến!

Ngắn hơn nhiều với thuật toán của xnor (hãy đọc phần giải thích của họ và nâng cấp bài đăng của họ!).

Phiên bản cũ:

R , 66 byte

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

Hãy thử trực tuyến!

Lấy đầu vào là một vectơ gồm 4 số nguyên.

p2p2p1p2p3|p1p2|+|p2p3|p2=p1.

Có 4 cách chọn số chúng tôi thay đổi; đối với mỗi trường hợp này, chúng ta chỉ phải tính tổng 3 điểm khác biệt tuyệt đối.

3×4rbind


4

Thạch , 11 10 byte

I;SASƲ$-ƤṂ

Hãy thử trực tuyến!

Một liên kết đơn âm có một danh sách nếu số nguyên làm đầu vào. Nên làm việc cho kích thước danh sách tùy ý. Hoạt động trên cơ sở số tiền tối thiểu có thể đạt được bằng cách kiểm tra loại bỏ từng số khỏi danh sách, tính toán tổng ma thuật và lấy mức tối thiểu.


3

Thạch , 8 byte

ṁ-Ƥ⁸IA§Ṃ

Liên kết đơn âm chấp nhận danh sách các số nguyên * mang lại số nguyên

* có thể là bất kỳ số nào miễn là có nhiều hơn 1; sử dụng cùng một công thức ma thuật tổng hợp sự khác biệt của hàng xóm xung quanh.

Hãy thử trực tuyến!

Làm sao?

ṁ-Ƥ⁸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 byte

ñÍó ®r- ÑÃn

Sử dụng thuật toán của @ xnor, giúp tôi tiết kiệm được 4 byte.

Đã lưu 5 byte nhờ @Shaggy

Thử nó


dường như đang hoạt động tốt, nhưng bạn sẽ giải thích tại sao điều này hoạt động?
Koishore Roy

@KoishoreRoy Đã thêm một lời giải thích
Hiện thân của sự thiếu hiểu biết

29 byte (tôi nghĩ )
Shaggy

@Shaggy khi tôi cập nhật câu trả lời của mình, tôi đã vô tình thay thế sum bằng bản đồ, khiến một số golf không hợp lệ, nhưng một số khác thì tốt
Hiện thân của sự thiếu hiểu biết vào

Chơi gôn một cách độc đáo :) Bạn có thể tiết kiệm thêm 1 byte bằng cách thay thế ÃÃbằng một dòng mới.
Xù xì

3

J , 24 20 18 17 byte

phiên bản thay thế sử dụng thuật toán xnor:

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

làm sao

Hai lần 2 *tối thiểu của [:<./hàng thứ 2 được trừ từ hàng đầu tiên [:-/của ma trận 2x2 được hình thành bằng cách định hình 2 2$đầu vào được sắp xếp xuống\:~

Hãy thử trực tuyến!

câu trả lời gốc: J , 24 byte

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

Hãy thử trực tuyến!

Sử dụng ý tưởng của Nick Kennedy.

  • 1(...)\.] áp dụng động từ trong parens cho tất cả các tiền tố có độ dài 1 (một tiền tố có độ dài n là một danh sách với n phần tử tiếp giáp được loại bỏ, do đó, điều này tạo ra mọi danh sách có thể bị xóa 1 elm)
  • (1 #. 2 |@-/\ ] , {.)cái này tính toán tổng ma thuật bằng cách nối thêm cây du đầu tiên vào đầu vào ] , {.và áp dụng chênh lệch abs |@-/cho các phần tử có độ dài 2 2 ...\và tính tổng kết quả 1 #..
  • [:<./ trả về phút

2

05AB1E , 11 7 byte

Cổng của câu trả lời Jelly của @xnor .
-4 byte nhờ @Emigna@Grimy .

{2ô`αß·

Hãy thử trực tuyến.

7 byte thay thế chỉ hoạt động trong phiên bản kế thừa của 05AB1E (sẽ yêu cầu trước ¥phiên bản mới):

{2ôø¥W·

Hãy thử trực tuyến.

Giải trình:

{        # 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 byte trong di sản: {2ôø¥W·hoặc 8 với ghi lại.
Emigna

2
7 byte không phải là di sản:{2ô`αW·
Grimmy

@Emigna Thông minh, cảm ơn!
Kevin Cruijssen

@Grimy Cảm ơn là tốt!
Kevin Cruijssen

1

C ++ (gcc)

chương trình đầy đủ: 138 byte

#include<iostream>
#include<regex>
using namespace std;int main(){int a[4];for(int&b:a)cin>>b;sort(a,a+4);cout<<min(a[2]-*a,a[3]-a[1])*2;}

Hãy thử trực tuyến!

chức năng cốt lõi: 84 byte

#include<regex>
int m(int*a){std::sort(a,a+4);return std::min(a[2]-*a,a[3]-a[1])*2;}

Hãy thử trực tuyến!

Cũng sử dụng thuật toán xnor giải thích trong bài viết Python 2 của mình.


0

Than , 20 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Hóa ra tôi đang sử dụng ý tưởng của @ NickKennedy. Giải trình:

   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

Java 8 , 235 byte

Một cổng của câu trả lời và thuật toán Python của @ xnor

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

Hãy thử trực tuyến!

Java 10 , chưa được chứng minh, 222 byte

Với Java 10, tôi sẽ có thể thay thế bên trái của khai báo Scanner var, mặc dù tôi không thể biên dịch nó trực tuyến và do đó tôi chỉ có thể thêm nó dưới dạng một câu đố. Lấy làm tiếc.

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 bạn chỉ có thể có một chức năng như trình của bạn, giống như cách các câu trả lời khác đã làm. Không cần bao gồm các lớp xung quanh, giao diện, v.v.
Tàu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.