Phóng to trên bản đồ


13

Nhiệm vụ của bạn là, đưa ra một bản đồ làm đầu vào, phóng to hoặc thu nhỏ, tùy thuộc vào tỷ lệ. Lưu ý rằng tỷ lệ đã cho là tỷ lệ để thu nhỏ , do đó tỷ lệ giữa 0 và 1 sẽ thực sự phóng to.

Ví dụ: đưa ra bản đồ (được thực hiện kém) sau đây:

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

Và hệ số tỷ lệ là 2, trước tiên bạn nên tách nó thành các phần 2x2:

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

Và trong mỗi phần tìm thấy ký tự phổ biến nhất:

.__..
.....

Lưu ý rằng có một phần mơ hồ:

__
OO

Tôi đã chọn sử dụng _cho phần này, nhưng sử dụng Ocũng hoàn toàn chấp nhận được.

Ví dụ, nếu bạn được cho hệ số tỷ lệ là 4, bạn sẽ chia nó thành các phần 4 x 4, như vậy:

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

Như bạn có thể nói, bản đồ không hoàn toàn phù hợp với các phần 4 x 4, nhưng điều đó tốt, vì chúng ta chỉ có thể hạ thấp kích thước của phần bên cạnh.

Ngoài ra, bất cứ khi nào chúng tôi cần cắt bỏ bản đồ của mình, chúng tôi sẽ cắt ở phía dưới hoặc bên phải.

Bản đồ kết quả sẽ trông như vậy:

...

Thật là một bản đồ thú vị!

Đối với các yếu tố tỷ lệ dưới 1, chẳng hạn như 0,5, quá trình này đơn giản hơn khi chúng tôi phóng to. Lấy bản đồ này:

./O\.
.\O/.

Thu phóng với tỷ lệ 0,5:

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

Lưu ý rằng bất cứ khi nào hệ số thu phóng của bạn nhỏ hơn 1, điều sau đây sẽ luôn đúng : 1/(zoom factor) % 2 == 0. Khi nó ở trên 1, đảm bảo duy nhất bạn có là nó sẽ là một số nguyên. Khi đó 1, bản đồ nên giữ nguyên.

Ví dụ:

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

O


0.25
ABCD

AAAABBBBCCCCDDDD
AAAABBBBCCCCDDDD
AAAABBBBCCCCDDDD
AAAABBBBCCCCDDDD

1
My zoom
should
not change

My zoom
should
not change

Bạn cũng có thể lấy bản đồ dưới dạng một mảng được phân tách bằng dòng mới.


2
Tôi nghĩ bạn nên đợi thêm một chút trong Sandbox.
Erik the Outgolfer

@Jonathon Allan Không, không, trên phần đó có nhiều .hơn O. Chúng tôi cắt ở phía bên phải và phía dưới.
Okx

À, bởi "chúng tôi cắt ở phía dưới hoặc bên phải", ý bạn là phía trên bên trái của bản đồ luôn luôn là phía trên bên trái của một phần?
Jonathan Allan

@Jonathan Allan Có.
Okx

OK, từ "hoặc" là sai lệch :)
Jonathan Allan

Câu trả lời:


7

Toán học, 105 byte

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

Đầu vào là (tỷ lệ, mảng ký tự). Thang đo phải là một số nguyên hoặc một phần chính xác.

Giải trình

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

Nếu đầu vào đầu tiên nhỏ hơn 1 ...

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

Thay thế tất cả các Chuỗi trong đầu vào thứ hai thành một mảng vuông, với độ dài 1 / (đầu vào đầu tiên)

ArrayFlatten[ ... ]

Làm phẳng kết quả thành một mảng 2D.

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

Nếu đầu vào đầu tiên không ít hơn 1 ...

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

Phân vùng (đầu vào thứ hai) thành các phân vùng có chiều rộng / chiều dài tối đa (đầu vào đầu tiên).

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

Bản đồ lên cấp 2 và cấp 3 ...

First@*Commonest

Thành phần của hàm Commonest (tìm phần tử chung nhất trong danh sách) và First (lấy phần tử đầu tiên; trong trường hợp có nhiều phần tử phổ biến nhất).


2

Python, 191 182 180 byte

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

Gọi _(map, scale_factor), trong đó bản đồ là một mảng các dòng và nó trả về một mảng các dòng.

Mặc dù câu trả lời này đã bị đánh bại, tôi muốn giải thích nó, vì nó không phải là trường hợp đặc biệt khi hệ số tỷ lệ nhỏ hơn một.

Nó làm cho một hbằng wma trận, nơi h = ceiling(map height / scale factor), và w = ceiling(map width / scale factor).

Đối với mọi chỉ số (x, y) trong ma trận, hãy:

  • Lấy một hàm con từ tọa độ int(x * scale factor), int(y * scale factor)đến ceil((x + 1) * scale factor), ceil((y + 1) * scale factor).
  • Đặt ký tự phổ biến nhất trong hàm con đó tại (x, y).

Hãy thử trực tuyến!

Hãy thử các trường hợp thử nghiệm

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.