ซูมเข้าแผนที่


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
ฉันคิดว่าคุณควรรอใน Sandbox มากกว่านี้
Erik the Outgolfer

@ JonathonAllan ไม่เป็นไรส่วนนี้มี.มากกว่าOนั้น เราตัดทางด้านขวาและด้านล่าง
Okx

อ่าโดย "เราตัดที่ด้านล่างหรือด้านขวา" คุณหมายถึงว่ามุมซ้ายบนของแผนที่มักจะเป็นมุมบนซ้ายของส่วนหรือไม่
Jonathan Allan

@JanathanAllan ใช่
Okx

ตกลงคำว่า "หรือ" กำลังทำให้เข้าใจผิด :)
Jonathan Allan

คำตอบ:


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 (ค้นหาองค์ประกอบ 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 เป็นอาร์เรย์ของเส้นและส่งคืนอาร์เรย์ของเส้น

แม้ว่าคำตอบนี้จะถูกเอาชนะไปแล้ว แต่ฉันต้องการอธิบายเพราะมันไม่ได้เป็นกรณีพิเศษที่ตัวประกอบสเกลมีค่าน้อยกว่าหนึ่ง

มันทำให้hโดยwเมทริกซ์ที่และh = ceiling(map height / scale factor)w = ceiling(map width / scale factor)

สำหรับทุกดัชนี (x, y) ในเมทริกซ์ให้ทำ:

  • ใช้ submatrix จากพิกัดที่จะint(x * scale factor), int(y * scale factor)ceil((x + 1) * scale factor), ceil((y + 1) * scale factor)
  • ใส่อักขระที่พบบ่อยที่สุดใน submatrix นั้นที่ (x, y)

ลองออนไลน์!

ลองกรณีทดสอบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.