कुछ हिमपात करो!


18

आपका काम: एनओटी गहराई के लिए एक कोच हिमपात का एक खंड उत्पन्न। आपको एक पूर्ण कोच स्नोफ्लेक बनाने की आवश्यकता नहीं है, शुरुआती त्रिकोण का सिर्फ एक पक्ष। कोच गुच्छे पर विकिपीडिया: https://en.wikipedia.org/wiki/Koch_snowflake

नियम:

  • कार्यक्रम को एनओएच गहराई तक कोच हिमपात का एक हिस्सा उत्पन्न करना होगा।
  • आउटपुट ASCII होना चाहिए।
  • आप पूरे स्नोफ्लेक उत्पन्न कर सकते हैं; इसकी आवश्यकता नहीं है।
  • इनपुट / आउटपुट और खामियों और सामान के लिए मानक नियम लागू होते हैं।
  • व्हॉट्सएप कोई फर्क नहीं पड़ता, जब तक कि यह सभी वर्ण एक-दूसरे के सापेक्ष सही जगह पर हों।
  • सबसे छोटा कोड जीतता है!

परीक्षण के मामलों:

n = 0:

__

n = 1:

__/\__

एन = 2:

      __/\__
      \    /
__/\__/    \__/\__

एन = 3:

                        __/\__
                        \    /
                  __/\__/    \__/\__
                  \                /
                  /_              _\
                    \            /
      __/\__      __/            \__      __/\__
      \    /      \                /      \    /
__/\__/    \__/\__/                \__/\__/    \__/\__

मुझे लगता है कि इसका मतलब बनता है। ध्यान दें कि प्रत्येक परीक्षण मामले में, भग्न को लंबाई में तीन भागों में विभाजित किया जा सकता है। यह भी ध्यान दें कि प्रत्येक बर्फ के टुकड़े की चौड़ाई बर्फ के टुकड़े की पिछली पीढ़ी की चौड़ाई से तीन गुना है।


FYI करें, यह सहमति हुई कि इस का एक शिकार नहीं है यह
कॉमरेड स्पार्कलपनी

मुझे नहीं लगता कि आपने उचित रूप से परिभाषित किया है कि nth कोच वक्र का उचित ASCII प्रतिनिधित्व क्या है।
orlp

मुझे यकीन नहीं है कि अनुपात समझ में आता है। नॉन-ड्यूप __/\__दो अंडरलाइन के साथ उपयोग किया जाता है , जो प्रत्येक पुनरावृत्ति को पिछले एक की तुलना में 3 गुना लगातार बड़ा बनाता है। केवल एक अंडरलाइन का उपयोग करने से विरोधाभास प्रतीत होता है जो n = 3 में वास्तव में अजीब होने लगते हैं। उदाहरण के लिए बाहरी भागों की चौड़ाई 12 है जबकि मध्य भाग की चौड़ाई केवल 10 है, जिसके परिणामस्वरूप /_और _\ जो बहुत अधिक तंग हैं। और इससे पहले भी आप _की चौड़ाई /और से दोगुनी है \
अर्जन जोहानसन

मुझे लगता है कि /_और _\ केवल वास्तव में घातक हिस्सा हैं - अंडरस्कोर को जाने की आवश्यकता है, क्योंकि उन्हें उसी स्थिति में रहने की आवश्यकता है जैसे कि /और \ । एक बार ऐसा करने के बाद, चीजें n = 1 से 3 गुना विस्तार कर सकती हैं (लेकिन n = 0 फिट नहीं होती है।)
Orjan Johansen

काश, नहीं, मध्य भाग में अभी भी बाहरी हिस्सों की चौड़ाई नहीं है, जैसा कि n = 3 की चौड़ाई 52 = 54 की बजाय 52 = 2 * 3 ^ 3 है। इनमें से किसी एक को आजमाएं । मैंने केवल n = 4 या n = 5 से दिखने वाले भागों के साथ उल्टा संस्करण शामिल किया है - वे ऊपर वाले से अलग हैं जहां अंडरस्कोर गिराए जाते हैं।
अर्जन जोहान्सन

जवाबों:


10

हास्केल , 308 300 299 बाइट्स

संपादन:

  • -4 बाइट्स: बदलने zipWith(+)के लिए zipWith(-)और समायोजित करने के एन्कोडिंग और ऑफसेट हर निषेध संकेत से छुटकारा मिल गया।
  • -1 बाइट: एन्कोडिंग को और मोड़ने से कई वैरिएबल नामों को अनुमति मिलती है जो सीधे पैटर्न मिलान के बजाय का #उपयोग करके गिराए जा सकते हैं r=reverse
  • -2 बाइट्स: के लिए अल्फ़ान्यूम के बजाय एक ऑपरेटर का उपयोग करना zipWith(-)
  • -1 बाइट: o=[0,0]सूची स्थिरांक को छोटा करना ।
  • -1 बाइट: की दो शाखाओं को मिलाना ?
