Algorytm rzeźbienia szwu lub jego bardziej złożona wersja służy do zmiany rozmiaru obrazu z uwzględnieniem treści w różnych programach graficznych i bibliotekach. Zagrajmy w golfa!
Twój wkład będzie prostokątną dwuwymiarową tablicą liczb całkowitych.
Twój wynik będzie tej samej tablicy, o jedną kolumnę węższą, z jednym wpisem usuwanym z każdego wiersza, przy czym te wpisy reprezentują ścieżkę od góry do dołu z najniższą sumą wszystkich takich ścieżek.
https://en.wikipedia.org/wiki/Seam_carving
Na powyższej ilustracji wartość każdej komórki jest pokazana na czerwono. Czarne liczby są sumą wartości komórki i najniższej czarnej liczby w jednej z trzech komórek powyżej (wskazanych przez zielone strzałki). Podświetlone na biało ścieżki to dwie ścieżki o najniższej sumie, obie o sumie 5 (1 + 2 + 2 i 2 + 2 + 1).
W przypadku, gdy dla najniższej sumy są powiązane dwie ścieżki, nie ma znaczenia, którą usuniesz.
Dane wejściowe należy pobierać ze standardowego wejścia lub jako parametr funkcji. Można go sformatować w sposób wygodny dla wybranego języka, w tym nawiasów i / lub ograniczników. Podaj w odpowiedzi, w jaki sposób oczekuje się danych wejściowych.
Dane wyjściowe powinny być ustawione na standardowe wyjście w jednoznacznie ograniczonym formacie lub jako funkcja zwracająca wartość w twoim języku równoważną tablicy 2d (która może zawierać zagnieżdżone listy itp.).
Przykłady:
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)
EDYCJA: Wszystkie liczby będą nieujemne, a każdy możliwy szew będzie miał sumę pasującą do 32-bitowej liczby całkowitej ze znakiem.
źródło
Odpowiedzi:
CJam,
5144 bajtówJest to anonimowa funkcja, która wyrzuca tablicę 2D ze stosu i wypycha jedną w zamian.
Wypróbuj przypadki testowe online w tłumaczu CJam . 1
Pomysł
To podejście iteruje wszystkie możliwe kombinacje elementów wierszy, odfiltrowuje te, które nie odpowiadają szwom, sortuje według odpowiedniej sumy, wybiera minimum i usuwa odpowiednie elementy z tablicy. 2)
Kod
1 Zauważ, że CJam nie potrafi rozróżnić pustych tablic od pustych łańcuchów, ponieważ łańcuchy są tylko tablicami, których elementami są znaki. Zatem reprezentacja ciągu zarówno pustych tablic, jak i pustych ciągów jest
""
.2 Podczas gdy złożoność czasowa algorytmu pokazanego na stronie Wikipedii powinna wynosić O (nm) dla macierzy n × m , ta ma przynajmniej O (m n ) .
źródło
{2ew::m2f/0-!},
Haskell, 187 bajtów
Przykład użycia:
Jak to działa, wersja skrócona: zbuduj listę wszystkich ścieżek (1), na ścieżkę: usuń odpowiednie elementy (2) i zsumuj wszystkie pozostałe elementy (3). Weź prostokąt z największą sumą (4).
Dłuższa wersja:
źródło
IDL 8.3, 307 bajtów
Meh, jestem pewien, że to nie wygra, ponieważ jest długie, ale oto proste rozwiązanie:
Nie golfowany:
Tworzymy iteracyjnie tablicę energii i śledzimy, w którym kierunku idzie szew, a następnie tworzymy listę usuwania, gdy znamy ostateczną pozycję. Usuń szew za pomocą indeksowania 1D, a następnie ponownie sformatuj w szyku z nowymi wymiarami.
źródło
[0:n]
; Jeśli to prawda, to jest łatwe do wymianyr+=[0:z[1]-1]*z[0]
zer+=indgen(z[1]-1)*z[0]
.JavaScript ( ES6 ) 197
209 215Implementacja algorytmu wikipedia krok po kroku.
Prawdopodobnie można go bardziej skrócić.
Przetestuj uruchomienie fragmentu w przeglądarce Firefox.
źródło
Pip, 91 bajtów
To nie wygra żadnych nagród, ale dobrze się nad tym bawiłem. Białe znaki mają wyłącznie charakter kosmetyczny i nie są uwzględniane w liczbie bajtów.
Ten kod definiuje anonimową funkcję, której argument i zwracana wartość są zagnieżdżonymi listami. Implementuje algorytm ze strony Wikipedii:
a
(argument) to liczby czerwone iz
liczby czarne.Oto wersja z szelkami testowymi:
Wyniki:
A oto z grubsza odpowiednik w Pythonie 3. Jeśli ktoś chce lepszego wyjaśnienia kodu Pip, po prostu zapytaj w komentarzach.
źródło