Biorąc pod uwagę sekwencję liczb, znajdź minimalną liczbę skoków, aby przejść od pozycji początkowej do końca i wrócić do pozycji początkowej.
Każdy element sekwencji oznacza maksymalną liczbę ruchów, które można przesunąć z tej pozycji.
W dowolnej pozycji możesz wykonać skok przy maks. K ruchach, gdzie k jest wartością zapisaną w tej pozycji. Po osiągnięciu końca możesz użyć tylko tych pozycji do skakania, które nie były wcześniej używane do skakania.
Dane wejściowe zostaną podane jako ciąg liczb oddzielonych pojedynczymi spacjami. Wyjście powinno być pojedynczą liczbą, która jest minimalną liczbą zastosowanych skoków. Jeśli nie można przejść do końca i wrócić do pozycji wyjściowej, wydrukuj -1
Wejście:
2 4 2 2 3 4 2 2
Wynik:
6 (3, aby dotrzeć do końca i 3, aby wrócić)
Wejście
1 0
Wynik
-1
Uwaga
- Załóż, że wszystkie liczby w sekwencji są nieujemne
EDYCJA 1
Wiersz „Zatem powinno być jasne, że zawsze można skoczyć z ostatniej pozycji”. może być mylące, więc usunąłem go z pytania. Nie będzie to miało wpływu na pytanie.
Zwycięskie kryteria:
Zwycięzcą zostanie ten z najkrótszym kodem.
źródło
Thus, it should be clear that one can always jump from the last position.
- czy nie1 0
jest kontrprzykład?Odpowiedzi:
APL (Dyalog), 116
Przypadki testowe
Podejście
Podejście to polega na wyszukiwaniu brutalnej siły za pomocą funkcji rekurencyjnej.
Zaczynając od pozycji 1, ustaw wartość w bieżącej pozycji na 0 i wygeneruj tablicę pozycji, do których można przeskoczyć z bieżącej pozycji. Przekaż nową pozycję i zmodyfikowaną tablicę do siebie. Przypadki podstawowe występują wtedy, gdy wartość w bieżącej pozycji wynosi 0 (nie można skoczyć) lub dochodzi do końca.
Następnie dla każdej wygenerowanej tablicy odwróć ją i wykonaj wyszukiwanie ponownie. Ponieważ pozycje skakania są ustawione na 0, nie możemy ponownie skakać z tego miejsca.
Dla tablic, które osiągnęliśmy do końca, znajdź te, które mają minimalną liczbę zer. Odejmując od niej liczbę zer w tablicy początkowej, podaje rzeczywistą liczbę wykonanych skoków.
źródło
Mathematica,
197193 znakówBrutalna siła.
źródło
Mathematica 351
[Uwaga: To nie jest jeszcze w pełni golfa; Ponadto dane wejściowe należy dostosować, aby pasowały do wymaganego formatu. I należy wprowadzić zasadę „nie skakać na tej samej pozycji dwa razy”. Istnieją również problemy z formatowaniem kodu, które wymagają rozwiązania. Ale to początek.]
Wykres składa się z węzłów odpowiadających każdej pozycji, tj. Każdej cyfrze wejściowej reprezentującej skok.
DirectedEdge[node1, node2]
oznacza, że możliwe jest przejście od węzła 1 do węzła 2. Najkrótsze ścieżki znajdują się od początku do końca, a następnie od końca do początku.Stosowanie
źródło
Python 304
Myślę, że to nowe podejście rozwiązuje (mam nadzieję!) Wszystkie problemy dotyczące przypadku [2,0] i podobne:
W tej wersji sekwencja wejściowa jest przechodzona (jeśli to możliwe) do końca, a następnie ponownie rozpoczynamy proces odwróconą sekwencją. Teraz możemy zagwarantować, że dla każdego poprawnego rozwiązania jeden ze skoków ląduje na ostatnim elemencie.
Oto wersje gry w golfa:
I kilka przykładów:
źródło
R - 195
Symulacja:
Gra w golfa:
źródło
Python 271
to jest moje rozwiązanie:
Przykłady:
A są to (częściowo do tej pory) wersje gry w golfa:
Kilka przykładów:
źródło
Rubin - 246
Symulacja:
źródło
Ruby - około 700 golfistów. Zacząłem grę w golfa z jednoznakowymi nazwami zmiennych i metod, ale po pewnym czasie bardziej zainteresowałem się algorytmem niż golfem, więc przestałem próbować optymalizować długość kodu. Nie martwiłem się też o ciąg wejściowy. Mój wysiłek jest poniżej.
Aby pomóc ci zrozumieć, jak to działa, zamieściłem komentarze pokazujące, w jaki sposób manipulowany jest określony ciąg (u = "2 1 4 3 0 3 4 4 3 5 0 3"). Wymieniam kombinacje „skał w strumieniu”, które można przeskoczyć. Są one reprezentowane przez ciąg binarny. W komentarzach podam przykład 0b0101101010 i pokazuję, jak by go wykorzystano. Te 1 odpowiadają pozycjom skał dostępnych podczas pierwszej podróży; zera dla podróży powrotnej. Do każdego takiego przydziału używam programowania dynamicznego, aby określić minimalną liczbę przeskoków wymaganych w każdym kierunku. Przeprowadzam również kilka prostych optymalizacji, aby wcześnie wyeliminować niektóre kombinacje.
Uruchomiłem go z ciągami podanymi w innych odpowiedziach i uzyskałem te same wyniki. Oto kilka innych wyników, które uzyskałem:
Chciałbym dowiedzieć się, czy inni uzyskają takie same wyniki dla tych ciągów. Wydajność jest dość dobra. Na przykład znalezienie rozwiązania dla tego ciągu zajęło mniej niż minutę:
„3 4 3 0 4 3 4 4 5 3 5 3 0 4 3 3 0 3 4 5 3 2 0 3 4 1 6 3 2 0 4 5 3 2 0 3 4 1 6 3 0 4 3 4 4 5 0 1”
Kod następuje.
źródło
Haskell,
173166 bajtów, 159 bajtów w GHCiOto normalna wersja:
importuj Data.List
Oto odpowiedź GHCi (wstaw wiersz po kolei):
Po prostu brutalna siła. Wygeneruj możliwą odpowiedź. (tj. permutacja [0..n-1] z pominiętym zerem i następującym po nim elementem. Następnie sprawdź, czy odpowiedź jest poprawna. Uzyskaj minimalną długość i dodaj jeden. (Ponieważ zera wiodące i końcowe zera są usuwane).
Jak używać:
j[3,4,0,0,6]
->3
źródło
Data.List.permutations
nie działa w GHC, ale tylko w GHCi. Zgodnie z naszym Przewodnikiem po regułach gry w golfa w Haskell należy dodać import lub oznaczyć odpowiedź jako „Haskell GHCi”. Pierwsza opcja jest ogólnie preferowana przez golfistów Haskell na tej stronie.a<-permutations[0..t l-1],let f=takeWhile(/=0)a
możesz pisaćf<-map(takeWhile(/=0))(permutations[0..t l-1])
, do którego można ponownie zagrać w golfaf<-fst.span(>0)<$>permutations[0..t l-1]
. Dzięki temu wrócisz do 166 bajtów, nawet dodając import: Wypróbuj online!