Увеличение на карте

13

Ваша задача состоит в том, чтобы, учитывая карту в качестве входных данных, увеличивать или уменьшать ее, в зависимости от масштаба. Обратите внимание, что данный масштаб является масштабом, на который необходимо уменьшить масштаб , поэтому масштаб от 0 до 1 фактически увеличит масштаб.

Например, учитывая следующую (плохо сделанную) карту:

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

И масштабный коэффициент 2, вы должны сначала разделить его на 2x2 разделы:

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

И в каждом разделе найдите наиболее распространенного персонажа:

.__..
.....

Обратите внимание, что был неоднозначный раздел:

__
OO

Я решил использовать _ для этого раздела, но использование Oбыло бы также вполне приемлемым.

Если, например, вам был задан масштабный коэффициент 4, вы бы разбили его на разделы 4x4 следующим образом:

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

Как вы можете сказать, карта не идеально вписывается в разделы 4x4, но это нормально, так как мы можем просто уменьшить размер раздела сбоку.

Кроме того, всякий раз, когда нам нужно отрезать наши карты, мы обрезаем их снизу или справа.

Полученная карта будет выглядеть так:

...

Какая интересная карта!

Для масштабных коэффициентов ниже 1, таких как 0,5, процесс проще, поскольку вместо этого мы увеличиваем масштаб. Возьми эту карту:

./O\.
.\O/.

Масштабирование со шкалой 0,5:

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

Обратите внимание , что всякий раз , когда ваш коэффициент масштабирования меньше 1, следующий будет всегда так: 1/(zoom factor) % 2 == 0. Когда это выше1 , единственная гарантия, что у вас есть, - это целое число. Когда это так 1, карта должна остаться прежней.

Примеры:

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

O


0.25
ABCD

AAAABBBBCCCCDDDD
AAAABBBBCCCCDDDD
AAAABBBBCCCCDDDD
AAAABBBBCCCCDDDD

1
My zoom
should
not change

My zoom
should
not change

Вы также можете взять карту в виде массива, разделенного символом новой строки.

Okx
источник
2
Я думаю, тебе следовало еще подождать в Песочнице.
Эрик Outgolfer
@JonathonAllan Нет, не будет, в этом разделе больше, .чем O. Отсекаем с правой и нижней стороны.
Okx
Ах, под «мы обрезаем внизу или справа» вы имеете в виду, что верхний левый угол карты всегда является верхним левым углом раздела?
Джонатан Аллан
@JonathanAllan Да.
Okx
ОК, слово «или» вводит в заблуждение :)
Джонатан Аллан

Ответы:

7

Mathematica, 105 байт

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

Ввод (масштаб, массив символов). Шкала должна быть целым числом или точной дробью.

объяснение

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

Если первый вход меньше 1 ...

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

Заменить все строки во втором входе в квадратный массив длиной 1 / (первый вход)

ArrayFlatten[ ... ]

Свести результат в 2D массив.

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

Если первый вход не меньше 1 ...

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

Разбейте (второй вход) на разделы, ширина / длина которых не больше (первый вход).

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

Карта на уровень 2 и уровень 3 ...

First@*Commonest

Композиция функции Commonest (находит самый общий элемент в списке) и First (возьмите первый элемент; в случае, если есть несколько общих элементов).

Юнг Хван Мин
источник
2

Питон, 191 182 180 байт

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

Вызов _(map, scale_factor) , где map - это массив строк, и он возвращает массив строк.

Хотя этот ответ уже побежден, я хочу объяснить его, поскольку это не частный случай, когда масштабный коэффициент меньше единицы.

Это делает hпо wматрице, где h = ceiling(map height / scale factor)иw = ceiling(map width / scale factor) .

Для каждого индекса (x, y) в матрице выполните:

  • Возьмите подматрицу из координат int(x * scale factor), int(y * scale factor)в ceil((x + 1) * scale factor), ceil((y + 1) * scale factor).
  • Поместите самый общий символ в этой подматрице в (x, y).

Попробуйте онлайн!

Попробуйте тестовые случаи

Artyer
источник