Wejście
- Binarna macierz reprezentująca ściany lochu.
- Pozycja gracza w lochu.
- Kierunek , w którym gracz aktualnie patrzy (0 = północ, 1 = wschód, 2 = południe, 3 = zachód)
Wydajność
Pseudo-trójwymiarowa reprezentacja ścian znajdujących się w polu widzenia gracza, jako grafika ASCII zawierająca znaków.
Poniżej znajduje się kilka możliwych ram wyjściowych wraz z odpowiednią mapą i kompasem, które pomagają w zrozumieniu go (ale narysowanie mapy i kompasu nie jest częścią wyzwania).
Specyfikacja
Pole widzenia
Zawodnik ma ścian w jego polu widzenia oznakowanym od do . Poniżej znajdują się pozycje ścian względem gracza (na żółto) we wszystkich możliwych kierunkach.
Rysowanie ścian
Ściany powinny być rysowane od do w dokładnie takiej kolejności, biorąc pod uwagę, że każda narysowana wcześniej część może zostać zastąpiona ściankami bliższymi. Możesz oczywiście zaimplementować go inaczej, o ile końcowy wynik jest taki sam.
Cały wyjściowy jest narysowany z 7 różnych postaci: " "
, "'"
, "."
, "|"
, "-"
, "_"
i ":"
.
Ponieważ uszczegółowienie kształtów ścian w korpusie tego wyzwania spowodowałoby, że byłoby ono zbyt długie, zamiast tego podano je w poniższym linku TIO:
Znaki, które nie są częścią danej ściany, są oznaczone "?"
na tych schematach literą „a”. Należy je traktować jako „przezroczyste” znaki, które w ogóle nie są rysowane. Z drugiej strony wszystkie przestrzenie w ścianie są „stałe” i muszą zastąpić wszelkie inne znaki, które mogły zostać wcześniej narysowane.
Zasady
O wejściu
- Można wziąć , , i w jakimkolwiek rozsądnym formacie.
- Możesz użyć współrzędnych 0 lub 1 indeksowanych.
- Możesz użyć 4 różnych wybranych wartości dla wskazówek.
- Gwarantowana macierz ma co najmniej .
- Możesz założyć, że na krawędziach zawsze będą otaczające ściany.
- Gracz na pewno znajdzie się na pustym polu.
- Dane wejściowe są gwarantowane.
O wyjściu
- Ściany muszą być narysowane dokładnie tak, jak opisano.
- Format wyjściowy jest jednak również elastyczny: pojedynczy ciąg, tablica ciągów, macierz znaków itp.
- Wiodące i końcowe białe znaki są dopuszczalne, o ile są spójne.
To jest golf golfowy .
Przypadki testowe
Wszystkie przypadki testowe korzystają z następującej macierzy:
[ [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ],
[ 1, 0, 1, 1, 1, 0, 0, 0, 0, 1 ],
[ 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 ],
[ 1, 0, 0, 0, 0, 0, 1, 1, 0, 1 ],
[ 1, 0, 0, 1, 0, 0, 0, 1, 0, 1 ],
[ 1, 0, 0, 1, 1, 0, 1, 1, 0, 1 ],
[ 1, 1, 1, 1, 0, 0, 0, 0, 0, 1 ],
[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1 ],
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ] ]
Poniższe dane wprowadzają współrzędne 0-indeksowane, przy czym wskazuje lewy górny róg.
x=3, y=3, d=0
x=6, y=4, d=3
x=4, y=4, d=1
x=1, y=5, d=2
x=7, y=7, d=3
x=6, y=6, d=1
x=8, y=1, d=2
x=7, y=6, d=1
Oczekiwane wyniki:
------------------------------ ------------------------------
x=3, y=3, d=0: x=6, y=4, d=3:
------------------------------ ------------------------------
__ __ '. .'
|'. .'| | |
| '.--------------.' | |----. |
| | | | | | '.--------. |
| | | | | | | | |
| | | | | | | | |
| | | | | | .'--------' |
| .'--------------'. | |----' |
__|.' '.|__ | |
.' '.
------------------------------ ------------------------------
x=4, y=4, d=1: x=1, y=5, d=2:
------------------------------ ------------------------------
.' __ ________________________ .'
| | |
-------. .----| | |
| '.--------.' | | | |
| | | | | | |
| | | | | | |
| .'--------'. | | | |
-------' '----| | |
| __|________________________|
'. '.
------------------------------ ------------------------------
x=7, y=7, d=3: x=6, y=6, d=1:
------------------------------ ------------------------------
'. '.
|'. |'.
| '. | '.
| | '. .- | |--.--------.--------.-
| | |: :| | | | | |
| | |: :| | | | | |
| | .' '- | |--'--------'--------'-
| .' | .'
|.' |.'
.' .'
------------------------------ ------------------------------
x=8, y=1, d=2: x=7, y=6, d=1:
------------------------------ ------------------------------
'. __ '.
|'. .'| |
| '. .' | |----.--------------.-------
| | '. .' | | | | |
| | |: :| | | | | |
| | |: :| | | | | |
| | .' '. | | | | |
| .' '. | |----'--------------'-------
|.' '.|__ |
.' .'
Powiązane wyzwanie:
Wyzwanie z 2013 r. Jest ściśle powiązane. Ale ma inne kryterium wygranej (wyzwanie kodowe), znacznie luźniejszą specyfikację danych wyjściowych i wymaga interaktywnych operacji we / wy.
źródło
Odpowiedzi:
Czysty (z Snappy ),
800785670644 bajtów460402 bajtów kodu +360242-bajtowy literał ciągu( znak ucieczki tu i na TIO, ponieważ nie jest prawidłowy UTF-8)
Tutaj możesz zweryfikować długość literału .
Wypróbuj online!
Szybka kompresja działa w tym przypadku całkiem dobrze, mimo że jest skoncentrowana na prędkości, ponieważ w kompresowanym ciągu jest tak wiele przebiegów jednoznakowych.
Nieskompresowany ciąg znaków (
#
zastąpiony przez\n
dla przejrzystości) to:To koduje lewe wersje różnych komponentów ekranu z
!
zamiast nowych linii, a~
zamiast nich?
, które są następnie~
uzupełniane do 30 znaków z prawej strony przed dodaniem siebie i ich odwrócenia linii do listy odnośników.Reszta kodu obsługuje po prostu wyszukiwanie współrzędnych, a przypadki poza zakresem są ignorowane.
źródło
Python 2 ,
864854848826810 bajtówWypróbuj online!
źródło
Węgiel drzewny ,
500332 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Obawiam się, że to trochę nudne podejście; dużo druku skompresowanych literałów łańcuchowych. Wyjaśnienie:
Wypełnij tablicę dwoma dodatkowymi
0
literami z każdej strony.Wytnij
7x7
podsekcję tablicy wyśrodkowaną na podanych współrzędnych.Obróć tablicę odpowiednio do danego kierunku.
(zwróć uwagę na spację końcową) Narysuj puste
30×10
pole, aby wynik zawsze był spójny.Narysuj każdą połowę osobno, odzwierciedlając pomiędzy.
Weź tablicę deskryptorów ściany, podzieloną na części (ciąg, współrzędna y, współrzędna x), przefiltruj te części, które mają ścianę w odpowiednim miejscu w odpowiedniej połowie tablicy, i zapętl się nad ścianami. Pozycja jest obliczana przez wyodrębnienie 12 ścian z tablicy i indeksowanie ich za pomocą indeksu porcji, ponieważ jest to bardziej golfowe niż zlokalizowanie ściany bezpośrednio za pomocą indeksu porcji.
Przejdź do współrzędnych ściany i wydrukuj ją. Zauważ, że odbijanie neguje współrzędne X od
[0, 30)
do,(-30, 0]
dzięki czemu po jednym przejściu płótno jest skutecznie przesuwane o 29 znaków w lewo.źródło
Rubinowy ,
412 391 385383 bajtówWypróbuj online!
Pobiera dane wejściowe jako tablicę wartości prawdy / fałszu (uwaga
0
w Rubimnil
jest prawdą , ale fałszem.)Zwraca tablicę znaków.
Wyjaśnienie
Bloki są rysowane od przodu do tyłu ze
n
zmniejszaniem odległości i pozycją z boku na bok,m
przechodząc przez-1,1,0
lewy, prawy, środkowy. Środkowy blok E w najdalszym rzędzie jest faktycznie rysowany dwukrotnie, ponieważ musimy sprawdzić oba bloki A / B i bloki C / D.n,m
id
służą do modyfikowania wartościx
iy
do przeszukiwania tablicya
. Jeślix
jest poza zakresem,nil
zwracana jest komórka poza zakresem i nie jest generowany błąd, ale jeśliy
jest poza zakresem,nil
zostanie zwrócone dla wiersza, a Ruby zgłasza błąd typu, gdy próbuje wyszukać komórkę. Aby tego uniknąć, tablica jest potrojona w pionie przed wyszukiwaniem. Jeśli zostanie znaleziona prawdziwa wartość, zostanie narysowany blok.Dane wyjściowe są wbudowane w tablicę
b
10-elementowych tablic reprezentujących kolumny danych wyjściowych i są transponowane do 10 wierszy na końcu funkcji. Rysowana jest pełna przednia powierzchnia wszystkich bloków (niezależnie od tego, czy pojawia się ona w rzutni, czy nie), dlatego w tablicy potrzebne jest dodatkowe miejsce, aby uniknąć błędów poza zakresem. Zakresj
wartości w rzutni wynosi od-15
do+14
, jest to przesunięte o 15 podczas zapisywania w tablicy, aby dać zakres0
do29
. Dla każdego bloku wyznaczoną trzy wartości obliczono:p
iq
dla lewej i prawej narożach przedniej ścianki, odpowiednio, ar
z tyłu ściany bocznej.j
jest iterowane od minimum do maksimum z tych trzech wartości rysujących z kolei kolumny.Istnieją 3 rodzaje linii: poziomy
-
lub_
pionowy|
lub:
ukośny z powtarzającym się" .'"
wzorem. Gdziep < j < q
kolumny zawierające spacje ograniczone-
lub_
narysowane w celu utworzenia przedniej powierzchni. Gdziej
jest poza tym zakresem, kolumny zawierające spację|
lub:
są rysowane symbolami od,t=" .'"
tworząc krawędzie i / lub powierzchnię boczną. Jest to zarządzane przez zmienną,k=j
gdziej
jest dodatnia lubk=-j-1
gdziej
jest ujemna. Liczba znaków między górną i dolną górą wynosik/3*2
. Aby poprawnie obsługiwać zewnętrzne krawędzie najdalszych bloków gdzien=3
,k
muszą zostać podjęte modulo 9, ale to nie musi być wykonywana dla mniejszych wartościachn
.k
jest zatem brane modulo36/-~n
, gdzie-~n
ocenia nan+1
.Nieskluczony kod
źródło