放大地图


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

您也可以将地图作为换行符分隔的数组。


2
我认为您应该在沙盒中等待更多时间。
暴民埃里克(Erik the Outgolfer)'17年

@JonathonAllan不,它不会,在该节还有更多.O。我们在右侧和底部切断。
Okx

啊,“我们在底部或右侧切掉”是指地图的左上角始终是断面的左上角?
乔纳森·艾伦

@JonathanAllan是的。
Okx

好吧,“或”一词会引起误解:)
乔纳森·艾伦

Answers:


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

Python,第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是线的数组,它返回线的数组。

尽管这个答案已经被击败,但我想解释一下,因为在比例因子小于1的情况下这不是特殊情况。

它制作一个hby 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)中。

在线尝试!

尝试测试用例

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.