शैतान की सीढ़ी खींचें


46

शैतान की सीढ़ी एक भग्न-तरह कैंटर सेट से संबंधित कार्य है।

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

आपका काम इस कायरता कार्य को दोहराने के लिए है - ASCII कला में!

इनपुट

एक एकल पूर्णांक n >= 0, आउटपुट के आकार को दर्शाता है। इनपुट STDIN, फ़ंक्शन तर्क या कमांड-लाइन तर्क के माध्यम से दिया जा सकता है।

उत्पादन

आकार में डेविल की सीढ़ी के ASCII- कला प्रतिपादन n, या तो एक स्ट्रिंग के रूप में लौटे या STDOUT में मुद्रित। प्रत्येक पंक्ति के अंत में अनुगामी रिक्त स्थान ठीक हैं, लेकिन प्रमुख स्थान नहीं हैं। आप वैकल्पिक रूप से एक एकल अनुगामी न्यूलाइन प्रिंट कर सकते हैं।

आकार के लिए 0, आउटपुट सिर्फ:

x

(यदि आप चाहें, तो आप स्थान के अलावा किसी अन्य मुद्रण योग्य ASCII वर्ण का उपयोग कर सकते हैं x।)

आकार के लिए n > 0, हम:

  • आकार का आउटपुट लें n-1और प्रत्येक पंक्ति को तीन के एक कारक से बढ़ाएं
  • एकल xएस की पंक्तियों के बीच दरार
  • पंक्तियों को दाहिनी ओर शिफ्ट करें ताकि xप्रत्येक कॉलम में एक समान हो, और xपंक्तियों के साथ घटते समय पहले की स्थिति न्यूनतम हो

उदाहरण के लिए, इसके लिए आउटपुट n = 1है:

    x
 xxx
x

आउटपुट प्राप्त करने के लिए n = 2, हम प्रत्येक पंक्ति को तीन के एक कारक से बढ़ाते हैं:

            xxx
   xxxxxxxxx
xxx

एकल xकी पंक्तियों के बीच दरार :

x
            xxx
x
   xxxxxxxxx
x
xxx
x

दाईं ओर शिफ्ट करें:

                  x
               xxx
              x
     xxxxxxxxx
    x
 xxx
x

एक अन्य उदाहरण के रूप में, यहाँ है n = 3

स्कोरिंग

यह कोड-गोल्फ है, इसलिए सबसे कम बाइट्स में समाधान जीतता है।

जवाबों:


7

अजगर, ३०

jb_u+G+*leGd*HNu+N+^3hTNUQ]1]k

यह एक प्रोग्राम है जो STDIN से इनपुट लेता है और कैंटर सेट को खोजने के लिए grc की विधि का उपयोग करता है। वक्र को प्रदर्शित करने के लिए "वर्ण का उपयोग करता है।

इसे यहाँ ऑनलाइन आज़माएँ।

स्पष्टीकरण:

मैं कोड को दो भागों में समझाऊंगा, पहला, कैंटर सेट जनरेशन:

u+N+^3hTNUQ]1
u        UQ]1         : reduce( ... , over range(input), starting with [1])
 +N                   : lambda N,T: N + ...
   +^3hTN             : 3 ** (T+1) + N   (int + list in pyth is interpreted as [int] + list)

और आउटपुट स्वरूपण:

jb_u+G+*leGd*HN    ]k
jb_                    : "\n".join(reversed(...)
   u               ]k  : reduce(lambda G,H: ... , over cantor set, starting with [""])
    +G+*leGd           : G + len(G[-1]) * " " + ...
            *HN        : H * '"'

ध्यान दें कि डिफ़ॉल्ट रूप से pyth N = '"में।


32

जे ( 73 68 58 41 39 38 35 34 अक्षर)

कुछ समय के लिए समस्या के बारे में सोचने के बाद, मुझे शैतान के सीढ़ी पैटर्न को उत्पन्न करने का एक अलग तरीका मिला। इसके स्पष्टीकरण सहित पुराने उत्तर को हटा दिया गया है, आप इस उत्तर के संशोधनों पर गौर कर सकते हैं कि यह कैसा था।

यह उत्तर शैतान की सीढ़ी का प्रतिनिधित्व करने वाले रिक्त स्थान और शार्प की एक सरणी देता है।

