Зробіть мені мінімальну магічну суму


27

Тримання цього виклику недовго.

Вам надано 4 числа: p1, p2, p3 та p4.

Магічна сума чисел визначається так:

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, що є мінімальним досяжним значенням.

Майте на увазі, що числа можуть бути натуральними чи від’ємними цілими числами.

Це код-гольф, тому найменше байт у кодовій виграші. Окуляри брауні для використання практичної мови над мовою відпочинку. Нехай 4-й буде з вами.

Повторюю:

Зразок 1

Введення 1

17 -6 15 33

Вихід 1

36

Пояснення 1

-6 можна замінити 16, і це дає нам мінімально можливу можливу магічну суму.

Зразок 2

Введення 2

10 10 10 10

Вихід 2

0 or 2

або прийнятний

Пояснення 2

Мінімальна досяжна магічна сума дорівнює 0, оскільки мінімальна сума 4 позитивних цілих чисел дорівнює 0. Якщо число потрібно змінити, то одне з 10 можна змінити на 9 і, таким чином, отримати вихід 2.

Зразок 3

Введення 3

1 2 3 4

Вихід 3

4

Пояснення 3

Вхід сам по собі дає 6 як свою магічну суму. Зміна 4 на 1 і досягається мінімальна сума магії, яка дорівнює 4.


10
+1, але можна зробити більше прикладів.
Джонатан Аллан

2
Повністю відпрацьований приклад і ще кілька тестових випадків, і це +1від мене.
Кудлатий

@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

Python 2 , 44 байти

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

Спробуйте в Інтернеті!

Сорти вхід , як a,b,c,d,в порядку зростання, займає менший з c-aі 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.

Отже, питання в тому, яке число ми видалимо, щоб отримати найменшу відстань між мінімальним та максимумом із трьох чисел, що залишилися. Зрозуміло, що ми видаляємо або найменше, або найбільше з чисел. Називаючи їх a, b, c, dу відсортованому порядку, видаляючи aлистя d - bта видаляючи dлистя c - a, а кінцевий результат - подвійний, залежно від того, чи менше.


допоможіть мені з тестовим випадком тут. що робити, якщо магічна сума вже 0, що найменше досяжне число. у такому випадку відповідь повинна бути 0? або наступне найменше можливе число У випадку, коли вхід становить [10,10,10,10], магічна сума дорівнює 0. друга нижча можлива цифра 2. Дайте мені знати, що ви думаєте.
Koishore Roy

Я чую, як ви говорите, це те, що ви можете просто проігнорувати порядок чотирьох заданих чисел (ваш перший крок - їх сортування). Але що робити, якщо ми попросили п'ять чисел до p1кінця p5, і все ж дозволили змінити лише одне число? Справа з чотирма цифрами здається занадто простою (лише після того, як побачимо вашу відповідь).
Джеппе Стіг Нільсен

@KoishoreRoy Мені подобається ваше рішення щодо дозволу будь-якого.
xnor

@JeppeStigNielsen Так, те, що порядок не має значення, особливе для 4 чисел, і це відбувається тому, що після видалення одного, щоб зробити три числа, всі пари чисел циклично суміжні. З п'ятьма числами це не спрацює (ви, безумовно, можете знайти приклад), і завдання було б зовсім іншим.
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 цілих чисел.

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

Існує 4 способи вибору, яке число ми змінимо; для кожного з них нам потрібно обчислити лише суму 3 абсолютних різниць.

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 байти.

Збережено 5 байт завдяки @Shaggy

Спробуй це


здається, працює нормально, але ви б пояснили, чому це працює?
Koishore Roy

@KoishoreRoy Додав пояснення
Втілення

29 байтдумаю )
Shaggy

@Shaggy, коли я оновив свою відповідь, я випадково замінив суму картою, зробивши деякі гольфи недійсними, але інші - це добре
Втілення Незнання

Гарний (далі) гольф :) Ви можете зберегти ще 1 байт, замінивши ÃÃновий рядок.
Кудлатий

3

J , 24 20 18 17 байт

альтернативна версія з використанням алгоритму xnor:

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

як

Два рази 2 *мінуту [:<./2-го ряду віднімаємо від першого ряду [:-/матриці 2x2, утвореного формуванням2 2$ впорядкованого входу\:~

Спробуйте в Інтернеті!

оригінальна відповідь: J , 24 байти

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

Спробуйте в Інтернеті!

Використання ідеї Ніка Кеннеді.

  • 1(...)\.] застосувати дієслово в паренах до всіх інфіксів довжиною 1 (виписка довжиною n - це список з вилученими n суміжними елементами, тому це створює всі можливі списки з видаленим 1 в'язом)
  • (1 #. 2 |@-/\ ] , {.)це обчислює магічну суму, додаючи до входу перший в'яз ] , {.і застосовуючи різницю abs |@-/до інфікси довжиною 2 2 ...\та підсумовуючи результат 1 #..
  • [:<./ повертає хв

2

05AB1E , 11 7 байт

Порт @xnor «s Jelly відповідь .
-4 байти завдяки @Emigna та @Grimy .

{2ô`αß·

Спробуйте в Інтернеті.

Альтернатива 7 байтів, яка працює лише у застарілій версії 05AB1E (вимагатиме а до ¥нової версії):

{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 з переписати.
Емінья

2
7 байт у не спадщину:{2ô`αW·
Гриммі

@Emigna Smart, дякую!
Кевін Круїссен

@Grimy Дякую також!
Кевін Круїссен

1

C ++ (gcc)

повна програма: 138 байт

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

Спробуйте в Інтернеті!

основна функція: 84 байти

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

Спробуйте в Інтернеті!

Також за допомогою алгоритму xnor пояснив у своєму дописі Python 2.


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

JavaScript (ES6), 51 байт

Використання xnor набагато розумніший метод :

a=>([a,b,c,d]=a.sort((a,b)=>a-b),b+c<a+d?c-a:d-b)*2

Спробуйте в Інтернеті!


Оригінальна відповідь, 96 байт

Вводить введення як масив з 4 цілих чисел. Напевно, безумовно, не найкоротший підхід.

a=>a.map(m=x=>a.map((y,i)=>a[m=a.map(v=>s+=Math.abs(p-(p=v)),a[i]=x,p=a[3],s=0)|m<s?m:s,i]=y))|m

Спробуйте в Інтернеті!



0

Java 8 , 235 байт

Порт відповіді і алгоритму Python @ 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]));}}

Спробуйте в Інтернеті!

Java 10 , недоведений, 222 байти

З Java 10 я повинен мати можливість замінити ліву частину декларації Scanner на 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, ви можете просто функціонувати як подання, як, наприклад, як відповіли інші відповіді. Не потрібно включати навколишній клас, інтерфейс тощо
Тау
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.