Przestań wchodzić w ściany!

16

Niektóre nieuczciwe polubienia oparte na tekście nie pozwalają wejść do ścian i cofają się, jeśli spróbujesz. Po co to robić, skoro gracz może poruszać się w najbliższym ważnym kierunku?

Wyzwanie

Napisz program funkcji, który, biorąc pod uwagę kierunek i siatkę znaków 3 na 3, wyświetla tę samą siatkę po wykonaniu kroku przez gracza.

Na przykład,

9
#..
.@#
#.#

staje się

#.@
..#
#.#

Wejście

  • Kierunek jest podawany przez jedną cyfrę od 1 do 9, z których każda odpowiada 8 kierunkom głównym i stoi w miejscu. Wywodzi się to ze względnych lokalizacji liczb na klawiaturze:

    NW N NE
    .. \ | /
    ... 7 8 9
    W- 4 5 6 -E
    ... 1 2 3
    ../ | \
    SW S SE
    
    Możesz jednak użyć liczb 123, 456, 789 zamiast 789, 456, 123. Innymi słowy, możesz zamienić górne i dolne 2 rzędy lub liczby, jeśli tak wybierzesz. Są to jedyne 2 dopuszczalne kombinacje indeksów.

  • Siatka 3 na 3 będzie się składać z 3 różnych, drukowalnych znaków ASCII reprezentujących podłogę, ściany i gracza. (W przypadkach testowych .jest używany do podłóg, #s są ścianami i @jest odtwarzaczem)

  • Możesz wybrać, jakich znaków używa Twój program, ale musisz podać je w swojej odpowiedzi i muszą one być spójne przez wiele prób.
  • Znak reprezentujący postać zawsze będzie w środku siatki 3 na 3, a kierunek zawsze będzie wynosił od 1 do 9 (włącznie)
  • Możesz przyjmować dane wejściowe w dowolnej kolejności
  • Siatkę 3 na 3 można wprowadzić jako tablicę char, tablicę łańcuchów, łańcuch o długości 9 lub inną rozsądną alternatywę.

Wynik

  • Powrót z funkcji lub wyjście do StdOut lub najbliższej alternatywy
  • Końcowe spacje i znaki nowej linii są dozwolone
  • Musisz użyć tych samych reprezentacji znaków co danych wejściowych
  • Te same formaty dozwolone dla danych wejściowych są dozwolone dla danych wyjściowych

Jak porusza się gracz

Jeśli określony kierunek jest zablokowany przez ścianę (np. Jeśli powyższy przykład miał kierunek 6), spójrz na 2 najbliższe kierunki:

  • Jeśli jeden (i tylko jeden) kierunek jest wolny, przesuń gracza w tym kierunku.
  • Jeśli żadne kierunki nie są wolne, spójrz na najbliższe 2 najbliższe kierunki (wyłączając kierunek 5). Jeśli owinąłeś się dookoła i nie znalazłeś otwartego kierunku (gracz otoczony murami), nie ruszaj gracza
  • Jeśli oba kierunki są otwarte, wybierz jeden, aby przejść losowo (choć niekoniecznie jednakowo).

Jeśli podanym kierunkiem jest 5, nie ruszaj gracza

Przypadki testowe

( #= ściana, .= podłoga, @= gracz)

Wejście:

9
# ..
. @ #
#. #

Wynik:

#. @
.. #
#. #


Wejście:

3)
# ..
. @ #
#. #

Wynik:

# ..
.. #
# @ #


Wejście:

7
##.
# @ #
.. #

Wynik:

## @ ##.
#. # lub #. #
.. # @. #


Wejście:

5
...
. @.
...

Wynik:

...
. @.
...


Wejście:

2)
###
# @ #
###

Wynik:

###
# @ #
###

Punktacja

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.

Łagodnie Milquetoast
źródło
Nie używasz yuhjklbn? ROZERWAĆ.
Rɪᴋᴇʀ
Poza tym tak naprawdę nie podoba mi się część „wybierz alternatywny kierunek”. Różni się nieco od drugiej części wyzwania, która polega na „przesunięciu gracza w określonym kierunku i wydajności”. To tylko osobiste preferencje.
Rɪᴋᴇʀ
1
Ta część jest myląca: „Jeśli żadne kierunki nie są wolne, spójrz na najbliższe 2 najbliższe kierunki”.
Leaky Nun
1
Czy możemy przypisać liczbę zamiast znaku ASCII dla każdego elementu, a następnie przyjąć dane jako listę dwuwymiarową? A może muszą to być sznurki?
Scott Milner
2
Czy mogę użyć wskazówek 123;456;789zamiast 789;456;123?
Leaky Nun

