Wprowadzenie
Wszyscy wiedzą, że możliwość udanej nawigacji po polu asteroid wynosi około 3720 do 1. Ale pomimo twojego ostrzeżenia Han Solo wciąż chce spróbować szczęścia.
Bojąc się o swoje sztuczne życie, decydujesz się na kodowanie, w specyficznym dialekcie statku ( czytaj: preferowany język Code Golf ), program unikania planetoid, który zadecyduje, którą ścieżką wybrać się w labirynt ASCII pola asteroid.
Wkład
Millenium Falcon ma program do mapowania pól asteroid, który daje dane podobne do tego:
| ##### ######### |
| ###### # ### # |
| # # # # #### # |
@ ## ####
|# # # ### ## |
|## ## #### # # |
|#### ##### # ## |
Górne rzędy są po lewej stronie Sokoła, dolne rzędy po prawej stronie Sokoła, a kolumny reprezentują to, co znajduje się przed statkiem.
- Każdy
#
jest przeszkodą. - Każde pole to puste miejsce, w które może latać statek.
- Dane wejściowe mają zawsze wysokość 7 znaków. Jest to limit szerokości mapowania asteroid.
- Dane wejściowe mają zawsze 32 znaki (30 dla samego pola i 2 dla początkowego i końcowego limitu). Jest to limit głębokości mapowania asteroid. Pionowe paski
|
oznaczają początek i koniec mapowania. @
jest Sokół. Zawsze znajduje się w środkowym rzędzie (czwarty rząd) i pierwszej kolumnie na wejściu.- Przestrzeń pozostawiona w pionowych słupkach w ostatniej kolumnie to miejsce, do którego statek musi dotrzeć. Zawsze znajduje się w środkowym rzędzie (czwarty rząd) i ostatniej kolumnie na wejściu.
Dane wejściowe można traktować jako ciąg wieloliniowy, tablicę ciągów, ze STDIN lub parametrów funkcji, lub odczytać z pliku.
Możliwe manewry
Ścigają cię TIE-Fighters, dlatego zawsze musisz iść do przodu. Istnieją zatem trzy sposoby, w jakie statek może latać na każdym kroku:
-
Naprzód/
Naprzód i skręć w lewo\
Naprzód i skręć w prawo
Na przykład są to prawidłowe ścieżki:
@---
--
/ \ /
@ -
-
/ \
/ \
@ \
Jak widać, zawsze jest dokładnie jeden ruch na kolumnę. Sokół jest śmieciem, dlatego nie może wykonywać gwałtownych zwrotów. Co oznacza, że ruchy takie jak /\
lub \/
są niedozwolone . Musi być co najmniej jeden czysty ruch do przodu -
między dwoma przeciwnymi zwrotami. Z drugiej strony, jak pokazano powyżej, możliwe jest obrócenie w jedną stronę wielu kroków z rzędu.
Falcon ulega awarii, jeśli jeden ruch prowadzi statek do miejsca, w którym znajduje się przeszkoda. Na przykład te ruchy prowadzą do awarii:
@-#
@
\
#
#
/
@
Pamiętaj, że to nie jest awaria:
@-#
\
-
Wydajność
Musisz wypisać to samo pole asteroid ASCII, z prawidłową ścieżką do końca. Sokół musi być wydrukowany w miejscu końcowym zamiast w miejscu początkowym.
Na przykład poprawne dane wyjściowe dla podanego wcześniej przykładu wejściowego to:
| ##### ######### |
| ###### #-------- ### # |
| # # #/ # ####\ # |
--------- ## \ #### ----@
|# # # ### \ ## / |
|## ## #### \ #/ # |
|#### ##### #-- ## |
Twoja ścieżka musi tylko nie rozbić sokoła. Nie musi to być najkrótsza możliwa ścieżka.
Możesz założyć, że zawsze będzie co najmniej jedna możliwa ścieżka do końca.
Możesz wyprowadzać dane do STDOUT, w pliku lub dowolnym równoważniku, o ile pole asteroid jest drukowane dokładnie tak, jak w tym poście (np. Podanie listy współrzędnych dla ścieżki jest nieprawidłowe).
Przypadki testowe
Normalne pole asteroid
| ##### ######### | | ###### # ### # | | # # # # #### # | @ ## #### |# # # ### ## | |## ## #### # # | |#### ##### # ## |
Możliwe wyjście
| ##### ######### | | ###### #-------- ### # | | # # #/ # ####\ # | --------- ## \ #### ----@ |# # # ### \ ## / | |## ## #### \ #/ # | |#### ##### #-- ## |
Hiperregularne pole asteroid
|# # # # # # # # # # # # # # # | | # # # # # # # # # # # # # # #| |# # # # # # # # # # # # # # # | @ # # # # # # # # # # # # # # |# # # # # # # # # # # # # # # | | # # # # # # # # # # # # # # #| |# # # # # # # # # # # # # # # |
Możliwe wyjście
|# # # # # # # # # # # # # # # | | # # # # # # # # # # # # # # #| |# # # # # # # # # # # # # # # | -# #-# #-# #-# #-# #-# #-# #--@ |#\#/#\#/#\#/#\#/#\#/#\#/#\#/# | | #-# #-# #-# #-# #-# #-# #-# #| |# # # # # # # # # # # # # # # |
Rdzeń gwiazdy śmierci
| # # # # | | # # # | | # # # # # | @ # # # # # | # # # # | | # # # # # | | # # # # |
Możliwe wyjście
| # # # -- # | | --- # # / #\ - | | / #\ # # / # \ /#\ | - # \ # #/ # - # ----@ | # \ # ---- # # | | # \#/ # # # | | # - # # # |
Rów gwiazdy śmierci
|##############################| |##############################| |##############################| @ |##############################| |##############################| |##############################|
Wydajność
|##############################| |##############################| |##############################| ------------------------------@ |##############################| |##############################| |##############################|
Jaskinia asteroid
|### ##########################| |## # ############### ## ######| |# ### ######## ### ## # #####| @ ###### ###### ### ## ### |######## ### ### ## #########| |########## # ### ## ##########| |########### #####|
Możliwe wyjście
|###-##########################| |##/#\############### ##-######| |#/###--######## ### ##/#\#####| -######\###### ### ##/###-----@ |########--### ### ##/#########| |##########\# ### ##/##########| |###########-------- #####|
Punktacja
R2D2 jest zajęty pływaniem na bagnach, więc będziesz musiał sam zaprogramować kontroler Sokoła, co jest uciążliwe. Dlatego wygrywa najkrótszy kod .
-
na każdym zakręcie ma ścieżkę, która jest definiowana jako ruch „do przodu”. Ale rzeczywiste ruchy są zawsze dwie ukośne w lewo, a następnie dwie ukośne w prawo.Odpowiedzi:
JavaScript (ES6), 186
201Urywalny fragment kodu:
Ta funkcja przyjmuje pojedynczy ciąg znaków z nowymi liniami. Funkcja dzieli ciąg na tablicę za pomocą
...
operatora i pobiera indeks(x,y)
współrzędnych przez(33 * y) + x
.Funkcja działa rekurencyjnie, testując różne możliwe ruchy dla każdej przestrzeni. Kiedy napotyka przeszkodę, zwraca wartość fałszu, a kiedy osiąga pole celu końcowego, wraca
true
. (W kodzie golfowymtrue
jest to utworzone przez!console.log(...)
.)Zauważ, że ten kod nie używa długich serii ruchów w prawo, ale interpunkuje je prostymi ruchami. Oznacza to, że robi drugą opcję poniżej, a nie pierwszą:
Wydaje się to legalne, ponieważ
-
może legalnie przyjść przed lub po zakręcie, więc dlaczego nie jedno i drugie jednocześnie? To wygląda szczególnie dziwnie na końcu, gdy ostatni ruch\
jest wyświetlany, ale@
:Mój ulubiony paskudny hack golfowy to domyślne nadużycie podczas kłótni
c=k=" "
. Argumenty(i,l,c=" ")
powiedziałbym „użyj ciąg" "
nac
razief
nie jest dostarczany trzeci argument”. W tenc=k=" "
sposób mówimy „jeślic
nie jest podany, zapisz" "
w zmiennej globalnej,k
a następnie zapisz również tę wartośćc
”. Ponieważ rekurencja rozpoczyna się tylko jednym argumentem,k
jest zawsze inicjowana przy pierwszym wywołaniu funkcji.Lekko niestrzeżony:
źródło
" "
w zmiennej), które obniżyły mój wynik jeszcze niżej.C (pełny program),
249247235 bajtówJest to kompletny program odczytujący dane wejściowe z pliku i wysyłający wynik na standardowe wyjście. Nazwa pliku jest przekazywana jako parametr do programu.
Nie golfowany:
Wydajność:
źródło
-
po nim\
, ale to\
jest objęte przez@
. (Mój program robi to samo.)Common Lisp, 303 bajty
Świetnie się bawiłem z tym wyzwaniem, jest to pierwsze zadanie, jakie wykonałem jako codegolf. Zasadniczo istnieje prosta funkcja rekurencyjna, która próbuje wykonać każdy wykonalny ruch, aż do osiągnięcia pozycji końcowej.
Golf / Minified
Odczytuje dane wejściowe z pliku i w katalogu roboczym. Jestem pewien, że jest jeszcze miejsce na ulepszenia.
Zwykły kod
Próbka wyjściowa
źródło
ActionScript 3, 364 bajty
Podzieliłem to na dwie funkcje; jeden, aby zmienić tablicę na tablicę, a drugi rekurencyjny, aby obliczyć ścieżkę lotu.
Wersja bez golfa w programie ze zdefiniowanym jednym przykładowym polem asteroidy:
źródło