एंबेडेड Hexagons!


18

आपका कार्य: पूर्णांक दिया nगया है, नीचे के नियमों के अनुसार, nth गहराई तक एक एम्बेडेड षट्भुज पैटर्न उत्पन्न करें।

एक एम्बेडेड षट्भुज का मूल आकार इस प्रकार है: ( n=0)

 __      
/  \
\__/

एंबेडेड Hexagons n=1और n=2:

  ____    
 /  \ \
/\__/  \
\      /
 \____/

    ________    
   /  \ \   \
  /\__/  \   \
 /\      /    \
/  \____/      \
\              /
 \            /
  \          /
   \________/

प्रत्येक पक्ष की लंबाई पिछली गहराई के समय दो में एक ही पक्ष की लंबाई 2 गुना है। ऊपर और नीचे की भुजाएँ 2 वर्ण लंबी होती हैं n=0और शेष 1 वर्ण लंबी होती हैं। नॉन टॉप-बॉटम साइड की लंबाई 2^nलंबी ( OEIS: A000079 ) होनी चाहिए और ऊपर और नीचे की साइड्स को रूल 2^(n+1)(उसी OEIS) को फॉलो करना चाहिए ।

वर्तमान हेक्सागोन्स 0-अनुक्रमित हैं, यदि आप चाहें तो 1-अनुक्रमित का उपयोग करने के लिए चुना जा सकता है।

यह , इसलिए सबसे छोटा उत्तर जीतता है!


@LuisMendo ठीक है, मैं नाम बदल दूंगा।
कॉमरेड स्पार्कलपनी

बड़े इनपुट को संभालना मुश्किल हो सकता है (उदाहरण 64)। की सीमा है n?
मैथ्यू रोह

@SIGSEGV n की कोई सीमा नहीं है।
कॉमरेड स्पार्कलपनी

1
हेक्सागोनी में एक जवाब देखने के लिए खुश हो जाएगा :))
श्री एक्सकोडर

1
हे, मेरे कोच वक्र सबमिशन के कछुए ग्राफिक्स यह भी कर सकते हैं (केवल पहला फ़ंक्शन बदल गया)। निश्चित रूप से इसके लिए बहुत लंबा है, हालांकि :)
अर्जन जोहान्सन

जवाबों:


10

चारकोल , 40 29 बाइट्स

11 बाइट्स ने अन्य ट्रिक्स के लिए लूप को फॉर-लूप में बदलकर @Neil को धन्यवाद दिया

FN«AX²ιβ×__β↓↘β←↙β↑←×__β↖β→↗β

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

स्पष्टीकरण (पुराना)

यह कार्यक्रम सबसे बड़ी षट्भुज बनाने के साथ शुरू होता है, और फिर छोटे लोगों को एक-एक करके लूप (1-अनुक्रमित) में करता है। संदर्भ के लिए, αइनपुट संख्या है, βवह चर है जिसमें समाहित है 2^(α-1)और ιलूप में पुनरावृत्त चर है।

Nα                        # Take input and store in α
Wα«                       # While α do:
 ×_X²ι                    #  Write "_"*(2**ι); this forms the top edge of the hexagon
 ↓                         #  Go down
 AX²⁻ι¹β                 #  Assign 2**(ι-1) to β
 ↘β←                       #  Write \ β times in a SE direction (top right edge) and then go left
 ↙β↑                       #  Write / β times in a SW direction (bottom right edge) and then go up
 ←×_X²ι                   #  Write the bottom edge
 ↖β→↗β                    #  Just like before, write the top and bottom left edges
 A⁻α¹α                    #  Decrement α
                          # Now the pointer is at the top left corner of the hexagon,
                          # from where the other smaller hexagons will soon be generated

मैंने देखा कि कोई "हैलो, वर्ल्ड!" चारकोल के लिए अभी तक कार्यक्रम। आपको इसे जोड़ना चाहिए।
mbomb007

@ mbomb007 क्या यह केवल तुच्छता का एक डुप्लिकेट नहीं होगा "यह भाषा अपने स्रोत फ़ाइल को प्रिंट करती है अगर इसमें कोई कमांड नहीं है" उत्तर?
नील

जब मैंने महसूस किया कि मैंने कुछ बाइट्स को बचा लिया ×_X²ιहै ×__β, और कुछ और बाइट्स को एक में परिवर्तित करके , जो कि इनपुट नंबर को स्टोर करने से भी बचता है। इसे ऑनलाइन आज़माएं!
नील

