El algoritmo de tallado de costura, o una versión más compleja del mismo, se utiliza para cambiar el tamaño de la imagen con contenido en varios programas gráficos y bibliotecas. ¡Vamos a jugar golf!
Su entrada será una matriz rectangular de dos números enteros.
Su salida será la misma matriz, una columna más estrecha, con una entrada eliminada de cada fila, esas entradas representan una ruta de arriba a abajo con la suma más baja de todas esas rutas.
https://en.wikipedia.org/wiki/Seam_carving
En la ilustración anterior, el valor de cada celda se muestra en rojo. Los números negros son la suma del valor de una celda y el número negro más bajo en una de las tres celdas encima (señalado por las flechas verdes). Las rutas resaltadas en blanco son las dos rutas de suma más baja, ambas con una suma de 5 (1 + 2 + 2 y 2 + 2 + 1).
En un caso donde hay dos caminos atados para la suma más baja, no importa cuál elimines.
La entrada debe tomarse de stdin o como un parámetro de función. Se puede formatear de una manera conveniente para el idioma de su elección, incluidos los corchetes y / o delimitadores. Especifique en su respuesta cómo se espera la entrada.
La salida debe ser stdout en un formato delimitado sin ambigüedades, o como un valor de retorno de función en el equivalente de su idioma a una matriz 2d (que puede incluir listas anidadas, etc.).
Ejemplos:
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)
EDITAR: todos los números no serán negativos, y cada costura posible tendrá una suma que se ajuste a un entero de 32 bits con signo.
fuente
Respuestas:
CJam,
5144 bytesEsta es una función anónima que saca una matriz 2D de la pila y empuja una a cambio.
Pruebe los casos de prueba en línea en el intérprete de CJam . 1
Idea
Este enfoque itera sobre todas las combinaciones posibles de elementos de fila, filtra aquellas que no corresponden a costuras, ordena por la suma correspondiente, selecciona el mínimo y elimina los elementos correspondientes de la matriz. 2
Código
1 Tenga en cuenta que CJam no puede distinguir entre matrices vacías y cadenas vacías, ya que las cadenas son solo matrices cuyos elementos son caracteres. Por lo tanto, la representación de cadena de las matrices vacías y las cadenas vacías es
""
.2 Si bien la complejidad temporal del algoritmo que se muestra en la página de Wikipedia debe ser de O (nm) para una matriz n × m , esta es al menos de O (m n ) .
fuente
{2ew::m2f/0-!},
Haskell, 187 bytes
Ejemplo de uso:
Cómo funciona, versión corta: construya una lista de todas las rutas (1), por ruta: elimine los elementos correspondientes (2) y sume todos los elementos restantes (3). Tome el rectángulo con la suma más grande (4).
Versión más larga:
fuente
IDL 8.3, 307 bytes
Meh, estoy seguro de que esto no ganará porque es largo, pero aquí hay una solución sencilla:
Sin golf:
Creamos iterativamente la matriz de energía y rastreamos en qué dirección va la costura, luego construimos una lista de eliminación una vez que conocemos la posición final. Retire la costura a través de la indexación 1D, luego vuelva a reformar en la matriz con las nuevas dimensiones.
fuente
[0:n]
; si eso es cierto, entonces es fácil de reemplazarr+=[0:z[1]-1]*z[0]
conr+=indgen(z[1]-1)*z[0]
.JavaScript ( ES6 ) 197
209 215Implementación paso a paso del algoritmo wikipedia.
Probablemente se puede acortar más.
Prueba a ejecutar el fragmento en Firefox.
fuente
Pip, 91 bytes
Esto no ganará ningún premio, pero me divertí trabajando en ello. El espacio en blanco es solo por razones estéticas y no está incluido en el recuento de bytes.
Este código define una función anónima cuyo argumento y valor de retorno son listas anidadas. Implementa el algoritmo de la página de Wikipedia:
a
(el argumento) son los números rojos yz
son los números negros.Aquí hay una versión con arnés de prueba:
Resultados:
Y aquí está el equivalente aproximado en Python 3. Si alguien quiere una mejor explicación del código Pip, solo pregunte en los comentarios.
fuente