एक स्लाइडिंग पहेली में एक तस्वीर बनाओ


14

सारांश

इस चुनौती का लक्ष्य 15-पहेली / स्लाइडिंग पहेली का एक पूर्ववत छवि-संस्करण बनाना है जिसे फ्रेंच में टक्विन भी कहा जाता है ।

विवरण:

एक इनपुट से बना है:

  • एक छवि,
  • एक पूर्णांक n,
  • एक अन्य पूर्णांक r,

आपका कार्यक्रम, या फ़ंक्शन, या कुछ और जो फिट बैठता है, उसी छवि ( यानी समान आकार और प्रारूप) को इनपुट के रूप में आउटपुट करना होगा, लेकिन यह निम्न प्रक्रिया से गुजरता है:

  1. छवि को आयतों में विभाजित करें ,
  2. उन आयतों में से एक को हटा दें, बेतरतीब ढंग से,
  3. बिंदु (2.) से प्रभावित रेखा / स्तंभ से सन्निहित आयतों की एक यादृच्छिक संख्या को स्थानांतरित करें ताकि बनाया गया छेद भरा हो और एक अन्य इस रेखा / स्तंभ में उत्पन्न हो। यह संख्या हो सकती है 0यदि रिक्त एक कोने या किनारे पर हो।

rबार-बार (3.) बार।

स्पष्टीकरण:

  • यदि आप चरण (3.) में रेखा से आयताकार ले गए हैं, तो आपको अगले पुनरावृत्ति में कॉलम से आयताकार को स्थानांतरित करना होगा,
  • यदि आप एक पंक्ति-चरण में बाएँ-से-दाएँ आयतें स्थानांतरित करते हैं, तो उन्हें अगले पंक्ति-चरण में दाएँ-से-बाएँ ले जाया जाना चाहिए, जो स्तंभों के शीर्ष-से-नीचे और नीचे-से-शीर्ष के लिए समान हैं;
  • आप मान सकते हैं कि nचुना जाएगा इसलिए यह चित्र के किनारों की लंबाई को विभाजित करता है।

एक अंतिम बिंदु:

.gifपूरी प्रक्रिया को दिखाने वाले एक एनिमेटेड का बहुत स्वागत किया जाता है।

मैं निम्नलिखित चित्र (जो है 1024x768), के साथ n=16और r=100एक मॉडल के रूप में उपयोग करने का प्रस्ताव करता हूं , आप किसी अन्य चित्र का उपयोग कर सकते हैं (जब तक यह प्रासंगिक है और एसई के नियमों का अनुपालन करता है, निश्चित रूप से)।

ध्यान दें कि मानकों में खामियां लागू होती हैं।

यह , इसलिए छोटी सबमिशन जीत जाती है!

कुत्तों, बिल्लियों और बतख प्रेमियों को संतुष्ट होना चाहिए!

चूंकि एक उदाहरण का अनुरोध किया गया था, यहां एक है, "हाथ से", के साथ n=4औरr=1

चरण 1 और 2

यहाँ छवि विवरण दर्ज करें

चरण 3 : पंक्ति-वार, बाईं ओर 2 आयताकार

यहाँ छवि विवरण दर्ज करें


उदाहरण बताता है कि आयतों को समान आकार की आवश्यकता नहीं है, संपूर्ण छवि को कवर करने की आवश्यकता नहीं है, और मूल छवि पर खींची गई पंक्तियों को शामिल करना चाहिए। क्या आप इसे स्पष्ट कर सकते हैं या तो विनिर्देश या उदाहरण बदलकर?
ट्राइकोप्लाक्स

@trichoplax: उदाहरण को पेंट और त्वरितता के साथ हाथ से खींचा गया था। मैं इसे फिर से ठीक करूंगा।
फ्रैडरिक

@trichoplax: मुझे यह स्वीकार करना चाहिए कि मुझे आपकी बात पूरी तरह से नहीं आती है, लेकिन चुनौती को समझने के लिए इस उद्घाटन पंक्ति की आवश्यकता नहीं है, इसलिए मुझे लगता है कि इसे रखना बेकार है।
Frédéric

