Powiększanie mapy

13

Twoim zadaniem jest, biorąc pod uwagę mapę jako dane wejściowe, pomniejszyć ją lub powiększyć, w zależności od skali. Należy zauważyć, że skala podana jest skala, według której zoom out , a więc skala pomiędzy 0 i 1 będzie faktycznie powiększyć.

Na przykład biorąc pod uwagę następującą (źle wykonaną) mapę:

..____....
../OOO\...
..\OO/\...
..........

I współczynnik skali 2, najpierw należy podzielić na 2x2 sekcje:

.. | __ | __ | .. | ..
.. | /O | OO | \. | ..
----------------------
.. | \O | O/ | \. | ..
.. | .. | .. | .. | ..

I w każdej sekcji znajdź najczęstszą postać:

.__..
.....

Zauważ, że była niejednoznaczna sekcja:

__
OO

Wybrałem użycie _w tej sekcji, ale używanie Obyłoby również całkowicie do przyjęcia.

Jeśli na przykład otrzymasz współczynnik skali 4, podzielisz go na sekcje 4x4, tak jak poniżej:

..__ | __.. | ..
../O | OO\. | ..
..\O | O/\. | ..
.... | .... | ..

Jak widać, mapa nie pasuje idealnie do sekcji 4x4, ale to dobrze, ponieważ możemy po prostu zmniejszyć rozmiar sekcji z boku.

Ponadto, ilekroć musimy odciąć nasze mapy, odcinamy na dole lub po prawej stronie.

Powstała mapa wyglądałaby tak:

...

Co za interesująca mapa!

W przypadku współczynników skali poniżej 1, takich jak 0,5, proces jest prostszy, gdy zamiast tego powiększamy. Weź tę mapę:

./O\.
.\O/.

Powiększanie w skali 0,5:

..//OO\\..
..//OO\\..
..\\OO//..
..\\OO//..

Pamiętaj, że zawsze, gdy współczynnik zoomu mniej niż 1, co następuje zawsze będzie prawdą 1/(zoom factor) % 2 == 0. Gdy jest powyżej 1, jedyną gwarancją jest to, że będzie to liczba całkowita. Kiedy tak jest 1, mapa powinna pozostać taka sama.

Przykłady:

4
/OO\
|OO|
|OO|
\OO/

O


0.25
ABCD

AAAABBBBCCCCDDDD
AAAABBBBCCCCDDDD
AAAABBBBCCCCDDDD
AAAABBBBCCCCDDDD

1
My zoom
should
not change

My zoom
should
not change

Możesz również wziąć mapę jako tablicę rozdzieloną znakiem nowej linii.

Okx
źródło
2
Myślę, że powinieneś był poczekać trochę dłużej w piaskownicy.
Erik the Outgolfer,
@JonathonAllan Nie, nie byłoby, w tej sekcji jest więcej .niż O. Odcinamy po prawej i dolnej stronie.
Okx,
Ach, przez „odcinamy na dole lub po prawej stronie” masz na myśli, że lewy górny róg mapy jest zawsze lewym górnym rogu odcinka?
Jonathan Allan
@JathanathanAllan Tak.
Okx,
OK, słowo „lub” wprowadza w błąd :)
Jonathan Allan

Odpowiedzi:

7

Mathematica, 105 bajtów

If[#<1,ArrayFlatten[#2/.n_String:>Table[n,1/#,1/#]],Map[First@*Commonest,#2~Partition~UpTo@{#,#},{2,3}]]&

Dane wejściowe to (skala, tablica znaków). Skala musi być liczbą całkowitą lub dokładną ułamkiem.

Wyjaśnienie

If[#<1, ..., ... ]

Jeśli pierwsze wejście jest mniejsze niż 1 ...

#2/.n_String:>Table[n,1/#,1/#]

Zamień wszystkie ciągi z drugiego wejścia na kwadratową tablicę o długości 1 / (pierwsze wejście)

ArrayFlatten[ ... ]

Spłaszcz wynik do tablicy 2D.

If[#<1, ..., ... ]

Jeśli pierwsze wejście jest nie mniejsze niż 1 ...

#2~Partition~UpTo@{#,#}

Podziel (drugie wejście) na partycje, których szerokość / długość są co najwyżej (pierwsze wejście).

Map[ ..., ... ,{2,3}]

Mapa na poziom 2 i poziom 3 ...

First@*Commonest

Skład funkcji Najczęstsze (znajduje najczęstszy element na liście) i Pierwszy (weź pierwszy element; w przypadku, gdy istnieje wiele najczęstszych elementów).

JungHwan Min
źródło
2

Python, 191 182 180 bajtów

lambda m,s,j=''.join,i=int:[j((lambda p:max(p,key=p.count))(j(g[i(x*s):-i(~x*s//1)]for g in m[i(y*s):-i(~y*s//1)]))for x in range(-i(-len(m[0])//s)))for y in range(-i(-len(m)//s))]

Wywołaj _(map, scale_factor), gdzie mapa jest tablicą linii i zwraca tablicę linii.

Chociaż ta odpowiedź została już pobita, chcę ją wyjaśnić, ponieważ nie jest to szczególny przypadek, w którym współczynnik skali jest mniejszy niż jeden.

To sprawia, że hw wmatrycy, w której h = ceiling(map height / scale factor), i w = ceiling(map width / scale factor).

Dla każdego indeksu (x, y) w macierzy wykonaj:

  • Weź submatrix od współrzędnych int(x * scale factor), int(y * scale factor)do ceil((x + 1) * scale factor), ceil((y + 1) * scale factor).
  • Umieść najczęstszy znak w tej submatrixie w (x, y).

Wypróbuj online!

Wypróbuj przypadki testowe

Artyer
źródło