मानचित्र पर ज़ूम करना


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
मुझे लगता है कि आपको सैंडबॉक्स में कुछ और इंतजार करना चाहिए था।
एरिक आउटगॉल्फ़र

कोई @JonathonAllan यह नहीं, कि खंड पर अधिक कर रहे हैं चाहते हैं .की तुलना में O। हम दाईं ओर और नीचे की तरफ कट गए।
ओकेक्स

आह, "हम नीचे या दाईं ओर काटते हैं" से आपका मतलब है कि नक्शे का शीर्ष-बाएं हमेशा एक अनुभाग के शीर्ष-बाएं है?
जोनाथन एलन

@JonathanAllan हाँ।
ओकेक्स

ठीक है, शब्द "या" भ्रामक है :)
जोनाथन एलन

जवाबों:


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

परिणाम को 2 डी सरणी में समतल करें।

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

यदि पहला इनपुट 1 से कम नहीं है ...

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

विभाजन (दूसरा इनपुट) उन विभाजनों में है जिनकी चौड़ाई / लंबाई अधिकतम (प्रथम इनपुट) है।

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

स्तर 2 और स्तर 3 पर नक्शा ...

First@*Commonest

सामान्य फ़ंक्शन की संरचना (किसी सूची में सबसे सामान्य तत्व पाता है) और सबसे पहले (पहला तत्व लें; यदि कई सामान्य तत्व हैं)।


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), जहां मानचित्र लाइनों की एक सरणी है, और यह लाइनों की एक सरणी देता है।

हालांकि यह जवाब पहले ही पीटा जा चुका है, मैं इसे समझाना चाहता हूं, क्योंकि यह कोई विशेष मामला नहीं है जहां स्केल फैक्टर एक से कम हो।

यह एक मैट्रिक्स 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)
  • सबसे आम चरित्र को उस सबमेट्रिक्स में (x, y) पर रखें।

इसे ऑनलाइन आज़माएं!

परीक्षण मामलों की कोशिश करो

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.