Das Ziel dieser Herausforderung besteht darin, ein Programm oder eine Funktion zu schreiben , die die geringste Anzahl von Schlägen zurückgibt, die zum Abschließen eines bestimmten Kurses erforderlich sind.
Eingang
- Das Layout des Kurses kann auf jede geeignete Art und Weise und in jedem von Ihnen bevorzugten Format übergeben werden. (Lesen von der Konsole, Übergabe als Eingabeparameter, Lesen aus einer Datei oder einem anderen mehrzeiligen String, String-Array, zweidimensionalem Zeichen- / Byte-Array).
- Die Startposition des Balls und des Lochs kann auch als Eingabe übergeben werden, sie muss nicht aus der Eingabe analysiert werden. In den Testfällen werden sie in den Kurs einbezogen, um sicherzustellen, dass keine Verwechslungen mit der tatsächlichen Position auftreten.
- Sie können die eingegebenen Zeichen neu zuordnen, sofern sie noch als unterschiedliche Zeichen erkennbar sind (z. B. druckbare ASCII-Zeichen).
Ausgabe
- Das Programm muss für jeden Kurs, der als Eingabe in einem vernünftigen Format (String, Integer, Float oder ein Haiku, das das Ergebnis beschreibt) übergeben wird, die niedrigstmögliche Punktzahl (die geringste Anzahl von Schlägen, die zum Erreichen des Lochs erforderlich sind) zurückgeben.
- Wenn der Kurs nicht zu schlagen ist, kehren Sie zurück
-1
(oder ein anderer falscher Wert Ihrer Wahl, der für einen schlagbaren Kurs nicht zurückgegeben würde).
Beispiel:
In diesem Beispiel sind die Positionen 0-basiert, X / Y, von links nach rechts, von oben nach unten notiert. Sie können jedoch jedes beliebige Format verwenden, da das Ergebnis sowieso vollständig formatunabhängig ist.
Eingang:
###########
# ....#
# ...#
# ~ . #
# ~~~ . #
# ~~~~ #
# ~~~~ #
# ~~~~ o #
# ~~~~ #
#@~~~~ #
###########
Ball (Start-Position): 1/9
Hole (End-Position): 8/7
Ausgabe:
8
Regeln und Felder
Der Kurs kann aus folgenden Feldern bestehen:
'@'
Ball - Der Beginn des Kurses'o'
Loch - Das Ziel des Platzes'#'
Mauer - Der Ball stoppt, wenn er auf eine Mauer trifft'~'
Wasser - muss vermieden werden'.'
Sand - Der Ball stoppt sofort auf Sand' '
Der Eisball rutscht weiter, bis er auf etwas trifft
Die Grundregeln und Einschränkungen des Spiels:
- Der Ball kann sich nicht diagonal bewegen, sondern nur nach links, rechts, oben und unten.
- Der Ball stoppt nicht vor Wasser, sondern nur vor Wänden, auf Sand und im Loch.
- Schüsse ins Wasser sind ungültig / unmöglich
- Der Ball bleibt im Loch und wird nicht wie auf Eis übersprungen
- Der Kurs ist immer rechteckig.
- Die Strecke ist immer von Wasser oder Mauern begrenzt (keine Grenzkontrollen erforderlich).
- Es gibt immer genau eine Kugel und ein Loch.
- Nicht alle Kurse sind zu schlagen.
- Möglicherweise gibt es mehrere Pfade, die zu derselben (niedrigsten) Punktzahl führen.
Schlupflöcher und Gewinnbedingung
- Standardlücken sind verboten
- Programme müssen beendet werden
- Du kannst keine zusätzlichen Regeln aufstellen (den Ball so hart treffen, dass er über Wasser springt, von einer Wand abprallt, über Sandfelder springt, Kurven um Ecken herum usw.)
- Das ist Code-Golf , also gewinnt die Lösung mit der geringsten Anzahl von Zeichen.
- Lösungen müssen in der Lage sein, alle bereitgestellten Testfälle zu verarbeiten. Wenn dies aufgrund von Einschränkungen der verwendeten Sprache nicht möglich ist, geben Sie dies bitte in Ihrer Antwort an.
Testfälle
Kurs # 1 (2 Treffer)
####
# @#
#o~#
####
Kurs # 2 (nicht möglich)
#####
#@ #
# o #
# #
#####
Kurs # 3 (3 Treffer)
~~~
~@~
~.~
~ ~
~ ~
~ ~
~ ~
~.~
~o~
~~~
Kurs 4 (2 Schläge)
#########
#~~~~~~~#
#~~~@~~~#
## . ##
#~ ~ ~ ~#
#~. o .~#
#~~~ ~~~#
#~~~~~~~#
#########
Kurs # 5 (nicht möglich)
~~~~~~~
~... ~
~.@.~.~
~... ~
~ ~ ~.~
~ . .o~
~~~~~~~
Antworten:
JavaScript (ES6), 174 Byte
Nimmt Eingaben in
Curling-Currysyntax vor([x, y])(a)
, wobei x und y die 0-indexierten Koordinaten der Startposition sind und a [] eine Ganzzahlmatrix mit0
= Eis,1
= Wand,2
= Sand,3
= Loch und4
= Wasser istGibt zurück,
0
wenn es keine Lösung gibt.Probieren Sie es online!
Kommentiert
quelle
Python 3 , 273 Bytes
Probieren Sie es online!
-41 Bytes dank ovs
-1 Bytes dank Jonathan Frech
quelle
if k+1
nicht seinif-~k
?C #,
461418 BytesDies ist nur eine nicht wettbewerbsfähige Referenzimplementierung, um diese Herausforderung (hoffentlich) wiederzubeleben:
Golf gespielt von Kevin Cruijssen
Ungolfed
Probieren Sie es online aus
quelle
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 Bytes). Könnten Sie vielleicht auch einen TIO-Link mit Testcode hinzufügen ?