Hör auf in Mauern zu laufen!

16

Einige textbasierte Schurken-Likes lassen dich nicht in Wände laufen und geben dir den Weg zurück, wenn du es versuchst. Warum tun Sie das, wenn Sie den Spieler dazu bringen können, sich in die nächste gültige Richtung zu bewegen?

Die Herausforderung

Schreiben Sie ein Funktionsprogramm, das unter Angabe einer Richtung und eines 3 x 3-Zeichenrasters dasselbe Raster ausgibt, nachdem der Spieler einen Schritt ausgeführt hat.

Beispielsweise,

9
#..
.@#
#.#

wird

#.@
..#
#.#

Eingang

  • Die Richtung wird durch eine einzelne Ziffer von 1 bis 9 angegeben, die jeweils 8 Hauptrichtungen entsprechen und stillstehen. Dies ergibt sich aus den relativen Positionen der Zahlen auf einer Tastatur:

    NW N NE
    .. \ | /
    ... 7 8 9
    W-4 5 6 -E
    ... 1 2 3
    ../ | \
    SW S SE
    
    Sie können jedoch auch die Nummern 123, 456, 789 anstelle von 789, 456, 123 verwenden. Mit anderen Worten, Sie können die oberen und unteren 2 Zeilen oder Nummern vertauschen, wenn Sie dies wünschen. Dies sind die einzigen 2 akzeptablen Indexkombinationen.

  • Das 3 x 3-Raster besteht aus 3 verschiedenen druckbaren ASCII-Zeichen, die den begehbaren Boden, die Wände und den Player darstellen. (In den Testfällen .wird für Boden verwendet, #s sind Wände und @ist der Spieler)

  • Sie können wählen, welche Zeichen Ihr Programm verwendet, aber Sie müssen sie in Ihrer Antwort angeben und sie müssen über mehrere Versuche hinweg konsistent sein.
  • Das Zeichen, das das Zeichen darstellt, befindet sich immer in der Mitte des 3 x 3-Gitters, und die Richtung liegt immer zwischen 1 und 9 (einschließlich).
  • Sie können Eingaben in beliebiger Reihenfolge vornehmen
  • Das 3 x 3-Raster kann als Zeichenfeld, Zeichenfolgenfeld, Zeichenfolge mit 9 Längen oder als andere sinnvolle Alternative eingegeben werden.

Ausgabe

  • Von einer Funktion zurückkehren oder an StdOut oder die nächstgelegene Alternative ausgeben
  • Leerzeichen und Zeilenumbrüche sind erlaubt
  • Sie müssen die gleichen Zeichendarstellungen wie die Eingabe verwenden
  • Dieselben für Eingaben zulässigen Formate sind für Ausgaben zulässig

Wie der Spieler sich bewegt

Wenn die angegebene Richtung durch eine Wand blockiert ist (z. B. wenn das obige Beispiel die Richtung 6 hatte), schauen Sie in die 2 nächstgelegenen Richtungen:

  • Wenn eine (und nur eine) Richtung frei ist, bewegen Sie den Spieler in diese Richtung.
  • Wenn keine Richtungen frei sind, schauen Sie sich die nächstgelegenen 2 Richtungen an (außer Richtung 5). Wenn Sie sich vollständig eingewickelt haben und keine offene Richtung gefunden haben (Spieler von Wänden umgeben), bewegen Sie den Spieler nicht
  • Wenn beide Richtungen offen sind, wählen Sie eine aus, zu der Sie zufällig wechseln möchten (obwohl dies nicht unbedingt einheitlich ist).

Wenn die angegebene Richtung eine 5 ist, bewegen Sie den Player nicht

Testfälle

( #= Wand, .= Boden, @= Spieler)

Eingang:

9
# ..
. @ #
#. #

Ausgabe:

#. @
.. #
#. #


Eingang:

3
# ..
. @ #
#. #

Ausgabe:

# ..
.. #
# @ #


Eingang:

7
##.
# @ #
.. #

Ausgabe:

## @ ##.
#.# oder #.#
.. # @. #


Eingang:

5
...
. @.
...

Ausgabe:

...
. @.
...


Eingang:

2
###
# @ #
###

Ausgabe:

###
# @ #
###

Wertung

Das ist , also gewinnt die kürzeste Antwort in Bytes.

MilderMilquetoast
quelle
Verwenden Sie nicht yuhjklbn? RUHE IN FRIEDEN.
3.
Außerdem mag ich den Teil "Wähle eine alternative Richtung" nicht so sehr. Es ist ein bisschen anders als der andere Teil der Herausforderung, nämlich "Bewegen des Spielers in eine bestimmte Richtung und Ausgabe". Das ist jedoch nur eine persönliche Präferenz.
3.
1
Dieser Teil ist verwirrend: "Wenn keine Richtungen frei sind, schauen Sie sich die nächstgelegenen 2 Richtungen an."
Undichte Nonne
1
Können wir jedem Element eine Zahl anstatt eines ASCII-Zeichens zuweisen und die Eingabe dann als zweidimensionale Liste annehmen? Oder müssen sie Saiten sein?
Scott Milner
2
Kann ich die Anweisungen 123;456;789anstelle von verwenden 789;456;123?
Undichte Nonne

Antworten:

2

Pyth - 73 70 Bytes

Kmsd"78963214"DPGJXXYt@K+xKQG\@4\.R?q/J\#/Y\#Jk=YwV5=GflTmPd(N_N)IGOGB

Versuch es

Die Eingabe besteht aus zwei Zeilen:

1. Zeile: Bewegungsrichtung

2. Zeile: Das Brett (Positionen 123456789, wobei 123 die oberste Zeile ist)

Maria
quelle
3

JavaScript (ES6), 192 163 Bytes

a=>b=>a[(a[4]=0)+--b]?(A=(c,d)=>c==b|(e=a[c])-(f=a[d])|!e?(a[c-b?(e?e<f:new Date&1)?c:d:4]=2,a):A(+g[c],+h[d]))(+(g="3016X2785")[b],+(h="1250X8367")[b]):(a[b]=2,a)

Anmerkungen

Diese Funktion verwendet ein spezielles Eingabeformat. Die erste Eingabe ist ein Array von Ganzzahlen ( 0für floor, 1für wallund 2für player), die die Karte darstellen. Die zweite Eingabe ist die (gespiegelte) Richtung: 1ist Nordwesten,2 ist Norden, 3ist Nordosten, 4ist Westen usw. Die Eingaben sollten durch currying syntax ( Z(a)(b)) erfolgen.

Testfälle

Die Karten und Wegbeschreibungen wurden an mein Eingabeformat angepasst.

Z=
a=>b=>a[(a[4]=0)+--b]?(A=(c,d)=>c==b|(e=a[c])-(f=a[d])|!e?(a[c-b?(e?e<f:new Date&1)?c:d:4]=2,a):A(+g[c],+h[d]))(+(g="3016X2785")[b],+(h="1250X8367")[b]):(a[b]=2,a)

testcases = [
    [[1,0,0,0,2,1,1,0,1], 3],
    [[1,0,0,0,2,1,1,0,1], 9],
    [[1,1,0,1,2,1,0,0,1], 1],
    [[0,0,0,0,2,0,0,0,0], 5],
    [[1,1,1,1,2,1,1,1,1], 2]
]
for (test of testcases) {
    console.log(Z(test[0])(test[1]))
}

Luke
quelle
1

Python 3, 120 104 153 176 175 Bytes

def f(n,l):
 n-=1
 if n!=4and'.'in l:l[sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)[1][0]],l[4]='@.'
 return l

Probieren Sie es online!

Diese Methode ruft Richtung und Liste von '.', '#' Und '@' ab. Indizes beginnen mit 1 bis 9 (mit 0 bis 8 in der Liste). So hat es die Form

123 
456
789 

Methode gibt neue Liste mit neuen Positionen zurück.

Diese Linie

sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)