@ नील धन्यवाद, यह बहुत साफ है :)
Kritii Lithos

5

हास्केल , 230 217 207 बाइट्स

संपादित करें:

  • -13 बाइट्स: @xnor ने देखा कि मेरा #बस हो सकता है max
  • -10 बाइट्स: और यह भी कि zipWithऔर pएक ?ऑपरेटर में विलय किया जा सकता है , और यह कि मैं (किसी भी तरह!) को लागू किया गया replicate

mएक लेता है Integerऔर एक रिटर्न देता है String

m n=unlines.foldr1 o$((2^n)&).(2^)<$>[0..n]
l&t|a<-c[l,2*t]" _",b<-[c[l-i,1,2*t+2*i-2,1,l-i]" / \\ "|i<-[1..t]]=a:b++r(r<$>o[a]b)
c=(concat.).z replicate
o=max?' '?""
f?e=z f.(++repeat e)
r=reverse
z=zipWith

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

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

  • mमुख्य कार्य है। यह &उचित पैडिंग के साथ हेक्सागोन्स उत्पन्न करने के लिए उपयोग करता है, फिर उन्हें एक साथ सिलवटों में बदल देता है o
  • l&tलाइनों की सूची के रूप में, tसाइड की लंबाई के एक बड़े हिस्से के अंदर गद्देदार पक्ष की लंबाई का एक छोटा षट्भुज बनाता है । lString
    • a अंडरस्कोर के साथ षट्भुज की शीर्ष रेखा है।
    • bषट्भुज के ऊपरी आधे भाग में अन्य रेखाओं की सूची है। की पंक्तियों bको पैडिंग में केंद्रित किया गया है, जो आयताकार है; यह अगले चरण को काम करने की अनुमति देता है।
    • षट्भुज के नीचे आधा है aके शीर्ष पर आच्छादित bसाथ o, तो उलट (लाइनों के दोनों आदेश और प्रत्येक पंक्ति के भीतर)।
  • cदो तर्क, लंबाई और एक स्ट्रिंग की एक सूची लेता है, और एक स्ट्रिंग उत्पन्न करता है जिसकी मूल लंबाई के अनुसार प्रत्येक वर्ण की कई प्रतियां होती हैं, जैसे c[1,3,2]"abc" == "abbbcc"। इसका उपयोग &लाइनों को उत्पन्न करने के लिए किया जाता है ।
  • o चित्रों को रेखाओं की सूची के रूप में दर्शाने वाले दो तर्क देते हैं, और पहले को ओवरलैप करते हैं, दूसरे के ऊपर एक को छोटा करते हैं।
    • इसका उपयोग दोनों हेक्सागोन को संयोजित करने और प्रत्येक षट्भुज के नीचे तल को जोड़ने के लिए किया जाता है।
    • यह अनिवार्य रूप से ?दो बार का उपयोग करके पहली तस्वीर को असीम रूप से कई स्थानों के साथ नीचे और दाएं दोनों तरफ से पैड करने के लिए उपयोग करता है , फिर साथ में संबंधित वर्णों को एक साथ जोड़ देता है max, जो एक होने पर गैर-स्थान वर्ण का चयन करता है।
  • (f?e)l mlअसीम रूप से कई 'ई' तत्वों को जोड़कर एक सूची तैयार करता है, फिर परिणामी सूची और फ़ंक्शन के mसाथ सूची को ज़िप fकरता है।

