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 O
seria 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.
.
deO
. Cortamos no lado direito e inferior.Respostas:
Mathematica, 105 bytes
A entrada é (escala, matriz de caracteres). A escala deve ser um número inteiro ou uma fração exata.
Explicação
Se a primeira entrada for menor que 1 ...
Substitua todas as seqüências de caracteres na segunda entrada em uma matriz quadrada, com comprimento 1 / (primeira entrada)
Achate o resultado em uma matriz 2D.
Se a primeira entrada não for inferior a 1 ...
Particione a (segunda entrada) em partições cuja largura / comprimento seja no máximo (primeira entrada).
Mapeie os níveis 2 e 3 ...
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).
fonte
Pitão,
191182180 bytesLigar
_(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
h
porw
, ondeh = ceiling(map height / scale factor)
ew = ceiling(map width / scale factor)
.Para cada índice (x, y) na matriz, faça:
int(x * scale factor), int(y * scale factor)
paraceil((x + 1) * scale factor), ceil((y + 1) * scale factor)
.Experimente online!
Experimente casos de teste
fonte