Алгоритм вырезания шва или его более сложная версия используется для изменения размера изображения с учетом содержимого в различных графических программах и библиотеках. Давай в гольф это!
Ваш ввод будет прямоугольным двумерным массивом целых чисел.
В результате вы получите тот же массив, на один столбец уже, с одной записью, удаленной из каждой строки, причем эти записи представляют путь сверху вниз с наименьшей суммой всех таких путей.
https://en.wikipedia.org/wiki/Seam_carving
На приведенном выше рисунке значение каждой ячейки показано красным. Черные числа являются суммой значения ячейки и самого низкого черного числа в одной из трех ячеек над ней (на которые указывают зеленые стрелки). Белые выделенные пути - это два пути с наименьшей суммой, оба с суммой 5 (1 + 2 + 2 и 2 + 2 + 1).
В случае, когда для наименьшей суммы связаны два пути, не имеет значения, какой из них вы удалите.
Ввод должен быть взят из стандартного ввода или в качестве параметра функции. Он может быть отформатирован удобным для вас языком, включая скобки и / или разделители. Пожалуйста, укажите в своем ответе, как ожидается ввод данных.
Вывод должен быть в стандартный вывод в формате с разделителями или в виде возвращаемого функцией значения в вашем языке, эквивалентном массиву 2d (который может включать в себя вложенные списки и т. Д.).
Примеры:
Input:
1 4 3 5 2
3 2 5 2 3
5 2 4 2 1
Output:
4 3 5 2 1 4 3 5
3 5 2 3 or 3 2 5 3
5 4 2 1 5 2 4 2
Input:
1 2 3 4 5
Output:
2 3 4 5
Input:
1
2
3
Output:
(empty, null, a sentinel non-array value, a 0x3 array, or similar)
РЕДАКТИРОВАТЬ: все числа будут неотрицательными, и каждый возможный шов будет иметь сумму, которая вписывается в 32-разрядное целое число со знаком.
Ответы:
CJam,
5144 байтаЭто анонимная функция, которая извлекает двумерный массив из стека и возвращает его в ответ.
Попробуйте тестовые примеры онлайн в интерпретаторе CJam . 1
идея
Этот подход перебирает все возможные комбинации элементов строки, отфильтровывает те, которые не соответствуют швам, сортирует по соответствующей сумме, выбирает минимум и удаляет соответствующие элементы из массива. 2
Код
1 Обратите внимание, что CJam не может различить пустые массивы и пустые строки, поскольку строки - это просто массивы, элементы которых являются символами. Таким образом, строковое представление как пустых массивов, так и пустых строк равно
""
.2 В то время как временная сложность алгоритма, показанного на странице Википедии, должна составлять O (нм) для матрицы n × m , эта величина должна быть не менее O (m n ) .
источник
{2ew::m2f/0-!},
Haskell, 187 байт
Пример использования:
Как это работает, короткая версия: создайте список всех путей (1), для каждого пути: удалите соответствующие элементы (2) и суммируйте все оставшиеся элементы (3). Возьмите прямоугольник с наибольшей суммой (4).
Более длинная версия:
источник
IDL 8,3, 307 байт
Мех, я уверен, что это не победит, потому что это долго, но вот простое решение:
Ungolfed:
Мы итеративно создаем энергетический массив и отслеживаем, в каком направлении идет шов, затем строим список удаления, как только мы узнаем окончательную позицию. Удалите шов с помощью 1D-индексации, затем верните обратно в массив с новыми измерениями.
источник
[0:n]
; если это правда, то это легко заменитьr+=[0:z[1]-1]*z[0]
сr+=indgen(z[1]-1)*z[0]
.JavaScript ( ES6 ) 197
209 215Пошаговая реализация алгоритма википедии.
Вероятно, можно сократить больше.
Попробуйте запустить фрагмент в Firefox.
источник
Пип, 91 байт
Это не принесет никаких призов, но мне было весело работать над этим. Пробелы предназначены только для косметических целей и не включены в число байтов.
Этот код определяет анонимную функцию, аргумент и возвращаемое значение которой являются вложенными списками. Он реализует алгоритм со страницы Википедии:
a
(аргумент) - это красные цифры, аz
это черные цифры.Вот версия с тестовым комплектом:
Результаты:
И вот грубый эквивалент в Python 3. Если кто-то хочет лучшего объяснения кода Pip, просто спросите в комментариях.
источник