Jesteś odkrywcą, który mapuje nieznany świat. Twój statek jest unoszony na wietrze. Gdzie to idzie, kto wie?
Każdego dnia w lunecie obserwujesz elementy na północy, południu, wschodzie i zachodzie. Zawsze widzisz cztery takie cechy, odpowiadające głównym kierunkom. Twój spyglass zgłasza następujące symbole ASCII:
~~.*
, ~~~~
, ~.^^
,~#~#
Symbole są w kolejności (północ, południe, wschód, zachód).
Są to symbole: ~
= morze, .
= wybrzeże, ^
= góra, *
= drzewo, #
= nieważne (brak obserwacji, dzieje się to za każdym razem, gdy zobaczysz skraj świata lub krajobraz jest zasłonięty mgłą). Twoja luneta widzi dokładnie jedną jednostkę we wszystkich kierunkach.
Każdej nocy spoglądasz na gwiazdy, aby zobaczyć, jak daleko podróżowałeś. Patrząc na gwiazdy zgłasza taki symbol ascii:
n
, s
, e
,w
odpowiednio do północy, południa, wschodu i zachodu. Każdej nocy zawsze przenosisz dokładnie jedną jednostkę na północ, południe, wschód lub zachód. Więc jako odkrywca będziesz otrzymywać niekończący się strumień symboli:
~~.*n~~~~s~~.*s~.**
Twoim zadaniem jest wygenerowanie mapy 2D świata (gdzie ?
są nieznane części mapy, północ jest w górze, wschód jest w prawo):
?~~~??????
?~~~??????
?~~~.^^.??
?~~.***.~~
~~.*^^*.~~
~~~..~~~~~
~~~~~~~~~~
~~~~~~~~~~
Dla uproszczenia załóżmy, że zaczynasz w lewym dolnym rogu mapy. Załóż, że wszystkie mapy mają wymiary 8 x 8.
Oto prosty przykład 3x3. Załóżmy, że mapa wygląda następująco:
~.~
~^~
~.~
Z następującymi danymi wejściowymi: ~#.#n~~^#s
Otrzymasz ten wynik:
~??
~^?
~.?
Więcej przykładowych danych wejściowych i wyjściowych:
wkład
~#~#n~~~#n~~~#n~~~#n~~~#n~~.#n~~.#n#~~#e#.~~e#.~~e#.~~e#.~~e#~~~e#~~~e#~#~s~~#~s~~#~s~~#~s~~#.s~~#~s~~#~s~##~w~#~~w.#~~w^#~~w.#~~
wydajność
~~~~~~~~
~....~~~
~.????~~
~~????~~
~~????.~
~~????~~
~~?.^.~~
~~~~~~~~
Wkład:
~#~#e~#~~e~#~~e.#~~e^#~~n.~..n~^~.n~.~~n.~~.n.~~*n~.~.n#.~~w#.~~w#.~~s~*..s..*.s*~.~s.~~~s
Wydajność:
?~~~~~??
?....~??
?.**.~??
?~..~~??
?~~~~~??
?~~..~??
~~~.^.??
~~~~~~??
źródło
~#~#n~~~#n~~~#n~~~#n~~~#n~~.#n~~.#n#~~#e#.~~e#.~~e#.~~e#.~~e#~~~e#~~~e#~#~s~~#~s~~#~s~~#~s~~#.s~~#~s~~#~s~##~w~#~~w.#~~w^#~~w
) jest niepoprawny, a wyjście powinno mieć miejsce, w??
którym jest napisane?.
Odpowiedzi:
MATL ,
685958 bajtówWypróbuj online!
Wyjaśnienie
Mapa znajduje się na dole stosu i stopniowo się zapełnia. Aktualna pozycja eksploratora jest zapisana w schowku J.
Mapa wykorzystuje współrzędne macierzy, więc (1,1) znajduje się w lewym górnym rogu. Ponadto stosuje się indeksowanie liniowe głównych kolumn. Oznacza to, że do elementów macierzy 8 × 8 reprezentujących mapę można uzyskać dostęp za pomocą jednego indeksu w następujący sposób:
Na przykład element (3,2) macierzy jest elementem o indeksie liniowym 11. Ruch w kierunku odpowiednio na północ, południe, wschód i zachód odpowiada dodaniu -1, 1, 8 lub -8 do wskaźnika liniowego. Tablica [-1 1 8 -8] służy do kodowania dwóch różnych rzeczy:
Łańcuch wejściowy jest podzielony na części
5
znaków. Ponieważ w pierwszym fragmencie brakuje pierwszego znaku (oznaczającego ruch), inicjałs
jest arbitralnie dołączany, aby wszystkie fragmenty miały ten sam rozmiar. Aby to zrekompensować, badacz zaczyna od pozycji 7, a nie 8, więc początkowe przemieszczenie na południe (dodaj 1 do indeksu liniowego) pozostawia je na pozycji 8.Części 5 znaków są przetwarzane w pętli. Pierwszy znak aktualizuje pozycję, a pozostałe 4, jeśli inne niż
#
, są zapisywane w odpowiednich wpisach macierzy reprezentującej mapę.źródło
C,
210208207 bajtówTen używa printf i scanf do odczytu danych wejściowych oraz tablicy zlinearyzowanej zamiast x, y; więc uważam, że wystarczająco różni się od milibajtów .
Gra w golfa:
Nieco golfa:
Reprezentacja:
Zaczynasz także od pozycji 8, ponieważ powoduje to odcięcie znaku od pętli.
źródło
Fortran,
263251247235234216 bajtówWersja 1D (podobna do wersji Don Muesli):
Wersja 2D:
Aby włączyć dowolną formę i wstępne przetwarzanie, plik wymaga rozszerzenia
.F90
, npexplorer.F90
. Dane wejściowe są odczytywane ze STDIN:źródło
C,
265226224 bajtówMapa jest 8x8, nie zauważyłem tego wcześniej. A oto rozwiązanie 265 bajtów, które działa dla map o zmiennych wymiarach:
źródło
a[8][8]
być wystarczające?int a[8][8]
daje ci darmową inicjalizację mapy, a użycie char dajem[64]
mi świetne zniżki na wydruk mapy. Jednak naprawdę blisko liczy sięe
iw
w jej odwzorowaniu, możesz użyćfor(x=8;x--;)putchar((i=a[x][y])?i:63)
do golenia dwóch bajtów na wyjściu.c=getchar(),c+1
nie jest to równoważne zgetchar(),c++
pewnymi sztuczkami?Rubin,
169147 bajtówPełny program Pobiera ciąg wejściowy ze STDIN (prawdopodobnie trzeba go wpakować z pliku, aby uniemożliwić spływającym nowym wierszom bałagan) i wysyła wynikową mapę do STDOUT.
Przytnij tonę, łącząc wszystkie struny w jedną, a następnie dzieląc je później.
Nie golfowany:
źródło
Lua, 354 bajtów ( wypróbuj online )
Gra w golfa:
Nieznacznie nie golfista:
źródło
x=x+(("w e"):find(e)or 2)-2 end
nie byćx=x-2+(("w e"):find(e)or 2)end
?Kotlin, 242 bajty
W razie potrzeby nowe znaki można zastąpić średnikami.
Spróbuj tutaj
źródło