Ampliando um mapa

13

Sua tarefa é, dado um mapa como entrada, diminuir ou diminuir o zoom, dependendo da escala. Observe que a escala fornecida é a escala pela qual diminuir o zoom ; portanto, uma escala entre 0 e 1 será realmente ampliada.

Por exemplo, dado o seguinte mapa (mal elaborado):

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

E um fator de escala de 2, você deve primeiro separá-lo em seções 2x2:

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

E em cada seção, encontre o caractere mais comum:

.__..
.....

Observe que havia uma seção ambígua:

__
OO

Eu escolhi usar _para esta seção, mas o uso também Oseria perfeitamente aceitável.

Se, por exemplo, você recebeu o fator de escala 4, o dividiria em seções 4x4, da seguinte forma:

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

Como você pode ver, o mapa não se encaixa perfeitamente nas seções 4x4, mas tudo bem, pois podemos diminuir o tamanho da seção ao lado.

Além disso, sempre que precisamos cortar nossos mapas, cortamos na parte inferior ou no lado direito.

O mapa resultante ficaria assim:

...

Que mapa interessante!

Para fatores de escala abaixo de 1, como 0,5, o processo é mais simples à medida que aumentamos o zoom. Veja este mapa:

./O\.
.\O/.

Zoom com uma escala de 0,5:

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

Note-se que sempre que o seu fator de zoom é inferior 1, o seguinte será sempre verdade: 1/(zoom factor) % 2 == 0. Quando estiver acima 1, a única garantia que você tem é que será um número inteiro. Quando é1 , o mapa deve permanecer o mesmo.

Exemplos:

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

O


0.25
ABCD

AAAABBBBCCCCDDDD
AAAABBBBCCCCDDDD
AAAABBBBCCCCDDDD
AAAABBBBCCCCDDDD

1
My zoom
should
not change

My zoom
should
not change

Você também pode pegar o mapa como uma matriz separada por nova linha.

Okx
fonte
2
Eu acho que você deveria ter esperado mais um pouco na Sandbox.
Erik the Outgolfer
@ JonathonAllan Não, não, nessa seção existem mais .de O. Cortamos no lado direito e inferior.
Okx
Ah, com "cortamos na parte inferior ou no lado direito", você quer dizer que a parte superior esquerda do mapa é sempre a parte superior esquerda de uma seção?
Jonathan Allan
@JonathanAllan Sim.
Okx
OK, a palavra "ou" é enganosa :)
Jonathan Allan

Respostas:

7

Mathematica, 105 bytes

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

A entrada é (escala, matriz de caracteres). A escala deve ser um número inteiro ou uma fração exata.

Explicação

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

Se a primeira entrada for menor que 1 ...

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

Substitua todas as seqüências de caracteres na segunda entrada em uma matriz quadrada, com comprimento 1 / (primeira entrada)

ArrayFlatten[ ... ]

Achate o resultado em uma matriz 2D.

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

Se a primeira entrada não for inferior a 1 ...

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

Particione a (segunda entrada) em partições cuja largura / comprimento seja no máximo (primeira entrada).

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

Mapeie os níveis 2 e 3 ...

First@*Commonest

A composição da função Mais comum (encontra o elemento mais comum em uma lista) e Primeiro (leva o primeiro elemento; caso haja vários elementos mais comuns).

JungHwan Min
fonte
2

Pitão, 191 182 180 bytes

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

Ligar _(map, scale_factor) , em que o mapa é uma matriz de linhas e retorna uma matriz de linhas.

Embora essa resposta já tenha sido vencida, quero explicá-la, pois não é um caso especial em que o fator de escala é menor que um.

Faz uma matriz hpor w, onde h = ceiling(map height / scale factor)e w = ceiling(map width / scale factor).

Para cada índice (x, y) na matriz, faça:

  • Pegue uma submatriz das coordenadas int(x * scale factor), int(y * scale factor)para ceil((x + 1) * scale factor), ceil((y + 1) * scale factor).
  • Coloque o caractere mais comum nessa submatriz em (x, y).

Experimente online!

Experimente casos de teste

Artyer
fonte