L'algoritmo di seam carving, o una versione più complessa di esso, viene utilizzato per il ridimensionamento delle immagini in base al contenuto in vari programmi e librerie grafiche. Giochiamo a golf!
Il tuo input sarà un array rettangolare bidimensionale di numeri interi.
L'output sarà lo stesso array, una colonna più stretta, con una voce rimossa da ogni riga, quelle voci che rappresentano un percorso dall'alto verso il basso con la somma più bassa di tutti questi percorsi.
https://en.wikipedia.org/wiki/Seam_carving
Nell'illustrazione sopra, il valore di ogni cella è mostrato in rosso. I numeri neri sono la somma del valore di una cella e il numero nero più basso in una delle tre celle sopra di essa (indicate dalle frecce verdi). I percorsi evidenziati bianchi sono i due percorsi di somma più bassi, entrambi con una somma di 5 (1 + 2 + 2 e 2 + 2 + 1).
Nel caso in cui ci siano due percorsi legati per la somma più bassa, non importa quale rimuovi.
L'input deve essere preso dallo stdin o come parametro di funzione. Può essere formattato in un modo conveniente per la tua lingua preferita, comprese parentesi e / o delimitatori. Si prega di specificare nella risposta come è previsto l'input.
L'output dovrebbe essere stdout in un formato delimitato in modo inequivocabile o come valore di ritorno di una funzione nella tua lingua equivalente a un array 2d (che potrebbe includere elenchi nidificati, ecc.).
Esempi:
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)
EDIT: I numeri saranno tutti non negativi e ogni possibile cucitura avrà una somma che si adatta a un intero con segno a 32 bit.