Celem tego wyzwania jest napisanie programu lub funkcji, która zwraca najmniejszą liczbę uderzeń potrzebnych do ukończenia danego kursu.
Wkład
- Układ kursu można przekazać w dowolny odpowiedni sposób i format. (odczytane z konsoli, przekazane jako parametr wejściowy, odczytane z pliku lub dowolnego innego, wielowierszowego łańcucha znaków, tablicy znaków, dwuwymiarowej tablicy znaków / bajtów).
- Pozycja początkowa piłki i dołka można również podać jako dane wejściowe, nie trzeba go analizować od wartości wejściowej. W przypadkach testowych są one uwzględnione w kursie, aby upewnić się, że nie ma wątpliwości co do rzeczywistej pozycji.
- Możesz ponownie przypisać znaki wejściowe do czegoś innego, o ile nadal są one rozpoznawalne jako odrębne znaki (np. Znaki ASCII do wydruku).
Wydajność
- Program musi zwrócić najniższą możliwą liczbę punktów (najmniejszą liczbę uderzeń potrzebnych do dotarcia do dołka) dla każdego kursu zaliczonego jako dane wejściowe w rozsądnym formacie (łańcuch, liczba całkowita, liczba zmiennoprzecinkowa lub haiku opisujące wynik)
- Jeśli nie można pokonać kursu, zwróć
-1
(lub dowolną inną wybraną przez ciebie wartość fałszowania , która nie zostałaby zwrócona dla kursu możliwego do pokonania ).
Przykład:
W tym przykładzie pozycje są zapisywane w oparciu o 0, X / Y, od lewej do prawej, od góry do dołu - ale możesz użyć dowolnego formatu, który ci się podoba, ponieważ wynik i tak jest całkowicie niezależny od formatu.
Wkład:
###########
# ....#
# ...#
# ~ . #
# ~~~ . #
# ~~~~ #
# ~~~~ #
# ~~~~ o #
# ~~~~ #
#@~~~~ #
###########
Ball (Start-Position): 1/9
Hole (End-Position): 8/7
Wydajność:
8
Zasady i pola
Kurs może składać się z następujących pól:
'@'
Piłka - początek kursu'o'
Dziura - cel kursu'#'
Ściana - kula zatrzyma się, gdy uderzy w ścianę'~'
Woda - należy tego unikać'.'
Piasek - kula natychmiast zatrzyma się na piasku' '
Ice - Ball będzie się ślizgać, dopóki nie trafi w coś
Podstawowe zasady i ograniczenia gry:
- Piłka nie może się poruszać po przekątnej, tylko w lewo, w prawo, w górę iw dół.
- Piłka nie zatrzyma się przed wodą, tylko przed ścianami, na piasku i dołku.
- Strzały do wody są nieprawidłowe / niemożliwe
- Piłka pozostanie w dołku, nie przeskakując nad nią jak na lodzie
- Pole jest zawsze prostokątne.
- Kurs zawsze graniczy z wodą lub ścianami (nie są wymagane kontrole graniczne).
- Zawsze jest dokładnie jedna piłka i jeden dołek.
- Nie wszystkie kursy można pokonać.
- Może istnieć wiele ścieżek, które dają ten sam (najniższy) wynik.
Luki i warunki wygranej
- Standardowe luki są zabronione
- Programy muszą zostać zakończone
- Nie możesz wymyślić dodatkowych zasad (uderzanie piłki tak mocno, że przeskakuje nad wodą, odbija się od ściany, przeskakuje pola piasku, zakręty wokół narożników itp.)
- To jest golf golfowy , więc wygrywa rozwiązanie z najmniejszą liczbą znaków.
- Rozwiązania muszą być w stanie obsłużyć wszystkie dostarczone przypadki testowe, jeśli jest to niemożliwe z powodu ograniczeń używanego języka, należy to zaznaczyć w odpowiedzi.
Przypadki testowe
Kurs nr 1 (2 uderzenia)
####
# @#
#o~#
####
Kurs nr 2 (niemożliwy)
#####
#@ #
# o #
# #
#####
Kurs nr 3 (3 uderzenia)
~~~
~@~
~.~
~ ~
~ ~
~ ~
~ ~
~.~
~o~
~~~
Kurs nr 4 (2 uderzenia)
#########
#~~~~~~~#
#~~~@~~~#
## . ##
#~ ~ ~ ~#
#~. o .~#
#~~~ ~~~#
#~~~~~~~#
#########
Kurs nr 5 (niemożliwy)
~~~~~~~
~... ~
~.@.~.~
~... ~
~ ~ ~.~
~ . .o~
~~~~~~~
Odpowiedzi:
JavaScript (ES6), 174 bajty
Staje się wkład w
zwijajączmiękczania składni([x, y])(a)
, gdzie x i y są indeksowane 0 współrzędne położenia wyjściowego i w [] jest macierzą liczb z0
= lód1
= ściennego2
= piaskowej3
= otworu i4
= wodaZwraca,
0
jeśli nie ma rozwiązania.Wypróbuj online!
Skomentował
źródło
Python 3 , 273 bajty
Wypróbuj online!
-41 bajtów dzięki ovs
-1 bajtów dzięki Jonathanowi Frechowi
źródło
if k+1
nie byćif-~k
?C #,
461418 bajtówTo jest tylko niekonkurencyjna implementacja referencyjna, która (miejmy nadzieję) ożywi to wyzwanie:
Grał w golfa Kevin Cruijssen
Bez golfa
Wypróbuj online
źródło
int P(string[]C){int w=C[0].Length,i=0,l=c.Length;var c=string.Join("",C);var h=new int[l];for(var n=new List<int>();i<l;n.Add(i++))h[i]=c[i]!='@'?int.MaxValue:0;for(i=1;;i++){var t=n;n=new List<int>();foreach(int x in t){foreach(int d in new[]{-1,1,-w,w}){for(int j=x+d;c[j]==' ';j+=d);if(c[j]=='#'&h[j-d]>s){h[j-d]=s;n.Add(j-d);}if(c[j]=='.'&h[j]>s){h[j]=s;n.Add(j);}if(c[j]=='o')return s;}}if(n.Count<1)return -1;}}
(418 bajtów). A może mógłbyś dodać link TIO z kodem testowym?