지도 확대


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
샌드 박스에서 좀 더 기다려야한다고 생각합니다.
Outgolfer Erik

@JonathonAllan 아니요, 해당 섹션에는 개 .이상이 없습니다 O. 오른쪽과 아래쪽을 잘라냅니다.
Okx

아, "하단이나 오른쪽에서 잘린다"는 것은지도의 왼쪽 상단이 항상 섹션의 왼쪽 상단이라는 것을 의미합니까?
Jonathan Allan

@JonathanAllan 예.
Okx

OK, "or"라는 단어는 오해의 소지가 있습니다 :)
Jonathan Allan

답변:


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[ ... ]

결과를 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))]

call _(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.