Wyzwanie
Najkrótszy kod według liczby znaków, aby pomóc robotowi znaleźć kociaka w jak najmniejszej liczbie kroków.
Golfiści, to czas kryzysu - Kociak zaginął i robot musi go znaleźć! Robot musi dotrzeć do Kociaka możliwie najkrótszą drogą. Jednak na drodze robota jest wiele przeszkód, a on potrzebuje ciebie, abyś zaprogramował dla niego rozwiązanie.
Robot miał dla niego program, ale ten program został utracony, a Robot nie ma kopii zapasowej :(.
Środowisko uruchomieniowe robota nie jest najlepsze, a najmniej znaków Robot musi odczytać z kodu źródłowego, najmniej czasu poświęci na przetwarzanie, a to oznacza, że Kitten zostanie znaleziony szybciej!
Pamięć robota zawiera mapę lokalizacji, w której się znajduje, z górą reprezentującą północ, dolną reprezentującą południe, prawą reprezentacją wschodu i lewą reprezentacją zachodu. Robot zawsze znajduje się w prostokątnym pokoju o nieznanym rozmiarze, otoczonym ścianami, reprezentowanym przez #
na jego mapie radarowej. Obszary, do których robot może wchodzić, są reprezentowane przez spację .
Radar robota skanuje również wiele przeszkód w pokoju i zaznacza je różnymi literami ASCII. Robot nie może przejść przez te przeszkody. Radar oznaczy Kociaka jako specjalną postać ASCII K
, a lokalizacja Robota jest oznaczona R
.
System nawigacji robota działa w ten sposób: może zrozumieć duet kierunku i liczbę jednostek ruchu, do których powinien się udać - na przykład N 3
oznacza „idź na północ 3 jednostki ruchu”. Mapa radarowa robota jest wykonana w taki sposób, że jednostka ruchu to jedna postać ASCII. Robot może jechać tylko w 4 kierunkach i nie może poruszać się po przekątnej.
Twoim zadaniem, odważny Oszczędzaczu Kociaków, jest przeczytanie mapy radaru Robota raz i wygenerowanie najmniejszej liczby kierunków, przy najmniejszej odległości przemieszczania się jednostki ruchu. Robot ma co najmniej jedną ścieżkę do Kociaka.
Aby upewnić się, że Robot nie marnuje czasu na uruchamianie źle działającego programu, który nie pomoże Robotowi znaleźć Kociaka, zachęcam cię, dzielna wygaszaczu Kociaka, do korzystania z wyników poprzednich programów Robota, aby mieć pewność, że nie będziesz tracić czasu na znalezienie Kociaka!
Przypadki testowe
Input:
######################
# d 3 Kj #
# #
# R #
# q #
######################
Output:
E 13
N 2
Input:
######################
# d r 3 Kj #
# p p #
# T X #
# q s t #
# #
# R o d W #
# #
# g t U #
# #
######################
Output:
N 1
E 10
N 4
E 2
Input:
######################
# spdfmsdlwe9mw WEK3#
# we hi #
# rdf fsszr#
# sdfg gjkti #
# fc d g i #
# dfg sdd #
# g zfg #
# df df #
# xcf R#
######################
Output:
N 1
W 9
N 5
E 4
N 1
E 4
N 1
Liczba kodów obejmuje wejście / wyjście (tj. Pełny program).
źródło
Odpowiedzi:
C ++
1002899799 znakówUwaga wymaga użycia C ++ 0x w celu wyeliminowania spacji pomiędzy>> w szablonach.
Znajduje trasę przy minimalnej liczbie zakrętów.
To
Dijkstra's Algorithm
rozwiązanie problemu najkrótszej ścieżki.Aby odróżnić wiele tras o tej samej wielkości, długa prosta linia ma mniejszy ciężar niż wiele krótkich linii (sprzyja to trasom z mniejszą liczbą zakrętów).
W bardziej czytelnej formie:
źródło
Scala 2.8 (451 znaków)
... ale nie rozwiązuje powiązań na korzyść najmniejszej liczby kierunków (chociaż znajduje najmniejszą liczbę kroków).
Scala 2.8, 642 znaków, poprawnie rozwiązuje więzi;
Odkryła krótszą ścieżkę dla drugiego przykładu niż ta podana w problemie:
źródło
Python 2.6 (504 znaki)
źródło
Python 2.6 (535 znaków)
Rozpakowuje do poważnie źle wykonanej implementacji A *. Odczytuje standardowe. Poszukuje rozwiązań o minimalnej całkowitej odległości. Zrywa więzi, preferując minimalną liczbę kierunków. Wyświetla listę ruchów na standardowe wyjście. Znajduje kocięta.
Rozpakowane :
Źródło zostało ręcznie antygolfowane w kilku miejscach w celu uzyskania mniejszej skompresowanej reprezentacji. Na przykład rozwinięto pętlę for nad kierunkami kompasu.
źródło
c ++ - 681 niezbędnych znaków
Najpierw zamienia wszystkie przeszkody na mapie na
#
s (i zmienia wartościK
iR
, aby pozostawić miejsce w przestrzeni postaci na bardzo długie ścieżki. Następnie zapisuje się na mapie. Iteracyjny proces oznacza wszystkie kolejno dostępne kwadraty, aż jest w stanie dosięgnąć kociaka jednym ruchem. Następnie używa tej samej procedury sprawdzania dostępności, aby znaleźć ciąg pozycji, które prowadzą do początku w minimalnej instrukcji. Instrukcje te są ładowane do łańcucha przez wstępne oczekiwanie, dzięki czemu wydrukuj w odpowiedniej kolejności.Nie zamierzam grać w golfa dalej, ponieważ nie rozwiązuje on właściwie więzi i nie może być łatwo do tego przystosowany.
To się nie udaje
produkcja
Mniej lub bardziej czytelna wersja:
źródło
Rubin - 539 znaków
Mógłby to przynieść wiele ulepszeń, ale działa zarówno w przypadku najkrótszych kroków, jak i wskazówek.
źródło
Ruby - 648 znaków
Kolejny, który nie przeszedł testu najmniejszej liczby kierunków, ponieważ nie mogę wymyślić żadnego łatwego sposobu na osadzenie go w A *.
źródło