1
अच्छा समाधान! मुझे लगता है कि (#)हो सकता है max
xnor

1
ज़िप को pबाइट्स को बचाने के साथ जोड़ा जा सकता है o=max?' '?"";f?e=z f.(++repeat e):। कम पॉइंटफ्री हो सकता है।
xnor

2
(\n->(<$[1..n]))है replicate
xnor

@xnor replicate? अब यह सिर्फ शर्मनाक है। मैं भी बस <$[1..n]या [1..n]>>लगभग हमेशा जीतने के लिए उपयोग किया जाता हूं । हालाँकि, मैं नहीं देखता कि ?आगे कैसे छोटा किया जाए। मैं पहले से ही pपॉइंटफ्री बनाने की कोशिश कर रहा हूं और ++बस गलत जगह है, चीजों को उड़ाना flip
अर्जन जोहान्सन

3

जावास्क्रिप्ट (ईएस 6), 258 बाइट्स

f=(n,s=` `.repeat(1<<n),p=(n?f(n-1):`


`).replace(/(.*)\n/g,s+`$1 `+s)+s,t=`_`.repeat(2<<n))=>(s+t+s+`
`+s.replace(/ /g,"$'/$'$'  $`$`$`$`\\$'\n")).replace(/ /g,(c,i)=>p[i+(1<<n>>1)])+s.replace(/ /g,"$`\\$`$`  $'$'$'$'/$`\n").replace(/ +\/( *)\n$/,t+`/$1
`)
<input type=number min=0 oninput=o.textContent=f(+this.value)><pre id=o>

स्पष्टीकरण: पहले के बाद के हेक्सागोन्स के लिए, पिछली हेक्सागोन पहले उत्पन्न होता है और प्रत्येक तरफ पैडेड होता है (यह आउटपुट आयत होने पर निर्भर करता है)। (पहली हेडिंग के लिए, कुछ डमी पैडिंग बनाई गई है।) हेक्सागोन के ऊपरी और ऊपरी हिस्से उत्पन्न होते हैं, और सभी रिक्त स्थान पिछले हेक्सागोन में विलय हो जाते हैं। (हेक्सागोंस को लाइन में लाने के लिए कुछ प्रवंचना है; यह आसान होगा यदि अतिरिक्त मार्जिन की अनुमति दी गई है।) हेक्सागोन के नीचे के पक्षों को ऊपर की तरफ समान रूप से उत्पन्न किया जाता है, और हेक्सागोन के नीचे तब भरा जाता है। काम के लिए पुनरावृत्ति के लिए एक अनुगामी न्यूलाइन सहित आयताकार आउटपुट को वापस करने के लिए देखभाल की जानी चाहिए।


तो, आप यह प्रदर्शित कर रहे हैं कि यह टेफ्लॉन वन और डीप डिश पिज्जा, सभी वास्तव में समान निर्माण हैं? यह थोड़े साफ है।
AdmBorkBork

1
@AdmBorkBork मेरे पास कुछ अन्य उत्तर हैं जो ऐसा करते हैं; उन विकर्ण /एस ASCII कला में लोकप्रिय हैं और replaceविधि उन्हें जावास्क्रिप्ट में बनाने का एक अपेक्षाकृत सस्ता तरीका है।
नील

1<<n>>1: अच्छी समरूपता ;-)
ल्यूक

@ ल्यूक मैं चर को बदल सकता हूं, कह सकता हूं, vलेकिन दुख की बात यह 1है कि मेरे किसी भी सामान्य फोंट में सममित नहीं है।
नील

2

PHP, 337 बाइट्स

0 अनुक्रमण

$h=array_fill(0,1+2*$v=2**($c=$argn),str_pad("",4*$v));for(;1+$c;$c--)for($i=0;$i<$e=2**$c*2+1;$i++){$z=$e-$i<2;$y=$i&&$i<$e/2;$x=$i>=$e/2&$i<$e-1;$h[$i]=substr_replace($h[$i],$s=str_pad(!$y?$z|$x?"\\":"":"/",$e-1+$z-$y+$y*$i*2-$x+$x*2*($e-$i),$z|!$i?"_":" ").(!$y?$z|$x?"/":"":"\\"),$v-$z-$y*$i-$x*($e-$i),strlen($s));}echo join("\n",$h);

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

विस्तारित

$h=array_fill(0,1+2*$v=2**($c=$argn),str_pad("",4*$v)); # fill array with maximal width
for(;1+$c;$c--)  # greatest hexagon to lowest
for($i=0;$i<$e=2**$c*2+1;$i++){ # loop through the rows
    $z=$e-$i<2;$y=$i&&$i<$e/2;$x=$i>=$e/2&$i<$e-1; # booleans last first ad second half
    $h[$i]=substr_replace($h[$i], # replace substring
    $s=str_pad(
        $z?"\\":($y?"/":($x?"\\":"")),
        $e-1+$z-$y+$y*$i*2-$x+$x*2*($e-$i),
        $z|!$i?"_":" "
        ).(!$z?!$y?$x?"/":"":"\\":"/"), # with string for smaller hexagon
    $v-$z-$y*$i-$x*($e-$i), # at offset
    strlen($s));
}
echo join("\n",$h); # Output
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.