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 golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
yuhjklbn
? ROZERWAĆ.123;456;789
zamiast789;456;123
?Odpowiedzi:
Pyth -
7370 bajtówSpró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)
źródło
JavaScript (ES6),
192163 bajtyNotatki
Ta funkcja używa specjalnego formatu wejściowego. Pierwsze wejście to tablica liczb całkowitych (
0
dlafloor
,1
dlawall
i2
dlaplayer
) reprezentujących mapę. Drugim wejściem jest (odwrócony) kierunek:1
jest północny-zachód,2
jest północny,3
jest północny-wschód,4
jest 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.
źródło
Python 3,
120104153176175 bajtówWypró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ę
Metoda zwraca nową listę z nowymi pozycjami.
Ta linia
zwraca listę tego typu:
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.Przykład:
źródło
','
(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.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ęcf(9,list("####@#.##"))
umieść postać w jedynym możliwym miejscu (tutaj 7).f(9, ...
powinien zostać zwróconylist("#....##@#")
(ponieważ 8 jest bezpłatne, a obok 9). 2. Coś takiegof(9,list("####@.#.#"))
powinno mieć szansę na powrótlist("####..#@#")
(nie zawszelist("####.@#.#")
) zgodnie z opisem „Jeśli oba kierunki są otwarte, wybierz jeden, aby przejść losowo”.