import Data.List
k n=0?sort(o#(f=<<scanl1(+)(iterate(>>=(:[1,4,1]))[6]!!n)))
x?l@(([_,w],c):r)|x>w='\n':0?l|0<1=([2..w-x]>>" ")++[c|w>x]++w?r
_?_=""
w#((c,l):m)=(l&w,c):r l&(l&w)#m
_#_=[]
f x=zip"_/\\_/\\"([id,r]<*>[0:1:o,[0,1,0,1],o++[1,1]])!!mod x 6<$[1,3..gcd 3x]
(&)=zipWith(-)
r=reverse
o=[0,0]

इसे ऑनलाइन आज़माएं!(दुख की बात है कि n = 3 से बड़ा कुछ भी बुरी तरह से लिपटा और अपठनीय है, लेकिन आप इसे देखने के लिए किसी अन्य प्रोग्राम में कॉपी कर सकते हैं।)

बदलाव

यह काम किस प्रकार करता है

  • kमुख्य कार्य है, यह एक लेता है Int nऔर एक रिटर्न देता है String
  • iterate(>>=(:[1,4,1]))[6]प्रत्येक एन के लिए, एक अनंत सूची युक्त बनाता है, जो वक्र वक्रता में लगातार रेखाओं के बीच बदल जाता है , कछुए ग्राफिक्स शैली, संख्या के बीच 0और मुख्य रूप से 5। प्रत्येक पुनरावृत्ति केवल एक पिछले एक के साथ होती है जिसे 1,4,1इंटरलेय किया जाता है । एकमात्र कारण उप-सूचियों के साथ शुरू 6करने के बजाय 0बनाने के लिए है gcdमें चाल fसे बचने के काम f 0
  • scanl1(+)मॉडुलो अप करने के लिए "पूर्ण" दिशाओं में बदल जाता है। 6. 0इसका मतलब सही है, फिर प्रत्येक उच्च संख्या पिछले से 60 डिग्री वामावर्त है। (ठीक है, यह 60 डिग्री होगा अगर यह ASCII के बजाय एक उचित ड्राइंग था।)
  • f (चरित्र, ऑफसेट एन्कोडिंग) जोड़े की एक सूची में एक पूर्ण दिशा में धर्मान्तरित करता है जो वक्र को जोड़ने के लिए वर्णों को कूटबद्ध करता है (क्षैतिज दिशाओं के लिए यह दो जोड़े उत्पन्न करता है, अन्यथा एक), और सापेक्ष स्थिति कैसे बदलती है।
  • #(चरित्र, ऑफसेट एन्कोडिंग) जोड़े, वास्तविक (समन्वय, चरित्र) जोड़े पैदा करने की पिछली सूची के माध्यम से ऑपरेटर दोहराता।
  • एन्कोडिंग सिद्धांत:
    • _/\नाममात्र का एक चरित्र एक आरंभिक कोने से एक आयताकार सेल के माध्यम से एक अलग समापन कोने तक खींची गई रेखा का प्रतिनिधित्व करता है।
    • सेल निर्देशांक प्रपत्र के हैं [y,x], ऊपर से नीचे, बाएं से दाएं, ताकि वे उस क्रम में क्रमबद्ध हो जाएं जिसे हम उन्हें प्रिंट करना चाहते हैं। कॉलम 1-आधारित हैं। के साथ छोटे वेक्टर अंकगणित के लिए ट्यूपल्स के बजाय सूचियों का उपयोग किया जाता है (&)=zipWith(-)
    • एक कोने को उसी निर्देशांक के साथ निरूपित किया जाता है, जो [y,x]इसके ऊपरी बाएँ को कक्ष के रूप में समन्वयित करता है। यह सुनिश्चित करता है कि एक कोने से इसकी पड़ोसी कोशिकाओं तक के सभी स्रोत नकारात्मक हैं, नकारात्मक स्थिरांक से बचते हैं।
    • हालांकि, कोने के निर्देशांक को सभी वेक्टर ऑपरेशनों को परिवर्धन के बजाय घटाव होने की अनुमति देने के लिए नकारात्मक रूप से पारित किया जाता है, जो अन्य सभी स्पष्ट संकेतों से बचा जाता है।
    • एक ऑफसेट एन्कोडिंग सूची वह [y1,x1,x2,y2]जगह है जहां [y1,x1]प्रारंभिक कोने से चरित्र सेल तक समन्वयित ऑफसेट है और [y2,x2]अंत कोने से चरित्र कक्ष तक ऑफसेट है। इसका मतलब है की:
      • निर्देशों के लिए एन्कोडिंग सूचियाँ 3.. के लिए सूचियों के 5ठीक उलट हैं 0.. 2जिससे उन्हें उत्पन्न किया जा सके [id,r]<*>
      • सभी आवश्यक वेक्टर अंकगणित को (&)=zipWith(-)एन्कोडिंग सूची या इसके रिवर्स के साथ उपयोग करके किया जा सकता है ।
  • (समन्वय, चरित्र) जोड़े की सूची को छाँटने के बाद, उन्हें पास कर दिया जाता है ?, जो Stringउनसे फाइनल उत्पन्न करता है।
    • में x?l@(([_,w],c):r) xपिछले वर्ण इस लाइन पर दिखाया का x- निर्देशांक है, या 0एक लाइन की शुरुआत में अगर; lसंपूर्ण वर्तमान सूची है, wजो जोड़े जाने वाले अगले वर्ण का x- समन्वय cहै, वर्ण है, और rशेष सूची है।
    • इस स्तर पर y- निर्देशांक की अब आवश्यकता नहीं है। क्योंकि प्रत्येक पंक्ति में वर्ण होते हैं, और प्रत्येक पंक्ति का पहला वर्ण पिछले एक के अंत के बाईं ओर ठीक होता है, यदि x- समन्वय कम हो गया है, तो जाँच कर नई पंक्तियों की शुरुआत का पता लगाया जाता है।
    • अंडरस्कोर का ASCII से बड़ा मान है \और /इसलिए, यह अंतिम क्रम में हो जाता है अगर यह उसी स्थिति में किसी अन्य वर्ण के साथ ओवरलैप होता है। इस प्रकार एक निरर्थक अंडरस्कोर की जांच करके पता लगाया जाता है कि एक एक्स-समन्वय दोहराया गया है।

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