move a random number of contiguous rectanglesक्या यह 0 आयतें हो सकती हैं? (यह एक बदलाव होगा जब कार्यक्रम एक किनारे / कोने पर हो, तब व्यवहार को बदलने के लिए दर्द होगा)
जुंगवान मिन

@JungHwanMin: हाँ यह कर सकते हैं। अच्छी टिप्पणी, धन्यवाद!
फ्रैडरिक

जवाबों:


10

गणितज्ञ, 246 बाइट्स

ImageAssemble@(n=Nest)[k=RandomInteger;q=Reverse;({t,r}=1~k~2;q[o=n[q/@#&,#,r]&@*(n[#&,#,t]&)])[o@#/.{a___,b:_~RepeatedNull~k[Position[o@#,i][[1,2]]-1],i,c___}:>{a,i,b,c}]&,MapAt[(i=#~ImageAdd~1)&,#~ImagePartition~Scaled[1/#2],{1,#2}~k~2],#3]&

अनाम फ़ंक्शन। इसमें Mathematica के Transposeऑपरेटर के अनुरूप U + F3C7 शामिल है । यह फ़ंक्शन Imageऑब्जेक्ट लेता है और ऑब्जेक्ट लौटाता Imageहै।

नमूना एनीमेशन, के साथ n=16औरr=100

5000 पुनरावृत्तियों के बाद:

यहाँ छवि विवरण दर्ज करें(बड़े संस्करण के लिए छवि पर क्लिक करें)

व्याख्या

प्रारंभ

n=Nest

में Nestफ़ंक्शन (दोहराए जाने वाले ऑपरेशन) को स्टोर करें n

k=RandomInteger;q=Reverse;

स्टोर RandomIntegerमें समारोह k, और Reverseमें समारोह q

छवि को विभाजित करना

#~ImagePartition~Scaled[1/#2]

विभाजन छवि को (दूसरे इनपुट) ^ 2 टाइल्स में विभाजित करें।

{1,#2}~k~2

RandomInteger1 और दूसरे इनपुट के बीच दो एस उत्पन्न करें । यह एक यादृच्छिक टाइल का चयन करता है।

MapAt[(i=#~ImageAdd~1)&, ..., {1,#2}~k~2]

उस टाइल को सफेद कर दें। इसे स्टोर करें i

चलती हुई टाइलें

{t,r}=1~k~2

0 से 1 तक दो यादृच्छिक पूर्णांकों पैदा करता है और में उन्हें स्टोर tऔर rक्रमश:। यह बेतरतीब ढंग से दिशा का चयन करता है।

o=n[q/@#&,#,r]&@*(n[#&,#,t]&)

फ़ंक्शन को परिभाषित करें o: की संरचना

  1. एक फ़ंक्शन इनपुट tसमय ट्रांसपोज़िंग ।
  2. एक फ़ंक्शन प्रत्येक पंक्ति rसमय को उलट देता है।
ओ @ #

oइनपुट पर लागू करें ।

Position[o@#,i][[1,2]]

i(सफेद छवि) का कॉलम ढूंढें ।

k[ ... -1]

एक को घटाएं और 0 और उस संख्या के बीच एक यादृच्छिक पूर्णांक खोजें। यह बेतरतीब ढंग से चुनता है कि कितने टाइल को स्थानांतरित करना है।

o@#/.{a___,b:_~RepeatedNull~ ... ,i,c___}:>{a,i,b,c}

जब टाइलों की संख्या एक i(सफेद छवि) से पहले होती है , तो उनके स्थानों को स्विच करें।

(... q[o= ... ])[ ... ]

oफ़ंक्शन को उल्टा करें और उपरोक्त ऑपरेशन के परिणाम पर लागू करें। यह अन-रिवर्स करता है और इमेज को अन-ट्रांसजेंड करता है।

लूपिंग और इमेज असेंबली

(n=Nest)[ ... ,#3]

उपरोक्त प्रक्रिया (तीसरा इनपुट) बार दोहराएं।

ImageAssemble@

छवियों को एक साथ रखें।


1
अच्छा उत्तर ! विवरण के लिए धन्यवाद!
फ्रेडरिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.