एक ASCII हेक्सागोनल ग्रिड ड्रा और लेबल करें


12

में मेरे पिछले चुनौती , मैं ज्यादातर अलग-अलग (vim का दृश्य ब्लॉक मोड की मदद से) पहले चित्र आकर्षित किया। लेकिन निश्चित रूप से एक बेहतर तरीका होना चाहिए ...


दो आयामों, एक चौड़ाई और ऊंचाई के इनपुट को देखते हुए, ASCII कला में उन आयामों के साथ एक हेक्सागोनल ग्रिड का उत्पादन किया जाता है।

यहां इंट्रो में संदर्भित आरेख (मामूली संपादन के साथ) है, जो इनपुट के लिए आपका आउटपुट होना चाहिए width=7, height=3:

         _____         _____         _____
        /     \       /     \       /     \
  _____/ -2,-1 \_____/  0,-1 \_____/  2,-1 \_____
 /     \       /     \       /     \       /     \
/ -3,-1 \_____/ -1,-1 \_____/  1,-1 \_____/  3,-1 \
\       /     \       /     \       /     \       /
 \_____/ -2,0  \_____/  0,0  \_____/  2,0  \_____/
 /     \       /     \       /     \       /     \
/ -3,0  \_____/ -1,0  \_____/  1,0  \_____/  3,0  \
\       /     \       /     \       /     \       /
 \_____/ -2,1  \_____/  0,1  \_____/  2,1  \_____/
 /     \       /     \       /     \       /     \
/ -3,1  \_____/ -1,1  \_____/  1,1  \_____/  3,1  \
\       /     \       /     \       /     \       /
 \_____/       \_____/       \_____/       \_____/

कई बातें नोटिस करें:

  • चौड़ाई और ऊंचाई अनिवार्य रूप से एक दिए गए y और x के लिए क्रमशः कितने हेक्सागोन के बराबर हैं। ये हमेशा विषम संख्या में होंगे।

  • प्रत्येक षट्भुज को ASCII कला द्वारा दर्शाया गया है

      _____
     /     \
    /       \
    \       /
     \_____/
    

    लेकिन पड़ोसी हेक्सागोन्स के बीच सीमाओं को "साझा" किया जाता है।

  • निर्देशांक में अल्पविराम हमेशा शीर्ष किनारे के केंद्र से ठीक दो अक्षर नीचे होता है। X-निर्देशांक को कॉमा से पहले सीधे स्थित किया जाता है, और y- समन्वय के बाद सीधे।

    आप यह मान सकते हैं कि निर्देशांक कभी भी इतने बड़े नहीं होंगे कि वे षट्भुज की सीमाओं को ओवरलैप कर दें।

इनपुट को व्हाट्सएप के रूप में लिया जा सकता है- / अल्पविराम से अलग स्ट्रिंग, पूर्णांक का एक सरणी, या दो फ़ंक्शन / कमांडलाइन तर्क। आउटपुट एक स्ट्रिंग होना चाहिए (STDOUT के लिए, वापसी मूल्य, आदि के रूप में)।

चूंकि यह , बाइट्स में सबसे छोटा कोड जीत जाएगा।

उपरोक्त ग्रिड का उपयोग परीक्षण के मामले के रूप में किया जा सकता है। अधिकतम आकार का width=199, height=199ग्रिड यहां शामिल करने के लिए स्पष्ट रूप से अव्यावहारिक है, लेकिन पहले कुछ पंक्तियों और स्तंभों को निम्नलिखित की तरह दिखना चाहिए:

         _____         ___
        /     \       /   
  _____/-98,-99\_____/-96,
 /     \       /     \    
/-99,-99\_____/-97,-99\___
\       /     \       /   
 \_____/-98,-98\_____/-96,
 /     \       /     \    
/-99,-98\_____/-97,-98\___
\       /     \       /   
 \_____/-98,-97\_____/-96,
 /     \       /     \    
/-99,-97\_____/-97,-97\___
\       /     \       /   

जवाबों:


2

रूबी, 221 बाइट्स

->w,h{s=' '
a=(s*9+?_*5)*(w/2)+$/
(2-h*2).upto(h*2+3){|y|c=y<4-h*2 
a+=[b=c ?s:?\\,s+b,s,''][y%4]
(0-w/2).upto(w/2){|x|a+=["/#{h<y/2?s*7:"%3d,%-3d"}\\",s*7,?_*5,"/     \\"][(y+x*2+w)%4]%[x,y/4]}
a+='//  '[c ?3:y%4]+$/}
a}

परीक्षण कार्यक्रम में अपराजित

f=->w,h{
  s=' '                                #set s to space for golfing reasons
  a=(s*9+?_*5)*(w/2)+$/                #start building the output with a row of just _ and space

  (2-h*2).upto(h*2+3){|y|              #iterate 4 times for each row of hexagons, plus an extra 2 at the end to finish last row
    c=y<4-h*2                          #condition for first two rows
    a+=[b=c ?s:?\\,s+b,s,''][y%4]      #string to be output before main set of hexagons (spaces for top row, \ for certain other rows

    (0-w/2).upto(w/2){|x|              #iterate through hexagons on each row, 4 lines for each with the following printf type string
      a+=["/#{h<y/2?s*7:"%3d,%-3d"}\\",#line 1:contains ends / \ and numbers 
         s*7,                          #line 2 padding spaces
         ?_*5,                         #line 3 padding ___
         "/     \\"][(y+x*2+w)%4]%     #line 0 top of hexagon / \; formula to select string to be printed
           [x,y/4]                     #numbers to be printed (if format for current line does not require them they are ignored)
    }

    a+='//  '[c ?3:y%4]+$/             #ending alternates between / and space; / are suppressed for first two rows
  }
  a
}

puts g[7,3]
puts g[5,5]

उत्पादन

जैसा कि मैं डिबगिंग खत्म कर रहा था, मैंने कल्पना में एक अस्पष्टता देखी। जहां w+14 से विभाज्य है, पहले और अंतिम एक्स निर्देशांक विषम हैं, और कोई अस्पष्टता नहीं है। लेकिन जहां w-14 से विभाज्य है, वहां पहले और अंतिम x निर्देशांक भी हैं। मैंने यह मान लिया कि पहले और आखिरी कॉलम अगले लोगों के नीचे ऑफसेट होने चाहिए। लेकिन फिर मैंने पिछले प्रश्न को पढ़ा और उस मामले में नोट किया कि यह अजीब कॉलम था जिसे समान से नीचे ऑफसेट किया जाना चाहिए ( w-14 से विभाज्य के लिए ध्यान दें, यह दोनों करना संभव नहीं है।)

हालाँकि इस प्रश्न में कोई अंतर नहीं किया गया था। मैं इसे ओपी के फैसले तक छोड़ दूंगा और यदि आवश्यक हो तो फिर से काम कर सकता हूं, हालांकि मैं ऐसा नहीं करना चाहता हूं।

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