gibt eine Liste dieses Typs zurück:

>>>n=7
>>> l=['#','#','#','.','@','#','.','#','.']
>>> sorted(enumerate(l),key=lambda x:abs(x[0]%3-n%3+(x[0]//3-n//3)*1j)-ord(x[1])-__import__('random').random()/9)
[(4, '@'), (8, '.'), (6, '.'), (3, '.'), (7, '#'), (5, '#'), (1, '#'), (0, '#'), (2, '#')]

Wir berechnen Entfernungen zu freien Punkten und addieren Zufälligkeiten. Weil ord('#') <= ord('.') - 8 and ord('.') + 8 <= ord('@')wir sagen können, dass das nächste "." für n = 7 (Index in Liste) hat einen Index von 8.

Bildbeschreibung hier eingeben

Beispiel:

>>> f(9, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '.', '.', '.', '#', '#', '@', '#']
>>> f(3, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '@', '.', '.', '#', '#', '.', '#']
>>> f(5, ['.','.','#','.','@','.','#','.','#'])
['.', '.', '#', '.', '@', '.', '#', '.', '#']
>>> f(7, ['#','#','#','#','@','#','#','#','#'])
['#', '#', '#', '#', '@', '#', '#', '#', '#']
>>> f(7, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '.', '@', '.', '#', '#', '.', '#'] or ['#', '.', '.', '.', '.', '#', '#', '@', '#']
Кирилл Малышев
quelle
1) Dies funktioniert nicht für Testfälle, bei denen die Richtung, in die sich der Spieler bewegen möchte, besetzt ist und die richtige Position nicht die erste ist ','(was für die Testfälle 2, 3 und 5 der Fall ist). 2) Ihr E / A-Format scheint nicht das gleiche zu sein wie in der Frage. Bitte geben Sie Ihr E / A-Format an.
Luke
Ihr Beispiel f(9, ...funktioniert nicht - es platziert das Zeichen auf 2, aber die nächsten Positionen zu 9 sind 6 und 8, daher sollte eine davon zufällig ausgewählt werden (es gibt auch keine Zufälligkeit in Ihrem Code). Außerdem sollte es dann den Umkreis umrunden, um den nächstgelegenen zu finden, f(9,list("####@#.##"))und den Charakter an der einzig möglichen Stelle platzieren (hier 7).
Jonathan Allan
Vielen Dank, dass Sie auf Fehler hingewiesen haben. Für mich ist die Nachricht, dass der Code l [4], l [l.index ('.')] = '. @' Und l [l.index ('.')], L [4 ] = '@.' sind anders
Кирилл Малышев
@ JonathanAllan, zuerst habe ich die Regeln nicht ganz verstanden. Ich hoffe ich konnte den Code richtig korrigieren.
Кирилл Малышев
Immer noch nicht richtig, nein. 1. Das Beispiel f(9, ...sollte zurückkehren list("#....##@#")(weil 8 frei ist und neben 9 steht). 2. Etwas wie f(9,list("####@.#.#"))sollte eine Chance haben, zurückzukehren list("####..#@#")(nicht immer list("####.@#.#")), wie angegeben. "Wenn beide Richtungen offen sind, wählen Sie eine aus, zu der Sie zufällig wechseln möchten."
Jonathan Allan