Cluck cluck. Nikt nie wie, dlaczego kurczak przeszedł przez ulicę, może po drugiej stronie był dobrze wyglądający kogut. Ale możemy dowiedzieć się, jak to zrobić. Napisz program, który od lewej do prawej przecina tę (lub dowolną) „drogę”.
1356 | 1738
3822 | 1424
3527 3718
9809 | 5926
0261 | 1947
7188 4717
6624 | 9836
4055 | 9164
2636 4927
5926 | 1964
3144 | 8254
Twój program „przecina” go, przesuwając od lewej do prawej. Zaczynasz od dowolnej liczby w lewej kolumnie, którą lubisz. Stamtąd możesz przejść do dowolnej sąsiedniej postaci po prawej stronie. Jeśli zacząłeś w lewym górnym rogu, 1, możesz przejść do 3 lub 8. Każdy numer, do którego się wybierasz, w tym numer początkowy, jest dodawany do sumy. Miejsca nie dodają się do twojej sumy. „|” zmusza cię do poruszania się w górę lub w dół, a nie gdzieś po prawej stronie. (NIE MOŻESZ przejść do tej postaci) Twoim celem jest przejście na drugą stronę z możliwie najmniejszą sumą. Twój program musi wydrukować sumę na końcu i musi być w stanie rozwiązać każdą drogę. Najlepiej może mieć również wkład w drogę, ale nie jest to wymagane. Twój program musi wydrukować zarówno ścieżkę, jak i sumę. Wygrywa najmniej bajtów kodu.
Aby to wyjaśnić, możesz poruszać się diagnostycznie, chyba że jesteś na pionowym pasku. Możesz poruszać się w górę iw dół tylko wtedy, gdy jesteś na pionowym pasku.
Aby uzyskać jaśniejszą specyfikację dróg, jest to w zasadzie ciąg tekstowy (lub tablica kolumn lub wierszy, jeśli wolisz myśleć w ten sposób) zgodny z regułami znaków i nie może być nic, ALE te znaki w droga. Może być dowolna liczba, spacja, kreska („|”) lub nowa linia. Jeśli pijany facet wybrukował drogę, jak w odpowiedzi ProgrammerDan, nadal jest to droga ważna, a Twój program musi być w stanie rozwiązać taką drogę. Droga nie jest uważana za drogę, jeśli nie można przedostać się na drugą stronę (na przykład nie ma wyjścia z prostej linii pasków).
Twój program nie jest wymagany do ustalenia, czy droga jest nieważna.
Klucz:
Dowolna liczba - dodaje liczbę do sumy, przejdź do przodu.
Spacja - idź naprzód, nic nie zostanie dodane do twojej sumy.
„|” - Przesuń w górę lub w dół, nic nie jest dodawane do twojej sumy.
EDYCJA: Przykładowe rozwiązanie, zgodnie z sugestią. Nie mogę zrobić strasznie dużego, nie mogę dostać IDE, aby rozwiązać dla mnie bankomat.
Jedź tą małą drogą:
9191 | 8282
1919 | 2727
5555 5555
Rozwiązaniem byłoby ścieżka 1, 1, 1, 1, spacja, dzielnik, dzielnik, spacja, spacja, 2, 2, 2, 2, w sumie 12.
EDYCJA 2: Rozwiązanie pierwszej drogi w tym pytaniu, określone przez programy Geobitów i ludów, wynosi 0,2,0,1,,, 1,4,1,4 dla sumy 13.
źródło
|
z rzędu?0,2,0,1, , , ,1,4,1,4 -> 13
Odpowiedzi:
Pyth,
168143141 bajtów [teraz kompatybilny z Drunken Road]Mój przypadek testowy działa, ale z powodu nieporozumień z mojej strony nie będzie działał poprawnie z początkowym przykładem. Pracuję nad naprawą.Teraz działa na oryginalny przykład i pijane drogi
Niektóre
NAPRAWDĘnieco mniej brzydkikod:Przetestuj tutaj
Przetestowałem to na drodze 10 + 9 x 40.
źródło
Java, 955 bajtów
Oczywiście nie zamierzam wygrywać żadnych nagród, będąc Javą i wszystkim, ale uwielbiam ten problem i chciałem wrzucić własne zgłoszenie.
Funkcje i ograniczenia:
Ok, wystarczy jibba jabba. Wersja golfowa:
Zgodnie z moim zwyczajem github z nie golfowym kodem .
Rozwiązanie dla „pierwszej” drogi:
Drugi przykład:
Próbka Briana Tucka:
Przykład „Drunkified” Briana:
Wizualizowane rozwiązanie:
Cieszyć się!
Edycja: Teraz się popisuję (dwie drogi łączą się! Czy da radę?)
Rozwiązanie:
(premia: ścieżka od nie golfa):
Szczegóły dotyczące algorytmu
Poproszono o pełniejsze wyjaśnienie zastosowanej przeze mnie techniki programowania dynamicznego, więc oto:
Korzystam z metody mark-and-pre-compute. Ma właściwe imię, ale już dawno o nim zapomniałem; może ktoś inny może to zaoferować?
Algorytm:
Uwagi:
Otóż to. Raz skanujemy od góry do dołu, od prawej do lewej; jedynymi komórkami dotkniętymi (potencjalnie) więcej niż jeden raz są rury, jednak każda rura jest „rozwiązana” tylko raz, pozostawiając nas w naszym oknie O (m * n).
Aby obsłużyć „nieparzyste” rozmiary map, postanowiłem po prostu wstępnie przeskanować i znormalizować długości wierszy, wypełniając je znakami zerowymi. Znaki zerowe liczą się jako ruchy „zero kosztów” tak samo jak rury i spacje. Następnie, drukując rozwiązanie, przestaję drukować koszty lub przesuwać się, gdy zostanie osiągnięta krawędź znormalizowanej drogi lub znak zerowy.
Piękno tego algorytmu jest bardzo proste, stosuje te same reguły do każdej komórki, tworząc pełne rozwiązanie, rozwiązując podproblemy O (m * n), a pod względem szybkości jest dość szybki. Wymienia pamięć, tworząc skutecznie dwie kopie w pamięci mapy drogi, pierwsza przechowująca dane „najlepszego kosztu”, a druga przechowująca dane „najlepszego ruchu” na komórkę; jest to typowe dla programowania dynamicznego.
źródło
c
jako-1>>>1
.