Збільшення масштабу на карті


13

Ваше завдання полягає в тому, щоб, маючи карту в якості введення, зменшити її або зменшити в залежності від масштабу. Зверніть увагу , що шкала дано це масштаб , з допомогою якого , щоб збільшити вихід , тому шкала від 0 до 1 буде фактично збільшити.

Наприклад, з огляду на таку (погано зроблену) карту:

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

І коефіцієнт масштабу 2, спочатку слід розділити його на 2х2 розділи:

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

І в кожному розділі знайдіть найпоширеніший персонаж:

.__..
.....

Зауважте, що був неоднозначний розділ:

__
OO

Я вирішив використовувати _для цього розділу, але використання Oбуло б цілком прийнятним.

Якщо, наприклад, вам дали коефіцієнт масштабу 4, ви розділили його на 4х4 секції так:

..__ | __.. | ..
../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

Ви також можете взяти карту як масив, розділений новою лінією.


2
Я думаю, ти повинен був би почекати ще в пісочниці.
Ерік Аутгольфер

@JonathonAllan Ні, не було б, на цьому розділі є більше .ніж O. Відрізаємо з правого і нижнього боку.
Okx

Ага, під "ми відрізаємо внизу або в правій частині", ви маєте на увазі, що лівий верхній частині карти завжди вліво вліво від розділу?
Джонатан Аллан

@JonathanAllan Так.
Okx

Гаразд, слово "або" вводить в оману :)
Джонатан Аллан

Відповіді:


7

Математика, 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[ ... ]

Вирівняйте результат у двовимірному масиві.

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

Якщо перший вхід не менше 1 ...

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

Розділіть (другий вхід) на розділи, ширина / довжина яких становить максимум (перший вхід).

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

Мапа на рівень 2 та рівень 3 ...

First@*Commonest

Склад функції Commonest (знаходить найпоширеніший елемент у списку) та Перший (візьміть перший елемент; якщо є декілька найпоширеніших елементів).


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), де карта - це масив ліній, і він повертає масив рядків.

Хоча ця відповідь вже побита, я хочу її пояснити, оскільки це не особливий випадок, коли коефіцієнт масштабу менше одиниці.

Це робить з 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).

Спробуйте в Інтернеті!

Спробуйте тестові випадки

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.