' #'{~1(]|.@=@#~[:,3^q:)2}.@i.@^>:

इसका उत्तर स्पष्ट संकेतन में इसके दो भागों में विभाजित है:

f =: 3 : '|. = (, 3 ^ 1 q: y) # y'
g =: 3 : '(f }. i. 2 ^ >: y) { '' #'''

व्याख्या

दृष्टिकोण थोड़ा अलग है, इसलिए निरीक्षण करें और आश्चर्यचकित हो जाएं।

  1. >: 3 - तीन वेतन वृद्धि, यानी

    4
    
  2. 2 ^ >: 3 - दो की शक्ति में तीन वृद्धि,

    16
    
  3. i. 2 ^ >: 3- पहला 2 ^ >: 3पूर्णांक, जो है,

    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
    
  4. }. i. 2 ^ 4- पहला 2 ^ >: 3पूर्णांक, माथे, यानी,

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
    

    इस क्रम को कहते हैं s; fअब हम प्रवेश करते हैं।

  5. 1 q: s- प्रत्येक आइटम के प्रमुख अपघटन में 2 के प्रतिपादक s। सामान्य तौर पर, के प्रमुख अपघटन में x q: yपहले xprimes के लिए घातांक की एक तालिका प्राप्त होती है y। यह प्रदान करता है:

    0
    1
    0
    2
    0
    1
    0
    3
    0
    1
    0
    2
    0
    1
    0
    
  6. 3 ^ 1 q: s - इन घातांक की शक्ति से तीन, अर्थात्,

     1
     3
     1
     9
     1
     3
     1
    27
     1
     3
     1
     9
     1
     3
     1
    
  7. , 3 ^ 1 q: s- पिछले परिणाम के रवेल (यानी संरचना के साथ तर्क ध्वस्त हो गया)। इसकी आवश्यकता है क्योंकि q:एक अवांछित अनुगामी अक्ष का परिचय देता है। यह प्रदान करता है

     1 3 1 9 1 3 1 27 1 3 1 9 1 3 1
    
  8. (, 3 ^ 1 q: s) # s- sपिछले परिणाम में संबंधित आइटम के रूप में अक्सर दोहराया जाने वाला प्रत्येक आइटम , यानी,

    1 2 2 2 3 4 4 4 4 4 4 4 4 4 5 6 6 6 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 10 10 10 11 12 12 12 12 12 12 12 12 12 13 14 14 14 15
    
  9. = (, 3 ^ 1 q: s) # s - पिछले परिणाम का स्व वर्गीकरण, यह एक मैट्रिक्स है जहां प्रत्येक पंक्ति तर्क के अनूठे आइटमों में से एक का प्रतिनिधित्व करती है, प्रत्येक कॉलम तर्क के संबंधित आइटम का प्रतिनिधित्व करता है और प्रत्येक सेल प्रतिनिधित्व करता है कि क्या पंक्ति और स्तंभ के आइटम समान हैं, अर्थात्,

    1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
    
  10. |. = (, 3 ^ 1 q: s) # s - पिछला परिणाम ऊर्ध्वाधर अक्ष के साथ फ़्लिप किया गया।

  11. (|. = (, 3 ^ 1 q: s) # s) { ' #'- पिछले परिणाम की वस्तुओं को सरणी में सूचक के रूप में उपयोग किया जाता है ' #', इसलिए 0इसे बदल दिया जाता है  और 1इसके द्वारा प्रतिस्थापित किया जाता है #, अर्थात

                                                                    #
                                                                 ### 
                                                                #    
                                                       #########     
                                                      #              
                                                   ###               
                                                  #                  
                       ###########################                   
                      #                                              
                   ###                                               
                  #                                                  
         #########                                                   
        #                                                            
     ###                                                             
    #      
    

    परिणाम हम चाहते हैं।


1 बाइट के (,],~3^#@~.)@]बजाय पावर लूप के अंदर (1,[:,1,"0~3*])। और अगर आप !आउटपुट चार के रूप में एक और एक u:32+को ' #'{~बचाने के बजाय ठीक कर रहे हैं ।
यादृच्छिक

#\ के बजाय i.@#और आप APL से आगे निकल गए! :)
19

आपका दूसरा समाधान काम नहीं करता है क्योंकि एक टोपी की आवश्यकता होगी, लेकिन मुझे एपीएल को हरा करने का एक और तरीका मिला।
FUZxxl

नया आउटपुट n-1नहीं के लिए सीढ़ी है n
यादृच्छिक

@randomra आह ... वह शालीन है। मुझे यह देखने दें कि क्या यह ठीक करने योग्य है।
FUZxxl

26

हेक्सागोनी , 217 बाइट्स

यह बेहद मजेदार था। इस चुनौती को पोस्ट करने के लिए धन्यवाद।

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

){_2"_{\"{{""}"{'2//_.\><*\"\/_><[\]/3\'\_;|#__/(\2\'3_'}(#:|{$#{>_\//(#={/;01*&"\\_|[##={|}$_#></)]$_##|){*_.>.(/?#//~-="{}<_"=#/\}.>"%<.{#{x\"<#_/=&{./1#_#>__<_'\/"#|@_|/{=/'|\"".{/>}]#]>(_<\'{\&#|>=&{{(\=/\{*'"]<$_

हेक्सागोनली से बाहर निकलना:

        ) { _ 2 " _ { \ "
       { { " " } " { ' 2 /
      / _ . \ > < * \ " \ /
     _ > < [ \ ] / 3 \ ' \ _
    ; | # _ _ / ( \ 2 \ ' 3 _
   ' } ( # : | { $ # { > _ \ /
  / ( # = { / ; 0 1 * & " \ \ _
 | [ # # = { | } $ _ # > < / ) ]
$ _ # # | ) { * _ . > . ( / ? # /
 / ~ - = " { } < _ " = # / \ } .
  > " % < . { # { x \ " < # _ /
   = & { . / 1 # _ # > _ _ < _
    ' \ / " # | @ _ | / { = /
     ' | \ " " . { / > } ] #
      ] > ( _ < \ ' { \ & #
       | > = & { { ( \ = /
        \ { * ' " ] < $ _

कार्यक्रम वास्तव में #निर्देश का उपयोग नहीं करता है , इसलिए मैंने उस चरित्र का उपयोग यह दिखाने के लिए किया कि कौन सी कोशिकाएं वास्तव में अप्रयुक्त हैं।

यह कार्यक्रम कैसे काम करता है? वह निर्भर करता है। क्या आप छोटा संस्करण चाहते हैं, या लंबा?

संक्षिप्त व्याख्या

निम्नलिखित स्पष्टीकरण में "लाइन" और "सेगमेंट" से मेरा क्या मतलब है, यह समझाने के लिए, इच्छित आउटपुट के इस विच्छेदन पर विचार करें:

segments →
 │   │ │         │ │   │x   lines
─┼───┼─┼─────────┼─┼───┼─     ↓
 │   │ │         │ │xxx│
─┼───┼─┼─────────┼─┼───┘
 │   │ │         │x│
─┼───┼─┼─────────┼─┘
 │   │ │xxxxxxxxx│
─┼───┼─┼─────────┘
 │   │x│
─┼───┼─┘
 │xxx│
─┼───┘
x│

उस व्याख्या के साथ, यह कार्यक्रम निम्नलिखित छद्मकोश से मेल खाता है:

n = get integer from stdin

# Calculate the number of lines we need to output.
line = pow(2, n+1)

while line > 0:
    line = line - 1

    # For all segments except the last, the character to use is spaces.
    ch = ' ' (space, ASCII 32)

    # The number of segments in each line is
    # equal to the line number, counting down.
    seg = line

    while seg > 0:
        seg = seg - 1

        # For the last segment, use x’s.
        if seg = 0:
            ch = 'x' (ASCII 120)

        # Calculate the actual segment number, where the leftmost is 1
        n = line - seg

        # Output the segment
        i = pow(3, number of times n can be divided by 2)
        i times: output ch

    output '\n' (newline, ASCII 10)

end program

लंबी व्याख्या

कृपया इस रंग-कोडित कोड पथ आरेख को देखें।

निष्पादन पथ

शीर्ष बाएं कोने में निष्पादन शुरू होता है। निर्देशों ){2'"''3''"2}?)का अनुक्रम "{एक बहुत ही जटिल मार्ग का अनुसरण करके निष्पादित किया जाता है (साथ ही कुछ अनावश्यक निरस्तीकरण, आदि)। हम इंस्ट्रक्शन पॉइंटर # 0 से शुरू करते हैं, जिसे क्रिमसन में हाइलाइट किया गया है। आधे रास्ते में, हम # 1 पर स्विच करते हैं, शीर्ष-दाएं कोने में शुरू करते हैं और वन ग्रीन में चित्रित होते हैं। जब आईपी # 2 कॉर्नफ्लॉवर ब्लू (मध्य दाएं) में शुरू होता है, तो मेमोरी लेआउट यह है:

मेमोरी लेआउट

पूरे कार्यक्रम के दौरान, 2 ए और 2 बी लेबल वाले किनारों का हमेशा मान होगा 2(हम उन्हें 2ⁿ⁺¹ की गणना करने के लिए और क्रमशः 2 से विभाजित करने के लिए उपयोग करते हैं) और 3 लेबल वाले किनारे हमेशा रहेंगे 3(हम उपयोग करते हैं कि 3ⁱ की गणना करें)।

हम अपने पहले लूप में प्रवेश करते ही व्यापार को प्राप्त कर लेते हैं, जिसे कॉर्नफ्लावर ब्लू में हाइलाइट किया जाता है। यह लूप (}*{=&}{=मान 2 exec की गणना करने के निर्देशों को निष्पादित करता है । जब लूप निकल जाता है, तो काठी भूरा रास्ता ले लिया जाता है, जो हमें निर्देश सूचक # 3 पर ले जाता है। यह आईपी केवल गोल्डनरोड पीले रंग में पश्चिम की ओर नीचे किनारे के साथ डबल्स करता है और जल्द ही आईपी # 4 को नियंत्रित करता है।

फुचिया पथ इंगित करता है कि कैसे आईपी # 4, नीचे बाईं ओर शुरू, तेजी से क्षय रेखा के लिए आगे बढ़ता है , ch को 32(स्थान वर्ण) और seg to (नया मूल्य) रेखा पर सेट करता है । यह शुरुआती गिरावट के कारण है कि हम वास्तव में 2− eventually 1 से शुरू करते हैं और अंततः मूल्य 0. के साथ एक अंतिम पुनरावृत्ति का अनुभव करते हैं। हम फिर पहले नेस्टेड लूप में प्रवेश करते हैं ।

हम अपना ध्यान उस ब्रिगेड इंडिगो की ओर मोड़ते हैं, जहाँ, seg की थोड़ी कमी के बाद , हम ch को xकेवल तभी अपडेट करते हुए देखते हैं, जब seg अब शून्य है। बाद में, n को लाइन में सेट किया जाता है - हम जिस सेगमेंट में हैं उसकी वास्तविक संख्या निर्धारित करने के लिए। तुरंत हम एक और लूप दर्ज करते हैं, इस बार टमाटर के उचित रंग में।

यहां, हम यह पता लगाते हैं कि n कितनी बार n (वर्तमान खंड संख्या) 2 से विभाजित किया जा सकता है। जब तक मॉडुलो हमें शून्य देता है, हम वृद्धि करते हैं I और n को 2 से विभाजित करते हैं। जब हम संतुष्ट होते हैं तो n अब इस तरह से विभाज्य नहीं है , हम स्लेट ग्रे में शाखा करते हैं, जिसमें दो लूप होते हैं: पहले यह 3 की शक्ति बढ़ाता है I हमने गणना की, और फिर यह कई बार ch आउटपुट करता है। गौर करें कि इनमें से पहले छोरों में ए[निर्देश, जो आईपी # 3 पर नियंत्रण स्विच करता है - वह जो केवल नीचे के किनारे के साथ बच्चे के कदम उठा रहा था। लूप के शरीर (3 से गुणा और घटते हुए) को एक अकेला आईपी # 3 द्वारा निष्पादित किया जाता है, जो कोड के निचले किनारे के साथ एक अंतहीन अंधेरे जैतून के हरे चक्र में कैद है। इसी तरह, इन स्लेट ग्रे लूप्स के दूसरे हिस्से में एक ]निर्देश है, जो आईपी # 5 को आउटपुट और डिक्रीमेंट को सक्रिय करता है, जो यहां गहरे भारतीय लाल में दिखाया गया है। दोनों मामलों में, सेवा में फंसे उन इंस्ट्रक्शन पॉइंटर्स को आज्ञाकारी रूप से एक समय में एक पुनरावृत्ति निष्पादित करते हैं और आईपी # 4 पर वापस नियंत्रण प्राप्त करते हैं, केवल एक बार फिर से उनकी सेवा के लिए पल को बांधने के लिए। इस बीच, स्लेट ग्रे, इसके फ्यूशिया और इंडिगो ब्रेट्रेन के साथ जुड़ जाता है।

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


8
अब यह केवल सादे पुराने जमाने की पागलपन है।
फ़ूजएक्सएक्सएल

21

अजगर 2, 78

L=[1]
i=3
exec"L+=[i]+L;i*=3;"*input()
while L:x=L.pop();print' '*sum(L)+'x'*x

सूची से शुरू करते हुए L=[1], हम इसे डुप्लिकेट करते हैं और बीच में 3 की अगली शक्ति सम्मिलित करते हैं, जिसके परिणामस्वरूप [1, 3, 1]। यह nहमें शैतान की सीढ़ी के लिए पंक्ति की लंबाई देने के लिए दोहराया जाता है । फिर हम प्रत्येक पंक्ति को रिक्त स्थान के साथ पैडेड प्रिंट करते हैं।


20

एपीएल, ३,

⊖↑'x'/⍨¨D,⍨¨0,¯1↓-+\D←{1,⍨∊1,⍪3×⍵}⍣⎕,1

उदाहरण:

      ⊖↑'x'/⍨¨D,⍨¨0,¯1↓-+\D←{1,⍨∊1,⍪3×⍵}⍣⎕,1
⎕:
      2
                  x
               xxx 
              x    
     xxxxxxxxx     
    x              
 xxx               
x   

स्पष्टीकरण:

⊖↑'x'/⍨¨D,⍨¨0,¯1↓-+\D←{1,⍨∊1,⍪3×⍵}⍣⎕,1

                                     ⎕       ⍝ read a number from the keyboard
                       {           }⍣ ,1      ⍝ apply this function N times to [1]
                               3×⍵           ⍝ multiply each value by 3
                           ∊1,⍪               ⍝ add an 1 in front of each value
                        1,⍨                  ⍝ add an 1 to the end
                     D←                      ⍝ store values in D (lengths of rows)
                   +\                        ⍝ get running sum of D
                  -                          ⍝ negate (negative values on / give spaces)
             0,¯1↓                           ⍝ remove last item and add a 0 to the beginning
                                             ⍝ (each row needs offset of total length of preceding rows)   
         D,⍨¨                                ⍝ join each offset with each row length
   'x'/⍨¨                                    ⍝ get the right number of x-es and spaces for each row
 ↑                                           ⍝ make a matrix out of the rows
⊖                                            ⍝ mirror horizontally 

यह एक अच्छा उपाय है।
FUZxxl

20
मुझे पसंद है कि कोड की व्याख्या एक शैतान की सीढ़ी की तरह दिखती है।
एलेक्स ए।

मुझे एक छोटा APL समाधान मिला।
FUZxxl

14

GNU सेड, 142

सबसे छोटा जवाब नहीं है, लेकिन इसका sed !:

s/$/:/
:l
s/x/xxx/g
s/:/:x:/g
tb
:b
s/^1//
tl
s/:x/X/g
s/^/:/
:m
s/.*:([Xx]+)Xx*:$/&\1:/
tm
:n
s/([ :])[Xx](x*Xx*)/\1 \2/g
tn
s/:/\n/g
s/X/x/g

क्योंकि यह sed (कोई मूल अंकगणित) नहीं है, मैं "एक एकल पूर्णांक n> = 0 नियम के साथ स्वतंत्रता ले रहा हूं , जो आउटपुट के आकार को दर्शाता है" । इस स्थिति में इनपुट पूर्णांक 1s का स्ट्रिंग होना चाहिए , जिसकी लंबाई n है। मुझे लगता है कि यह आउटपुट के आकार को "इंगित" कर रहा है , भले ही यह n के बराबर प्रत्यक्ष संख्यात्मक नहीं है। इस प्रकार n = 2 के लिए, इनपुट स्ट्रिंग होगी 11:

$ echo 11 | sed -rf devils-staircase.sed

                  x
               xxx
              x
     xxxxxxxxx
    x
 xxx
x

$ 

यह O (c n ) के घातीय समय जटिलता के साथ पूरा होता प्रतीत होता है , जहाँ c लगभग 17 है। n = 8 ने मेरे लिए लगभग 45 मिनट का समय लिया।


वैकल्पिक रूप से यदि यह आवश्यक है कि n संख्यात्मक रूप से ठीक दर्ज किया गया है, तो हम यह कर सकते हैं:

सेड, 274 बाइट्स

s/[0-9]/<&/g
s/9/8Z/g
s/8/7Z/g
s/7/6Z/g
s/6/5Z/g
s/5/4Z/g
s/4/3Z/g
s/3/2Z/g
s/2/1Z/g
s/1/Z/g
s/0//g
:t
s/Z</<ZZZZZZZZZZ/g
tt
s/<//g
s/$/:/
:l
s/x/xxx/g
s/:/:x:/g
tb
:b
s/^Z//
tl
s/:x/X/g
s/^/:/
:m
s/.*:([Xx]+)Xx*:$/&\1:/
tm
:n
s/([ :])[Xx](x*Xx*)/\1 \2/g
tn
s/:/\n/g
s/X/x/g

आउटपुट:

$ echo 2 | sed -rf devils-staircase.sed

                  x
               xxx
              x
     xxxxxxxxx
    x
 xxx
x

$ 

7
यह वास्ताव में अच्छा है।
फूजएक्सएक्सएल

8

अजगर 2, 81

def f(n,i=1,s=0):
 if i<2<<n:q=3**len(bin(i&-i))/27;f(n,i+1,s+q);print' '*s+'x'*q

कार्यक्रम संस्करण (88)

def f(n,s=0):
 if n:q=3**len(bin(n&-n))/27;f(n-1,s+q);print' '*s+'x'*q
f((2<<input())-1)

X n1-अनुक्रमित पंक्ति में x की संख्या 3 की शक्ति है ( nlsb से शुरू होने वाले पहले सेट बिट का सूचकांक )।


8

पायथन 2, 74

def f(n,s=0):
 if~n:B=3**n;A=s+B-2**n;f(n-1,A+B);print' '*A+'x'*B;f(n-1,s)

एक पुनरावर्ती दृष्टिकोण। आकार- $ n $ शैतान की सीढ़ी तीन भागों में विभाजित है

  • बाईं पुनरावर्ती शाखा, आकार की एक सीढ़ी n-1, जिसकी लंबाई है3**n - 2**n
  • xलंबाई की ' की केंद्र रेखा3**n
  • सही पुनरावर्ती शाखा, आकार की एक सीढ़ी n-1, जिसकी लंबाई है3**n - 2**n

ध्यान दें कि तीन भागों की कुल लंबाई 3*(3**n) - 2*(2**n)या है 3**(n+1) - 2**(n+1), जो प्रेरण की पुष्टि करता है।

वैकल्पिक चर sहम छपाई कर रहे वर्तमान भागों की भरपाई करते हैं। हम पहले बड़ी ऑफसेट के साथ बाईं शाखा में वापस आते हैं, फिर केंद्र रेखा को प्रिंट करते हैं, फिर वर्तमान ऑफसेट पर दाईं शाखा करते हैं।


6

CJam, 36 35 33 बाइट्स

यहाँ एक और CJam दृष्टिकोण है (मैंने ऑप्टिमाइज़र कोड को नहीं देखा है, इसलिए मुझे नहीं पता कि क्या यह वास्तव में बहुत अलग है):

L0sl~{{3*0s}%0s\+}*{1$,S*\+}%W%N*

यह 0वक्र के लिए उपयोग करता है। वैकल्पिक रूप से, (grc चाल का उपयोग करके)

LLl~){3\#a1$++}/{1$,S*\'x*+}%W%N*

जो उपयोग करता है x

इसका परीक्षण यहां करें।

व्याख्या

मूल विचार पहले पंक्तियों के साथ एक सरणी बनाने के लिए है, जैसे

["0" "000" "0" "000000000" "0" "000" "0"]

और फिर इस सूची के माध्यम से जाने के लिए, रिक्त स्थान की सही मात्रा का अनुमान लगाते हुए।

L0sl~{{3*0s}%0s\+}*{1$,S*\+}%W%N*
L                                 "Push an empty string for later.";
 0s                               "Push the array containing '0. This is the base case.";
   l~                             "Read and evaluate input.";
     {           }*               "Repeat the block that many times.";
      {    }%                     "Map this block onto the array.";
       3*                         "Triple the current string.";
         0s                       "Push a new zero string.";
             0s\+                 "Prepend another zero string.";
                   {       }%     "Map this block onto the result.";
                    1$            "Copy the last line.";
                      ,S*         "Get its length and make a string with that many spaces.";
                         \+       "Prepend the spaces to the current row.";
                             W%   "Reverse the rows.";
                               N* "Join them with newlines.";

अन्य संस्करण समान रूप से काम करता है, लेकिन लंबाई की एक सरणी बनाता है, जैसे

[1 3 1 9 1 3 1]

और फिर xअंतिम नक्शे में एस के तार में बदल जाता है ।


6

डायलॉग एपीएल, 34 अक्षर

Grc द्वारा दृष्टिकोण का उपयोग करना। (डोमिनोज़) पात्रों के साथ सीढ़ी खींचता है और स्टड से इनपुट लेता है। यह समाधान मानता है ⎕IO←0

' ⌹'[(∪∘.=⊖){⍵/⍳≢⍵}⊃(⊢,,)/3*⌽⍳1+⎕]
  • - स्टड से इनपुट लें।
  • ⌽⍳1+⎕- नीचे से संख्याओं का क्रम 0. (जैसे 3 2 1 0)
  • 3*⌽⍳1+⎕- उस की शक्ति के लिए तीन (जैसे 27 9 3 1)
  • (⊢,,)/3*⌽⍳1+⎕- पिछला परिणाम ⊢,,टैसिट फ़ंक्शन द्वारा दाईं ओर से मुड़ा हुआ है जो {⍵,⍺,⍵}grc के दृष्टिकोण के अनुसार शैतान की सीढ़ी की चरण लंबाई उपज dfn के बराबर है ।
  • {⍵/⍳≢⍵}⊃(⊢,,)/3*⌽⍳1+⎕ चरण की लंबाई चरणों में परिवर्तित हो जाती है।
  • (∪∘.=⊖){⍵/⍳≢⍵}⊃(⊢,,)/3*⌽⍳1+⎕वह स्व-वर्गीकृत, जैसा कि मेरे जे समाधान में है । ध्यान दें कि पहले से ही परिणाम को सही तरीके से फ़्लिप करता है।
  • ' ⌹'[(∪∘.=⊖){⍵/⍳≢⍵}⊃(⊢,,)/3*⌽⍳1+⎕] रिक्त स्थान और डोमिनो द्वारा प्रतिस्थापित संख्या।

4

रूबी, ९९

मेरे दूसरे के लिए एक अलग उत्तर, फ़ूज़ज़नल के जवाब से प्रेरित है

FUZxxl नोट करता है कि सूचकांक के 2 के कारकों की संख्या के लिए x के अक्षरों की संख्या। उदाहरण के लिए n = 2 के लिए हमारे पास निम्नलिखित कारक हैं:

1 =1
2 =1 * 2
3 =3
4 =1 * 2 * 2
5 =5
6 =3 * 2
7 =7

मैं 2 की इन शक्तियों को निकालने के बजाय एक और अधिक सरल तरीके का उपयोग करता हूं: i=m&-mजो अनुक्रम को प्राप्त करता है 1 2 1 4 1 2 1आदि। यह निम्नानुसार काम करता है:

m-1mइसके सबसे महत्वपूर्ण बिट्स में समान है , लेकिन कम से कम महत्वपूर्ण 1 बिट थोड़ा शून्य हो जाता है, और सभी शून्य से दाईं ओर 1 है।

मूल के साथ यह करने में सक्षम होने के लिए, हमें बिट्स को फ्लिप करने की आवश्यकता है। ऐसा करने के विभिन्न तरीके हैं। एक तरीका यह है कि इससे घटाया जाए -1

समग्र सूत्र तब m& (-1 -(m-1)) सरल होता हैm&(-m)

उदाहरण:

          100   01100100
100-1=     99   01100011
-1-99=   -100   10011100
100&-100=   4   00000100

यहाँ कोड है: newlines की गणना की जाती है, इंडेंट अनावश्यक हैं और इसलिए नहीं गिने जाते हैं, जैसा कि मेरे अन्य उत्तर में है। आधार 2: 1 2 1 4 1 2 1 etcसे बेस 3 तक अनाड़ी रूपांतरण के कारण यह मेरे अन्य उत्तर से थोड़ा लंबा है : 1 3 1 9 1 3 1 etc(क्या इससे बचने का कोई तरीका है Math::?)

def s(n)
  a=[]
  t=0
  1.upto(2*2**n-1){|m|i=3**Math::log(m&-m,2)
    a.unshift" "*t+"x"*i 
    t+=i}
  puts a
end

3

रूबी, १४० ९९

मेरा दूसरा कभी रूबी कोड, और भाषा का मेरा पहला पहला प्रयोग। सुझावों का स्वागत है। बाइट की गिनती इंडेंट्स के लिए प्रमुख स्थानों को बाहर करती है, लेकिन इसमें नईलाइनें भी शामिल हैं (ऐसा लगता है कि अधिकांश न्यूलाइन तब तक डिलीट नहीं किए जा सकते, जब तक कि उन्हें कम से कम स्पेस से बदल न दिया जाए।)

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

एल्गोरिथ्म बस है new iteration= previous iteration+ extra row of n**3 x's+ previous iteration। लेकिन वहाँ है एक बहुत पर्याप्त मात्रा में बस कोड का उत्पादन सही में अग्रणी रिक्त स्थान पाने के लिए।

def s(n)
  a=["x"]
  1.upto(n){|m|t=" "*a[0].length
    a=a.map{|i|t+" "*3**m+i}+[t+"x"*3**m]+a}
  puts a
end

संपादित करें: रूबी, 97

यह aउपरोक्त वर्णित तरीके से x की सभी संख्याओं की एक संख्यात्मक तालिका के निर्माण के समान लेकिन अलग-अलग दृष्टिकोण का उपयोग करता है , लेकिन फिर बाद में तार की एक तालिका का निर्माण करता है। तार की तालिका सरणी में पीछे की ओर बनाई गई है जिसका cउपयोग unshiftमौजूदा सरणी को प्रस्तुत करने के लिए अजीब तरह से नामित विधि का उपयोग करके किया जाता है ।

वर्तमान में यह दृष्टिकोण बेहतर दिख रहा है - लेकिन केवल 2 बाइट्स :-)

def s(n)
  a=c=[]
  (n+1).times{|m|a=a+[3**m]+a}
  t=0
  a.each{|i|c.unshift" "*t+"x"*i
    t+=i}
  puts c
end

1
आप बदल सकते हैं for m in(0..n-1)do ... endके साथ n.times{|m|...}
उमर

@ उमर थैंक्स, मैं कोशिश करूंगा कि कल। आपको विश्वास नहीं होगा कि लगातार वाक्यविन्यास त्रुटियों के कारण इसे चलाने के लिए कितना प्रयास करना पड़ा। मुझे नहीं पता कि कैसे इसके लिए चलने वाले चर का उपयोग करना है n.timesऔर मुझे यह निश्चित रूप से याद होगा। यह endभी खत्म कर देता है! हालांकि इस अवसर पर मैं सोच रहा था कि क्या for m in (1..n)बेहतर हो सकता है, से बचने के लिए (m+1)। क्या लेखन का एक छोटा तरीका है?
लेवल रिवर सेंट

1
forमुख्य रूप से लंबा है क्योंकि आप उपयोग करने के लिए मजबूर हैं end(आप doएक नई रेखा के साथ या साथ बदल सकते हैं ;)। 1..nआप के लिए उपयोग कर सकते हैं 1.upto(n){|m|...}। मुझे इसका लुक पसंद है (1..n).each{|i|...}लेकिन यह इस्तेमाल करने से थोड़ा लंबा है upto। और ध्यान दें कि कॉल करके eachया uptoकेवल छोटा नहीं है, यह अधिक मुहावरेदार रूबी पर भी विचार करता है।
उमर

@ धन्यवाद फिर से, 1.upto(n)यह है! उसके साथ और कुछ अनावश्यक कोष्ठक चले गए, मैं पहले से ही 120 से नीचे हूं। मुझे लगता है कि 100 से नीचे संभव है, मैं बाद में संशोधित कोड पोस्ट करूंगा।
लेवल रिवर सेंट

3

हास्केल, 99 वर्ण

d=q.((iterate((1:).(>>=(:[1]).(*3)))[1])!!)
q[]=[];q(a:r)=sum r&' '++a&'x'++'\n':q r
(&)=replicate

समारोह है d:

λ: putStr $ d 3
                                                                x
                                                             xxx
                                                            x
                                                   xxxxxxxxx
                                                  x
                                               xxx
                                              x
                   xxxxxxxxxxxxxxxxxxxxxxxxxxx
                  x
               xxx
              x
     xxxxxxxxx
    x
 xxx
x

इन सभी कोष्ठक! क्या वास्तव में कम के साथ चारों ओर पाने का कोई रास्ता नहीं है?
फ़ूजएक्सएक्सएल

आप के लिए समीकरण को स्वैप करके एक बाइट खो सकते हैं qऔर कर q x=xखाली सूची के मामले में। इसके अलावा, ऐसा लगता है कि चारों ओर कोष्ठक iterate...[1]अनावश्यक हैं।
जरगब

3

PHP - 137 बाइट्स

function f($n){for($a=[];$i<=$n;array_push($a,3**$i++,...$a))$r=str_repeat;foreach($a as$v){$o=$r(' ',$s).$r(x,$v)."
$o";$s+=$v;}echo$o;}

मैं यहाँ grc के समान ट्रिक का उपयोग कर रहा हूँ । यहाँ ungolfed संस्करण है:

function staircase($n)
{
    $lengthsList = [];
    for ($i = 0; $i <= $n; ++$i) {
        array_push($lengthsList, 3 ** $i, ...$lengthsList);
    }

    $output = '';
    $cumulatedLength = 0;
    foreach ($lengthsList as $length)
    {
        $output = str_repeat(' ', $cumulatedLength) . str_repeat('x', $length) . "\n" . $output;
        $cumulatedLength += $length;
    }

    echo $output;
}

3**$i-> मुझे PHP 5.6 लगता है। आपको इसे निर्दिष्ट करना चाहिए। यह PHP की लगभग हर स्थापना के साथ असंगत है। आपको कुछ बाइट्स बचाने के लिए, आपको शुरू करना चाहिए $r=str_repeat;और जहां आपके पास वह फ़ंक्शन है, $rआप 2 बाइट्स को सहेजते हुए बदल सकते हैं । इसके अलावा, यह हो $r('x',$v)सकता है $r(x,$v)और यह ठीक काम करेगा (ध्यान दें कि मैंने फ़ंक्शन नाम को चर के साथ पहले ही बदल दिया है)। इसके अलावा, मेरा मानना ​​है कि आपको एक अन्य बाइट ++$i<=$nको $n>++$iबचाने के रूप में फिर से लिखा जा सकता है ।
इस्माइल मिगेल

यहां आपका फ़ंक्शन थोड़ा शांत चाल के साथ है: function f($n){$r=str_repeat;$a=[1];while($n>++$i)$a=array_merge($a,[3**$i],$a);foreach($a as$v){$o=$r(' ',$s).$r(x,$v)."\r$o";$s+=$v;}echo$o;}(उस बदसूरत न्यूलाइन के बजाय, मैंने \rएक डबल-उद्धृत स्ट्रिंग के अंदर भागने का क्रम जोड़ा है , $oइसके अंदर चर के साथ । इस प्रकार "\r$o"एक ही बाइट-काउंट ''.$oएक है, न्यूलाइन के साथ पिछले एक पर ommited और एक ही परिणाम पैदा करता है।
इस्माइल मिगुएल

दरअसल, इस कमी को ठीक से काम करने के whileलिए होने की स्थिति $n>$i++है।
इस्माइल मिगुएल

@IsmaelMiguel PHP 5.6 PHP का अंतिम संस्करण है, मुझे कुछ और कहने की ज़रूरत नहीं है। अगर लगभग हर कोई एक पुराने संस्करण का उपयोग कर रहा है, और अगर बहुमत एक अप्रचलित का उपयोग कर रहा है, तो यह मेरी गलती नहीं है। $r=str_repeatट्रिक के लिए धन्यवाद । मैं केवल उसी के बारे में सोच रहा हूं $r='str_repeat';, जो किसी भी बाइट को नहीं बचा रहा था। अपरिभाषित स्थिरांक एक अच्छी चाल भी है, अच्छी तरह से;)। एक नई पंक्ति लिखने की तुलना में एक बाइट है \n, इसलिए मैंने इसे रखा है, लेकिन मैंने एक संगति से बचने के लिए दोहरे उद्धरण चिह्नों का उपयोग किया है $0। एक बार फिर धन्यवाद !
ब्लैकहोल

यह केवल आप पर अच्छा लगेगा। अगर मुझे जानकारी नहीं थी तो मैं 3 ** $iकहूंगा कि आपके पास एक भयानक वाक्यविन्यास है। आप उस सुधार को संबोधित कर सकते हैं। मैं इसके बारे में केवल [1]इसलिए कह रहा हूं न कि क्योंकि PHP5.4 से आया है, जो काफी 'पुराना' है। 1 साल पहले, मैं आपको यह निर्दिष्ट करने के लिए कहूंगा। आज, मैं आपको यह निर्दिष्ट करने के लिए कहता हूं (बहुत कम पंक्ति में) जो इसे निर्दिष्ट करता है। कोड के बारे में बोलते हुए, आपके पास अभी भी है ++$i<=$nजिसे प्रतिस्थापित किया जा सकता है $n>$i++। मुझे इसका परीक्षण करने के लिए अपने सभी कोड को PHP5.3 में बदलना था। जो दर्दनाक था। लेकिन मैं आपको अब तक 7 बाइट खा चुका हूं।
इस्माइल मिगेल

3

सी, 165

#define W while
f(n){int i=n+1,j=1<<i,k=1,l,r,s,t;W(i--)k*=3;l=k-j;W(--j){r=j,s=1;W(!(r%2))r/=2,s*=3;l-=s;t=l;W(t--)putchar(32);W(++t<s)putchar(88);putchar('\n');}}

यहाँ एक ही कोड अनपैक किया गया है और थोड़ा साफ किया गया है:

int f(int n) {
    int i=n+1, j=1<<i, k=1;
    while (i--) k*=3;
    int l=k-j;
    while (--j) {
        int r=j,s=1;
        while (!(r%2))
            r/=2, s*=3;
        l-=s;
        int t=l;
        while (t--) putchar(' ');
        while (++t<s) putchar('X');
        putchar('\n');
    }
}

यह पंक्तियों के लिए निहित रूप के बजाय स्पष्ट रूप से उपयोग करने के लिए समस्या के समाधान के रूप में एक ही विचार पर आधारित है। J की घोषणा इसे 2 ^ (n + 1) पर सेट करती है, और पहले जबकि लूप की गणना k = 3 ^ (n + 1); फिर l = 3 ^ (n + 1) -2 ^ (n + 1) सीढ़ी की कुल चौड़ाई है (यह साबित करना बहुत मुश्किल नहीं है)। हम फिर 1 से 2 ^ (n + 1) -1 तक सभी नंबरों से गुजरते हैं; हर एक के लिए, यदि यह विभाज्य है (बिल्कुल) 2 ^ n तो हम मुद्रण पर योजना बनाते हैं s = 3 ^ n 'X'। l यह सुनिश्चित करने के लिए समायोजित किया गया है कि हम सही स्थान से शुरू करते हैं: हम l रिक्त स्थान लिखते हैं और 's X' है, फिर एक नई रेखा।


W को परिभाषित करते हैं, जबकि कुछ पात्रों को बचाने के लिए int को छोड़ देते हैं।
फूजएक्सएक्सएल

कुछ बचत के लिए भी t = l- = s।
फ़ूजएक्सएक्सएल

@FUZxxl मैंने उन दोनों की कोशिश की, लेकिन सी अभी भी फ़ंक्शन पर निहित प्रकारों की अनुमति देता है यह उन्हें 'क्लासिक' झंडे (जीसीसी पर कम से कम) के साथ भी चर घोषणाओं पर अनुमति नहीं दे रहा था। और मैंने # डब्ल्यूफ़ाइन डब्ल्यू की कोशिश की, जबकि इसकी परवाह नहीं की, हालांकि मैं परिभाषा में फिसल गया।
स्टीवन स्टडनिक

हम्म ... मुझे लगता है कि आप केवल वैश्विक चर में प्रकार को छोड़ सकते हैं। यह आपको बहुत ज्यादा नहीं लाता है। आप को जोड़ने का प्रयास कर सकते हैं (*p)()=putchar;कॉल करने के लिए शुरुआत में putcharके रूप में p। मुझे लगता है कि यह काम करना चाहिए।
FUZxxl

2

CJam, 46 43 41 39 36 35 बाइट्स

L0ri),(a*+_W%(;+{3\#'x*+_,S*}%$1>N*

अब एक अलग दृष्टिकोण का उपयोग कर अद्यतन करें।


पुराना तरीका:

]ri){3f*_,)"x"a*\]z:+}*_s,f{1$,U+:U-S*\N}

बहुत भोला और लंबा है, लेकिन कुछ शुरू करने के लिए।

एक बार जब मैं इसे गोल्फ से जोड़ दूंगा

इसे यहाँ ऑनलाइन आज़माएँ


कुछ काम की जरूरत महसूस होती है। N = 4, 5, 17 के लिए ठीक से काम नहीं किया। ऊपरी भाग में x के बाएं-स्वरूपित राइफल्स स्ट्रिंग्स प्रदर्शित किए। N = 17 के साथ इसने स्क्रीन पर कोड डंप किया और नीचे x के साथ भरा।
डेविड एफएक्स

1
@DavidCarraher 4, 5 के लिए मुझे लगता है कि यह सिर्फ रैपिंग है। यदि आप आउटपुट को टेक्स्ट एडिटर पर कॉपी करते हैं, जिसमें कोई लाइन नहीं है, तो यह मेरे लिए ठीक है।
Sp3000

ठीक। मुझे पता है।
डेविड एफएक्स

2

जावा, 271 269 ​​बाइट्स

Grc की विधि का उपयोग करता है।

import java.util.*;String a(int a){List<Integer>b=new ArrayList<>();int c=-1,d=1;for(;c++<a;b.add(d),b.addAll(b),b.remove(b.size()-1),d*=3);String f="";for(;b.size()>0;f+="\n"){d=b.remove(b.size()-1);for(int g:b)for(c=0;c<g;c++)f+=' ';for(c=0;c<d;c++)f+='x';}return f;}

इंडेंट:

import java.util.*;
String a(int a){
    List<Integer>b=new ArrayList<>();
    int c=-1,d=1;
    for(;c++<a;b.add(d),b.addAll(b),b.remove(b.size()-1),d*=3);
    String f="";
    for(;b.size()>0;f+="\n"){
        d=b.remove(b.size()-1);
        for(int g:b)
            for(c=0;c<g;c++)
                f+=' ';
        for(c=0;c<d;c++)
            f+='x';
    }
    return f;
}

किसी भी सुझाव का स्वागत है।

2 बाइट्स mbomb007 के लिए धन्यवाद


आप 2 बाइट्स सहेजने के b.size()>0बजाय उपयोग कर सकते हैं !b.isEmpty()
mbomb007

1

पर्ल, 62

#!perl -p
eval's/x+/$&$&$&
x/g,s/\d*/x
/;'x++$_;s/x+/$"x$'=~y!x!!.$&/ge

पहले प्रमुख स्थानों के बिना चलने वाले परिणाम की गणना करता है। फिर उन्हें xस्ट्रिंग के बाकी हिस्सों में वर्णों की संख्या के अनुसार प्रत्येक पंक्ति से पहले जोड़ता है ।


1

जावास्क्रिप्ट (ईएस 6) 104 106 118

संपादित करें हटाए गए फ़ंक्शन को हटाएं, प्रत्येक पंक्ति के लिए '*' की सूची पुनरावृत्त रूप से प्राप्त की जाती है, बिट्स के साथ फ़िडलिंग और 3 की शक्तियों (जैसे कई अन्य उत्तरों में)
लूप के अंदर, एक बहुस्तरीय स्ट्रिंग नीचे से ऊपर की ओर मुड़ी हुई है, एक रनिंग काउंट रखते हुए प्रत्येक स्थान पर जोड़ने के लिए अग्रणी स्थान

F=n=>{
  for(i=a=s='';++i<2<<n;a=s+'*'.repeat(t)+'\n'+a,s+=' '.repeat(t))
    for(t=u=1;~i&u;u*=2)t*=3;
  return a
}

पहला प्रयास हटा दिया गया

पुनरावर्ती आर फ़ंक्शन प्रत्येक पंक्ति के लिए '*' की संख्या के साथ एक सरणी का निर्माण करता है। उदाहरण के लिए R (2) [1, 3, 1, 9, 1, 3, 1]
यह सरणी नीचे से ऊपर की ओर एक मल्टीलाइन स्ट्रिंग बनाने के लिए स्कैन की जाती है, जो प्रत्येक लाइन पर जोड़ने के लिए प्रमुख स्थानों की एक रनिंग काउंटिंग रखती है।

F=n=>
(R=n=>[1].concat(...n?R(n-1).map(n=>[n*3,1]):[]))(n)
.map(n=>a=' '.repeat(s,s-=-n)+'*'.repeat(n)+'\n'+a,a=s='')
&&a 

फ़ायरफ़ॉक्स / फायरबग कंसोल में टेस्ट करें

F(3)

उत्पादन

                                                                *
                                                             ***
                                                            *
                                                   *********
                                                  *
                                               ***
                                              *
                   ***************************
                  *
               ***
              *
     *********
    *
 ***
*

1

आर - 111 अक्षर

सीधा कार्यान्वयन, सरणी को पुनरावृत्त रूप से बनाना और इसे धीरे-धीरे नष्ट करना।

n=scan()
a=1
if(n)for(x in 1:n)a=c(a,3^x,a)
for(A in a){cat(rep(' ',sum(a)-A),rep('x',A),'\n',sep='');a=a[-1]}

उपयोग:

> source('devil.r')
1: 2
2: 
Read 1 item
                  x
               xxx
              x
     xxxxxxxxx
    x
 xxx
x

अच्छी बात है, मेरे कोड को संशोधित कर दिया गया है ताकि यह nकमांड लाइन से तर्क ले ले
koekenbakker

1
आप STDIN से पढ़कर 8 बाइट्स बचाते हैं। n=scan()
एलेक्स ए।

आपको xइसे कर्सर के रूप में उपयोग करने की घोषणा करने की आवश्यकता नहीं है, न ही आपको इसकी आवश्यकता है if(n)। मुझे लगता है कि एक चरित्र के रूप में भी, लाइन ब्रेक गिनती गिनती।
freekvd

धन्यवाद, आप सही कह रहे हैं xif(n)हालांकि इसके बारे में निश्चित नहीं है । मैंने मामले से निपटने के लिए उस हिस्से को जोड़ा n=0if(n)तो देता है Fऔर इसलिए एक भी देता है x। अगर मैं इसे हटाता हूं, तो n=0अवांछित परिणाम देता है। यहां नया है, इसलिए लाइन ब्रेक के बारे में पता नहीं था। अब शामिल!
koekenbakker

यदि आप सेट करते हैं a=0और उस पर लूप शुरू करते हैं x in 0:nतो यह n = 0 के लिए भी काम करता है। तब आप छोड़ सकते हैं if(n)
फ़्रीक्वेड

0

रूबी, 93

f=->n{s,p,k=[1],1;n.times{s=s+[p=p*3]+s};k=s.dup;k.each{m=s.pop;puts' '*s.reduce(0,:+)+?x*m}}

यह grc के समान दृष्टिकोण का उपयोग करता है।

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