地図を拡大する


13

あなたの仕事は、地図を入力として、縮尺に応じてズームアウトまたはズームインすることです。指定された縮尺はズームアウトする縮尺であるため、0〜1の縮尺は実際にズームインすることに注意してください。

たとえば、次の(不適切に作成された)マップがあるとします。

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

スケールファクター2の場合、最初に2x2セクションに分割する必要があります。

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

そして、各セクションで最も一般的なキャラクターを見つけます。

.__..
.....

あいまいなセクションがあったことに注意してください。

__
OO

_このセクションで使用することを選択しましたが、使用Oすることも完全に受け入れられます。

たとえば、スケールファクターが4の場合、次のように4x4セクションに分割します。

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

おわかりのように、マップは4x4セクションに完全には収まりませんが、横のセクションのサイズを小さくすることができるため、問題ありません。

また、マップを切り取る必要があるときはいつでも、下または右側で切り取ります。

結果のマップは次のようになります。

...

なんて面白い地図でしょう!

0.5などの1未満のスケール係数の場合、代わりにズームインする方がプロセスは簡単です。この地図を見てください:

./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
Sandboxでもう少し待つべきだったと思います。
エリックアウトゴルファー

@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/#]

2番目の入力のすべての文字列を長さ1 /(最初の入力)の正方配列に置き換えます

ArrayFlatten[ ... ]

結果を2D配列にフラット化します。

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

最初の入力が1より小さくない場合...

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

(2番目の入力)を幅/長さが最大(1番目の入力)のパーティションに分割します。

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は行の配列であり、行の配列を返します。

この答えはすでに打ち負かされていますが、スケールファクターが1未満の特殊なケースではないため、説明したいと思います。

それは作る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)に配置します。

オンラインでお試しください!

テストケースを試す

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.