Jesteś przedsiębiorcą kolejowym w XIX-wiecznych Stanach Zjednoczonych, kiedy pociągi stają się popularne, ponieważ są najbardziej wydajnym środkiem transportu dużych ilości materiałów drogą lądową. Krajowe zapotrzebowanie na tory kolejowe ze wschodniego wybrzeża przez niektóre niedawno skolonizowane ziemie na zachodzie.
Aby zaspokoić tę potrzebę, rząd USA zamierza nałożyć podatek na subsydiowanie kolei. Obiecali, że zapłacą pieniądze twojej firmie kolejowej za każdą przejechaną trasę. Ponieważ układanie torów w pagórkowatych i górzystych regionach jest droższe niż układanie torów na płaskich terenach, dostosowują odpowiednio kwotę, którą dają. Oznacza to, że rząd zapłaci
- 5000 USD za milę toru ułożonego na płaskiej ziemi
- 12 500 $ za milę toru położonego na pagórkowatym terenie
- 20 000 $ za milę toru położonego w górach.
Oczywiście ten plan nie odzwierciedla dokładnie, ile faktycznie kosztuje układanie torów.
Zatrudniłeś niektórych kartografów, aby narysowali mapy reliefowe regionów, w których będziesz układał ścieżki do analizy wysokości. Oto jedna taka mapa:
S12321
121234
348E96
Każda cyfra reprezentuje jedną milę kwadratową ziemi. S
jest punktem początkowym, E
jest punktem końcowym. Każda liczba reprezentuje intensywność zmian wysokości w tym regionie.
- Grunty o numerach 1-3 stanowią grunty płaskie.
- Grunty o numerach 4-6 stanowią tereny pagórkowate.
- Teren o numerach 7-9 stanowi pasmo górskie.
Przez lata doświadczeń w budowaniu torów kolejowych oceniłeś, że koszt budowy torów (w dolarach) spełnia tę formułę:
Cost_Per_Mile = 5000 + (1500 * (Elevation_Rating - 1))
Oznacza to, że budowanie na określonych wzniesieniach będzie cię kosztować więcej niż daje rząd, czasem będzie to opłacalne, a czasem po prostu osiągniesz próg rentowności.
Na przykład mila toru na wzniesieniu wynoszącym 3 kosztuje 8 000 USD, ale dostajesz tylko 5000 USD, więc tracisz 3000 USD. Z kolei budowanie mili toru na wzniesieniu 7 kosztuje 14 000 USD, ale dostajesz za to 20 000 USD: zysk 6000 USD!
Oto przykładowa mapa, a także dwie różne możliwe ścieżki.
S29 S#9 S##
134 1#4 1##
28E 2#E 2#E
Pierwszy utwór kosztuje 30 000 USD, ale rząd płaci za niego 30 000 USD. Nie zarabiasz na tym utworze.
Z drugiej strony drugi koszt kosztuje 56 500 USD, ale dostajesz za niego 62 500 USD. Zyskujesz 6000 $ z tego utworu.
Twój cel: mając mapę ulgi, znajdź najbardziej opłacalną (a może tylko najtańszą) ścieżkę od początku do końca. Jeśli łączy się wiele ścieżek, każda z nich jest akceptowalnym rozwiązaniem.
Szczegóły programu
Otrzymujesz wprowadzanie tekstu oddzielone prostokątną mapą liczb oraz jednym punktem początkowym i końcowym. Każda liczba będzie liczbą całkowitą włącznie z przedziału od 1 do 9. Poza tym dane wejściowe mogą być podawane w dowolny sposób, w granicach rozsądku.
Dane wyjściowe powinny być w tym samym formacie co dane wejściowe, a liczby, w których utworzono ścieżkę, zastąpiono hash ( #
). Z powodu arbitralnych przepisów narzuconych przez niektórych kapryśnych polityków tory mogą iść tylko poziomymi lub pionowymi ścieżkami. Innymi słowy, nie można cofać się ani iść po przekątnej.
Program powinien być w stanie rozwiązać w rozsądnym czasie (tj. <10 minut) dla map do 6 wierszy i 6 kolumn.
Jest to wyzwanie polegające na kodzie golfowym , więc wygrywa najkrótszy program.
Mam przykładową (nie golfową) implementację .
Próbki we / wy
S12321
121234
348E96
S12321
######
3##E##
S73891
121234
348453
231654
97856E
S#3###
1###3#
3#####
######
#####E
źródło
4
w134
przykładowej mapie powinna być6
?Odpowiedzi:
Python, 307 znaków
P
podąża częściową ścieżkąp
i zwraca wszystkie sposoby jej rozszerzenia, aby osiągnąćE
. Każda zwrócona ścieżka jest łączona z wynikiem, dzięki czemumax
można znaleźć najlepszą.Zajmuje około 80 sekund na mapie 6x6.
źródło
Python:
529482460 bajtówMoje rozwiązanie nie wygra żadnych nagród. Ponieważ jednak opublikowano tylko dwa rozwiązania, a problem był dla mnie interesujący, i tak zdecydowałem się opublikować swoją odpowiedź.
Edycja: Podziękowania dla Howarda za jego rekomendacje. Udało mi się ogolić dużo mojego wyniku!
źródło
P
iM
są one używane tylko raz, więc dobrym pomysłem jest wstawienie ich w to miejsce (w przypadku pojedynczego wywołania działa czasami prawie we wszystkich przypadkach dla dwóch).m[c]!='S'
można skrócićm[c]<'S'
, równieżabs(z)==1
do,abs(z)<2
a nawet-2<z<2
.Ruby, 233 znaków
Podejście brutalnej siły Ruby, które działa dobrze wewnątrz ograniczeń czasowych na planszy 6x6. Dane wejściowe należy podać na STDIN.
Przykłady:
źródło