Удерживая эту задачу короткой.
Вам дают 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.
источник
+1
от меня.Ответы:
Желе , 6 байт
Попробуйте онлайн!
Порт моего Python ответа .
источник
Python 2 , 44 байта
Попробуйте онлайн!
Сортирует входные данные
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
, конечный результат будет двойным, в зависимости от того, что меньше.источник
p1
черезp5
, и до сих пор разрешено только изменяя один номер? Случай с четырьмя числами кажется слишком простым (только после просмотра вашего ответа).R ,
6633 байтаПопробуйте онлайн!
Гораздо короче с алгоритмом xnor (прочитайте их объяснение и оставьте комментарий!).
Старая версия:
R , 66 байт
Попробуйте онлайн!
Принимает ввод как вектор из 4 целых чисел.
Есть 4 способа выбора номера, который мы меняем; для каждого из них нам нужно только вычислить сумму 3 абсолютных разностей.
rbind
источник
Желе ,
1110 байтПопробуйте онлайн!
Монадическая ссылка, которая принимает список, если целые числа в качестве входных данных. Должен работать для произвольного размера списка. Работает на основе того, что минимальную сумму можно получить, протестировав удаление каждого числа из списка, вычисление магической суммы и взятие минимальной суммы.
источник
Желе , 8 байт
Монадическая ссылка, принимающая список целых чисел *, которая дает целое число
* может быть любым числом, если их больше 1; используя магическую формулу того же стиля, суммируя различия между соседями.
Попробуйте онлайн!
Как?
источник
Japt
-Q
, 11 байтИспользует алгоритм @ xnor, который сэкономил мне 4 байта.
Сохранено 5 байтов благодаря @Shaggy
Попытайся
источник
ÃÃ
новой строки.J ,
24201817 байтальтернативная версия с использованием алгоритма xnor:
как
Два раза
2 *
мин 2[:<./
-й строки вычитается из первой строки[:-/
матрицы 2x2, сформированной путем формирования2 2$
отсортированного ввода\:~
Попробуйте онлайн!
оригинальный ответ: J , 24 байта
Попробуйте онлайн!
Используя идею Ника Кеннеди.
1(...)\.]
Примените глагол в скобках ко всем приставкам длины 1 (приставка длины n - это список с удаленными n смежными элементами, так что получается каждый возможный список с удаленным 1 вязом)(1 #. 2 |@-/\ ] , {.)
это вычисляет волшебную сумму, добавляя первый вяз к входным данным] , {.
и применяя разницу абс|@-/
к инфиксам длины 22 ...\
, и суммируя результат1 #.
.[:<./
возвращает министочник
05AB1E ,
117 байтПорт @xnor 's Jelly ответа .
-4 байта благодаря @Emigna и @Grimy .
Попробуйте онлайн.
7- байтовая альтернатива, которая работает только в устаревшей версии 05AB1E (потребует
€
до¥
в новой версии):Попробуйте онлайн.
Объяснение:
источник
{2ôø¥W·
или 8 с€
в перезаписи.{2ô`αW·
C ++ (gcc)
полная программа: 138 байт
Попробуйте онлайн!
основная функция: 84 байта
Попробуйте онлайн!
Также используется алгоритм xnor, описанный в его посте Python 2.
источник
Древесный уголь , 20 байтов
Попробуйте онлайн! Ссылка на подробную версию кода. Оказывается, я использую идею @ NickKennedy. Объяснение:
источник
JavaScript (ES6), 51 байт
Используя намного более умный метод xnor :
Попробуйте онлайн!
Оригинальный ответ, 96 байт
Принимает ввод как массив из 4 целых чисел.
Наверное,определенно не самый короткий подход.Попробуйте онлайн!
источник
Wolfram Language (Mathematica) , 29 байт
Порт алгоритма @ xnor
Попробуйте онлайн!
источник
Java 8 , 235 байт
Порт @Xnor's Python ответа и алгоритма
Попробуйте онлайн!
Java 10 , бездоказательный, 222 байта
С Java 10 я смог бы заменить левую часть объявления Scanner
var
, хотя я не смог скомпилировать ее онлайн и, таким образом, я могу добавить ее только как пустяки. Сожалею.источник