Odpowiedzi:

2

Pyth - 73 70 bajtów

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

Spróbuj

Dane wejściowe składają się z dwóch wierszy:

1. linia: kierunek ruchu

Drugi wiersz: plansza (pozycje 123456789, przy 123 jako najwyższym rzędzie)

Maria
źródło
3

JavaScript (ES6), 192 163 bajty

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)

Notatki

Ta funkcja używa specjalnego formatu wejściowego. Pierwsze wejście to tablica liczb całkowitych ( 0dla floor, 1dla walli 2dla player) reprezentujących mapę. Drugim wejściem jest (odwrócony) kierunek: 1jest północny-zachód, 2jest północny, 3jest północny-wschód, 4jest zachodni itp. Dane wejściowe należy podawać za pomocą składni currying ( Z(a)(b)).

Przypadki testowe

Mapy i wskazówki zostały zmodyfikowane, aby pasowały do ​​mojego formatu wejściowego.

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]))
}

Łukasz
źródło
1

Python 3, 120 104 153 176 175 bajtów

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

Wypróbuj online!

Ta metoda pozwala uzyskać kierunek i listę „.”, „#” I „@”. Indeksy zaczynają się od 1 do 9 (naprawdę od 0 do 8 na liście). Ma więc formę

123 
456
789 

Metoda zwraca nową listę z nowymi pozycjami.

Ta linia

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)

zwraca listę tego typu:

>>>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, '#')]

Obliczamy odległości do wolnych punktów i dodajemy losowość. Ponieważ ord('#') <= ord('.') - 8 and ord('.') + 8 <= ord('@')możemy powiedzieć, że najbliższe „.” dla n = 7 (indeks na liście) ma indeks 8.

wprowadź opis zdjęcia tutaj

Przykład:

>>> f(9, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '.', '.', '.', '#', '#', '@', '#']
>>> f(3, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '@', '.', '.', '#', '#', '.', '#']
>>> f(5, ['.','.','#','.','@','.','#','.','#'])
['.', '.', '#', '.', '@', '.', '#', '.', '#']
>>> f(7, ['#','#','#','#','@','#','#','#','#'])
['#', '#', '#', '#', '@', '#', '#', '#', '#']
>>> f(7, ['#','.','.','.','@','#','#','.','#'])
['#', '.', '.', '@', '.', '#', '#', '.', '#'] or ['#', '.', '.', '.', '.', '#', '#', '@', '#']
Кирилл Малышев
źródło
1) Nie działa to w przypadkach testowych, w których zajęty jest kierunek, w którym gracz chce się poruszać, a prawidłowa pozycja nie jest pierwsza ','(co ma miejsce w przypadkach testowych 2, 3 i 5). 2) Twój format I / O nie wydaje się być taki sam jak w pytaniu. Podaj swój format we / wy.
Łukasz
Twój przykład f(9, ...nie działa - ustawia znak na 2, ale najbliższe pozycje 9 to 6 i 8, więc jedną z nich należy wybierać losowo (w twoim kodzie również nie ma losowości). Co więcej, powinien następnie omijać obwód, znajdując najbliższego, więc f(9,list("####@#.##"))umieść postać w jedynym możliwym miejscu (tutaj 7).
Jonathan Allan
Dzięki za wskazanie błędów Dla mnie wiadomość jest taka, że ​​kod l [4], l [l.index ('.')] = '. @' I l [l.index ('.')], L [4 ] = „@.” są różne
Кирилл Малышев
@JonathanAllan, na początku nie do końca rozumiałem zasady. Mam nadzieję, że mógłbym poprawnie poprawić kod.
Кирилл Малышев
Nadal niepoprawne, nie. 1. przykład f(9, ...powinien zostać zwrócony list("#....##@#")(ponieważ 8 jest bezpłatne, a obok 9). 2. Coś takiego f(9,list("####@.#.#"))powinno mieć szansę na powrót list("####..#@#")(nie zawsze list("####.@#.#")) zgodnie z opisem „Jeśli oba kierunki są otwarte, wybierz jeden, aby przejść losowo”.
Jonathan Allan