त्रिकोणीय पाठ


39

एक प्रोग्राम या फ़ंक्शन लिखिए जो एक स्ट्रिंग की गारंटी देता है जिसमें केवल स्थान के अलावा मुद्रण योग्य ASCII वर्ण होते हैं , और लंबाई में एक सकारात्मक त्रिकोणीय संख्या (1, 3, 6, 10, 15, ...) हो।

एक ही स्ट्रिंग को प्रिंट या वापस करें, लेकिन रिक्त स्थान का उपयोग करके एक त्रिकोण में आकार दें। कुछ उदाहरणों से पता चलेगा कि मेरा क्या मतलब है:

यदि इनपुट है Rतो आउटपुट होगा

R

यदि इनपुट है catतो आउटपुट होगा

 c
a t

यदि इनपुट है monk3yतो आउटपुट होगा

  m
 o n
k 3 y

यदि इनपुट है meanIngfu1तो आउटपुट होगा

   m
  e a
 n I n
g f u 1

यदि इनपुट है ^/\/|\/[]\तो आउटपुट होगा

   ^
  / \
 / | \
/ [ ] \

अगर इनपुट है

Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?

उसके बाद आउटपुट होगा

              T
             h i
            s r u
           n o f c
          h a r a c
         t e r s i s
        m e a n t t o
       h a v e a l e n
      g t h t h a t c a
     n b e e x p r e s s
    e d a s a t r i a n g
   u l a r n u m b e r . D
  i d i t w o r k ? Y o u t
 e l l m e , I c a n ' t c o
u n t v e r y w e l l , o k ?

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

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

बाइट्स में सबसे छोटा कोड जीतता है।


वहाँ एक अधिकतम अधिकतम स्ट्रिंग की लंबाई हो सकती है?
जियोकॉवेल

@geokavel यह स्ट्रिंग की किसी भी लंबाई के लिए काम करना चाहिए जो आपकी भाषा सामान्य रूप से संभाल सकती है।
केल्विन के शौक

11
यहाँ एक क्रिसमस ट्री है जो अभी तक किसी ने नहीं डाला है। * / \ / | \ / | ओ \ / | ओ | \ / ओ | ओ | \ / || ओ | ओ \ / ओ ||| ओ | \ / ओ || ओ ||| \ / || ओ | || o | \ / | o ||| o || o \
टिम्मी

जवाबों:


9

पायथ, 22 बाइट्स

jua+L\ GjdHfTczsM._UzY

इसे ऑनलाइन आज़माएँ: प्रदर्शन या टेस्ट सूट

स्पष्टीकरण:

jua+L\ GjdHfTczsM._UzY   implicit: z = input string
                   Uz    create the list [0, 1, ..., len(z)-1]
                 ._      all prefixes of this list: [[0], [0,1], [0,1,2], ...]
               sM        sum up each sublist: [0, 1, 3, 6, 10, ...]
             cz          split z at these indices
           fT            remove all the unnecessary empty strings
                         this gives us the list of strings of the triangle
 u                   Y   reduce this list, with the initial value G = []
   +L\ G                    prepend a space to each string in G
        jdH                 join the current string with spaces
  a                         and append it to G
j                        print each string on a separate line

12

पायथन, 81 बाइट्स

def f(s,p=''):
 i=-int(len(2*s)**.5)
 if s:f(s[:i],p+' ');print p+' '.join(s[i:])

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

पायथन 3 में, ifशॉर्ट सर्किटिंग के माध्यम से किया जा सकता है, हालांकि यह चार्ट को बचाने के लिए प्रतीत नहीं होता है:

def f(s,p=''):i=-int(len(2*s)**.5);s and[f(s[:i],p+' '),print(p+' '.join(s[i:]))]

असमानता के साथ एक समान रूप से लंबा विकल्प

def f(s,p=''):i=-int(len(2*s)**.5);''<s!=f(s[:i],p+' ')!=print(p+' '.join(s[i:]))

दोनों printऔर fवापसी None, जो उपयोग करना मुश्किल है।


1
यह काफी चालाक है। एक समय में स्ट्रिंग को एक पंक्ति से काटकर, आप अभी भी अग्रणी स्थानों की संख्या की गणना करने के लिए एक त्रिकोणीय लंबाई स्ट्रिंग के साथ समाप्त होते हैं।
xsot

6

रेटिना , 108 102 94 87 82 64 63 बाइट्स

मेरे मूल दृष्टिकोण को आगे बढ़ाने के लिए Sp3000 का धन्यवाद, जिसने बाइट की गिनती 108 से घटाकर 82 कर दी।

कोबी के लिए बड़े पैमाने पर धन्यवाद, जिसने बहुत अधिक सुरुचिपूर्ण समाधान पाया, जिसने मुझे उस के शीर्ष पर एक और 19 बाइट्स को बचाने की अनुमति दी।

S_`(?<=^(?<-1>.)*(?:(?<=\G(.)*).)+)
.
$0 
m+`^(?=( *)\S.*\n\1)
<space>

जहां <space>एक एकल अंतरिक्ष चरित्र का प्रतिनिधित्व करता है (जो अन्यथा एसई द्वारा छीन लिया जाएगा)। गिनती के उद्देश्यों के लिए, प्रत्येक पंक्ति एक अलग फ़ाइल में जाती है और \nइसे वास्तविक लाइनफ़ीड वर्ण से प्रतिस्थापित किया जाना चाहिए। सुविधा के लिए, आप कोड को चला सकते हैं जैसा कि -sझंडे के साथ एक एकल फ़ाइल से है ।

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

व्याख्या

खैर ... हमेशा की तरह मैं यहाँ समूहों को संतुलित करने के लिए पूर्ण परिचय नहीं दे सकता। प्राइमर के लिए मेरा स्टैक ओवरफ्लो उत्तर देखें

S_`(?<=^(?<-1>.)*(?:(?<=\G(.)*).)+)

पहला चरण एक Sप्लिट चरण है, जो इनपुट को बढ़ती लंबाई की रेखाओं में विभाजित करता है। _इंगित करता है कि खाली हिस्सा बंटवारे (जो केवल अंत को प्रभावित करता है, क्योंकि वहाँ अंतिम स्थिति में एक मैच हो जाएगा) से हटा दिया जाना चाहिए। रेगेक्स स्वयं पूरी तरह से एक लुक-अराउंड में समाहित है, इसलिए यह किसी भी वर्ण से मेल नहीं खाता, लेकिन केवल स्थिति।

यह हिस्सा कुछ अतिरिक्त गोल्फ के साथ कोबी के समाधान पर आधारित है जो मैंने खुद पाया। ध्यान दें कि lookbehinds .NET में राइट-टू-लेफ्ट से मेल खाते हैं, इसलिए निम्नलिखित स्पष्टीकरण को नीचे से ऊपर तक पढ़ा जाना चाहिए। मैंने \Gस्पष्टीकरण के लिए स्पष्टीकरण में एक और डाला है , हालांकि यह काम करने के लिए पैटर्न के लिए आवश्यक नहीं है।

(?<=
  ^         # And we ensure that we can reach the beginning of the stack by doing so.
            # The first time this is possible will be exactly when tri(m-1) == tri(n-1),
            # i.e. when m == n. Exactly what we want!
  (?<-1>.)* # Now we keep matching individual characters while popping from group <1>.
  \G        # We've now matched m characters, while pushing i-1 captures for each i
            # between 1 and m, inclusive. That is, group <1> contains tri(m-1) captures.
  (?:       
    (?<=
      \G    # The \G anchor matches at the position of the last match.
      (.)*  # ...push one capture onto group <1> for each character between here
            # here and the last match.
    )       # Then we use a lookahead to...
    .       # In each iteration we match a single character.
  )+        # This group matches all the characters up to the last match (or the beginning
            # of the string). Call that number m.
)           # If the previous match was at position tri(n-1) then we want this match
            # to happen exactly n characters later.

मैं अब भी कोबी के काम की प्रशंसा कर रहा हूं। यह प्राइम टेस्टिंग रेगेक्स की तुलना में अधिक सुरुचिपूर्ण है। :)

चलिए अगले चरण पर चलते हैं:

.
$0 

सरल: प्रत्येक गैर-लाइनफीड चरित्र के बाद एक स्थान डालें।

m+`^(?=( *)\S.*\n\1)
<space>

यह अंतिम चरण त्रिकोण बनाने के लिए सभी पंक्तियों को सही ढंग से इंगित करता है। mबनाने के लिए बस हमेशा की तरह बहु विधा है ^एक पंक्ति के आरंभ से मेल खाते हैं। +इस स्तर को दोहराने के लिए रेटिना बताता है जब तक स्ट्रिंग को बदलने बंद हो जाता है (जो है, इस मामले में अर्थ है कि regex अब मैचों)।

^      # Match the beginning of a line.
(?=    # A lookahead which checks if the matched line needs another space.
  ( *) # Capture the indent on the current line.
  \S   # Match a non-space character to ensure we've got the entire indent.
  .*\n # Match the remainder of the line, as well as the linefeed.
  \1   # Check that the next line has at least the same indent as this one.
)

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


@ _ @ बिल्ली क्या करती है?
n --h'a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n @h 100a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ अब 100% अधिक आश्चर्यजनकता के साथ, कोबी के सौजन्य से।
मार्टिन एंडर

6

कैंडी , 67 59 57 बाइट्स

&iZ1-=yZ1+Z*2/>{0g}0=z@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j

&1-8*1+r1-2/=y@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j

&8*7-r1-2/=y@1i&{|.}bYR(" ";=)ZR(=a&{;}" ";)"\n";Y1-=ya1j

या:

          &
         8 *
        7 - r
       1 - 2 /
      = y @ 1 i
     & { | . } b
    Y R ( "   " ;
   = ) Z R ( = a &
  { ; } "   " ; ) "
 \ n " ; Y 1 - = y a
1 j

लंबा फार्म:

stackSz
digit8    # Y = (sqrt((numCh - 1) * 8 + 1) - 1) / 2   using pythagorean
mult      # Y = (sqrt(numCh * 8 - 7) - 1) / 2  equivalent but shorter
digit7
sub
root
digit1
sub
digit2
div
popA
YGetsA
label digit1
incrZ
stackSz   # bail if we're out of letters
if
  else
  retSub
endif
stack2
pushY     # print the leading spaces (" " x Y)
range1
while
  " " printChr
  popA
endwhile
pushZ
range1      # output this row of characters (Z of them)
while
  popA
  stack1
  stackSz
  if
    printChr    # bail on unbalanced tree
  endif
  " " printChr
endwhile
"\n" printChr
pushY
digit1
sub
popA
YGetsA
stack1
digit1 jumpSub   # loop using recursion

हाँ, मैंने क्रिसमस-वाई महसूस किया।
डेल जॉनसन

5

सीजेएम, 27 26 बाइट्स

1 बाइट बचाने के लिए Sp3000 का धन्यवाद।

Lq{' @f+_,)@/(S*N+a@\+\s}h

आश्चर्यजनक रूप से पाइथ के करीब, चलो देखते हैं कि क्या यह गोल्फ हो सकता है ...

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

व्याख्या

L        e# Push an empty array to build up the lines in.
q        e# Read input.
{        e# While the top of the stack is truthy (non-empty)...
  ' @f+  e#   Prepend a space to each line we already have.
  _,)    e#   Get the number of lines we already have and increment.
  @/     e#   Split the input into chunks of that size.
  (S*    e#   Pull off the first chunk (the next line) and join with spaces.
  N+     e#   Append a linefeed.
  a@\+   e#   Append it to our list of lines.
  \s     e#   Pull up the other chunks of the input and join them back into one string.
}h

अगर मैं बदलता हूं तो यह काम क्यों नहीं करता ' है S???
जियोकॉवेल

@geokavel क्योंकि Sएक स्ट्रिंग है, एक चरित्र नहीं है, इसलिए fलाइनों की सूची के बजाय उस स्ट्रिंग पर मैप करेगा।
मार्टिन एंडर

यही मेरा अनुमान था। क्या आपके पास एस को एक स्ट्रिंग बनाने के लिए तर्क के रूप में कोई विचार है?
जियोकॉवेल

@geokavel नहीं, मैं नहीं।
मार्टिन एंडर

5

रूबी, 84 77 73 बाइट्स

->v{1.upto(n=v.size**0.5*1.4){|i|puts" "*(n-i)+v[i*(i-1)/2,i].chars*" "}}

77 बाइट्स

->v{0.upto(n=(v.size*2)**0.5-1){|i|puts" "*(n-i)+v[i*(i+1)/2,i+1].chars*" "}}

चर rको हटाकर कुछ और बाइट्स को कम करें जैसा कि स्टीवेवरिल द्वारा सुझाया गया है।

84 बाइट्स

->v{n=(v.size*2)**0.5-1;0.upto(n){|i|puts" "*(n-i)+v[(r=i*(i+1)/2)..r+i].chars*" "}}

Ungolfed:

->v {
  1.upto(n=v.size**0.5*1.4) { |i|
    puts" "*(n-i)+v[i*(i-1)/2,i].chars*" "
  }
}

इनपुट स्ट्रिंग से पहले त्रिकोणीय संख्या की गणना

n=v.size**0.5*1.4

उदाहरण के लिए इनपुट स्ट्रिंग आकार 120 है और हमारी त्रिकोणीय संख्या n, 15 होगी।

puts" "*(n-i)+v[i*(i-1)/2,i].chars*" "

उपरोक्त पंक्ति में, यह स्ट्रिंग की श्रृंखला के बाद रिक्त स्थान प्रिंट करता है जो निम्नलिखित पैटर्न का उपयोग करके इनपुट स्ट्रिंग से प्राप्त होते हैं

[[0,0],[1,2],[3,5],[6,9]]

उपयोग:

f=->v{1.upto(n=v.size**0.5*1.4){|i|puts" "*(n-i)+v[i*(i-1)/2,i].chars*" "}}
f["Thisrunofcharactersismeanttohavealengththatcanbeexpressesasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?"]
              T
             h i
            s r u
           n o f c
          h a r a c
         t e r s i s
        m e a n t t o
       h a v e a l e n
      g t h t h a t c a
     n b e e x p r e s s
    e s a s a t r i a n g
   u l a r n u m b e r . D
  i d i t w o r k ? Y o u t
 e l l m e , I c a n ' t c o
u n t v e r y w e l l , o k ?

वाह, हमारे दृष्टिकोण बहुत समान हैं, लेकिन हमें पूरक गोल्फिंग ज्ञान है। मुझे नहीं पता था कि uptoएक पूर्णांक तर्क की आवश्यकता है, ( timesसबसे निश्चित रूप से करता है।) मैंने अपने कुछ वाक्यविन्यास को मेरे उत्तर के संशोधन में शामिल किया है। मेरे पास आपके लिए सबसे बड़ी टिप है, आपको उस चर की आवश्यकता नहीं है r। कॉमा के बाद केवल संख्या के ,बजाय ..और संख्या का उपयोग करें , रेंज के अंत के बजाय वापस लौटने के लिए तत्वों की कुल संख्या है।
लेवल रिवर सेंट

सच। इस टिप के लिए धन्यवाद, मैं अपने उत्तर को तुरंत अपडेट कर रहा हूं :)
वासु अडारी

4

पायथ, 27 बाइट्स

Js.IsSGlzWz+*-J=hZdjd<~>zZZ

                               z = input()
                               Z = 0
                               d = ' '
    sSG                        G -> tri(G)
  .I   lz                      Find the (float) input whose output is len(z).
 s                             Convert to int.
J                              Save as J.
         Wz                    while z:
               =hZ             Z += 1
            *-J  Zd            Generate J-Z spaces.
                      ~>zZ     Remove the first Z characters from z.
                     <    Z    Generate those first Z characters.
                   jd          Join on spaces.
           +                   Add the two together and print.

परीक्षण सूट

एक दिलचस्प दृष्टिकोण - अनिवार्य, और उपयोग करता है .I। शायद गोल्फ है।


4

सी, 138 136 134 बाइट्स

इनपुट के रूप में एक स्ट्रिंग लेता है:

j,r,k,a;f(char*s){j=strlen(s);r=k=sqrt(1+8*j)/2;for(;r--;printf("\n")){for(j=r;j--;)printf(" ");for(j=k-r;j--;)printf("%c ",s[a++]);}}

आपको लगता है कि जावास्क्रिप्ट को C ने 1 बाइट से अब तक हराया है: D
Mark K Cowan

@ मर्ककॉवन हाँ, जाहिरा तौर पर। मुझे आशा है कि मैं इसे और भी छोटा कर दूंगा! :)
साहिल अरोरा

@SahilArora - आप बदल सकते हैं printf(" ")और printf("\n")साथ puts(" ")और puts("\n")। प्रत्येक प्रतिस्थापन आपको 2 बाइट्स बचाएगा। :)
enhzflep

@enhzflep मैंने इसे पहले ही आज़मा लिया, इसने एक अस्पष्ट आउटपुट दिया!
साहिल अरोड़ा

ओह। :( काम करता है यहाँ win7 पर gcc 4.7.1 के साथ - मुझे लगता है कि यह इस तरह से करना है कि
प्रिंट

4

रूबी दृष्टिकोण 2 रेव 1, 76 बाइट्स

->s{s=s.chars*' '
0.upto(w=s.size**0.5-1){|i|puts' '*(w-i)+s[i*i+i,i*2+2]}}

वासु अडारी के जवाब से वाक्य रचना विचारों का उपयोग करके अनुकूलित, साथ ही मेरे अपने कुछ ट्विस्ट।

रूबी दृष्टिकोण 2 Rev 0, 93 बाइट्स

->s{s=s.chars.to_a.join(' ')
w=(s.size**0.5).to_i
w.times{|i|puts' '*(w-i-1)+s[i*i+i,i*2+2]}}

पूरी तरह से अलग दृष्टिकोण। पहले हम इनपुट के पात्रों के बीच रिक्त स्थान जोड़ते हैं। फिर हम पंक्तियों की लाइन को लाइन से प्रिंट करते हैं।

रूबी दृष्टिकोण 1, 94 बाइट्स

->s{n=-1;w=((s.size*2)**0.5).to_i
(w*w).times{|i|print i/w+i%w<w-1?'':s[n+=1],-i%w==1?$/:' '}}

यह प्रत्याशित की तुलना में अधिक समय तक समाप्त हो गया।

w नीचे पंक्ति में मुद्रण योग्य वर्णों की संख्या, या समकक्ष, पंक्तियों की संख्या सम्‍मिलित है।

हर लाइन में wव्हॉट्सएप कैरेक्टर होते हैं (जिनमें से आखिरी न्यूलाइन है) इसलिए इन व्हाट्सएप कैरेक्टर्स को प्रिंट करने और प्रिंट करने वाले कैरेक्टर्स को जहां जरूरी हो, वहां डालने का विचार है।


3

मिंकोलंग 0.14 , 42 बाइट्स

(xid2;$I2*`,)1-[i1+[" "o]lrx" "$ii-1-D$O].

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

व्याख्या

(                Open while loop
 x               Dump top of stack
  i              Loop counter (i)
   d2;           Duplicate and square
      $I2*       Length of input times two
          `,     Push (i^2) <= (length of input)
            )    Close for loop; pop top of stack and exit when it's 0

1-[                              Open for loop that repeats sqrt(len(input))-1 times
   i1+[                          Open for loop that repeats (loop counter + 1) times
       " "o                      Push a space then read in character from input
           ]                     Close for loop
            l                    Push 10 (newline)
             r                   Reverse stack
              x                  Dump top of stack
               " "               Push a space
                  $i             Push the max iterations of for loop
                    i-           Subtract loop counter
                      1-         Subtract 1
                        D        Pop n and duplicate top of stack n times
                         $O      Output whole stack as characters
                           ].    Close for loop and stop.

2
इस तरह के एक सही बाइट गिनती! बहुत बढ़िया!
तन्माथ

1
@ तन्माथ लेकिन 42 एक त्रिकोणीय संख्या नहीं है!
पाओलो एबरमन

3

पायथन 2, 88 85 बाइट्स

s=t=raw_input()
i=1
while s:print' '*int(len(t*2)**.5-i)+' '.join(s[:i]);s=s[i:];i+=1

3 बाइट बचाने के लिए धन्यवाद xnor।


sनंबर-ऑफ-स्पेस गणना में गड़बड़ी को छोटा नहीं करता है ?
xnor

अरे हाँ। मैंने सबमिट करने से पहले एक अस्थायी चर निकाल दिया था, लेकिन यह महसूस नहीं किया कि उसने कोड को अमान्य कर दिया है।
xsot

क्या होगा यदि आप पहले की तरह करते हैं लेकिन बैक-अप को बचाते हैं S=s=raw_input()?
xnor

अच्छा सुझाव। मुझे लगता है कि संभवतः एक छोटी समग्र रणनीति है।
xsot


3

सीजाम, 50 बाइट्स

q:QQ,1>{,{),:+}%:RQ,#:IR2ew<{~Q<>:LS*L,I+(Se[N}%}&

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

व्याख्या

q:QQ,1>{  e# Only proceed if string length > 1, otherwise just print.
,{),:}%:R e# Generates a list of sums from 0 to k, where k goes from 0 to the length of the string [0,1,3,6,10,15,21,...]
Q,#:I     e# Find the index of the length of the string in the list
R2ew<     e# Make a list that looks like [[0,1],[1,3],[3,6],...,[?,n] ]where n is the length of the string 
{~Q<>:L   e# Use that list to get substrings of the string using the pairs as start and end indices
S*        e# Put spaces between the substrings
L,I+(Se[N e# (Length of the substring + Index of string length in sum array -1) is the length the line should be padded with spaces to. Add a new line at the end.
%}& 

2

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

w=>{r='';for(s=j=0;j<w.length;j+=s++);for(i=j=0;w[j+i];j+=++i)r+=Array(s-i-1).join` `+w.slice(j,i+j+1).split``.join` `+'<br>';return r}

डी-गोल्फ + डेमो:

function t(w) {
    r = '';
    for (s = j = 0; j < w.length; j += s++);
    for (i = j = 0; w[j + i]; j += ++i) r += Array(s - i - 1).join` ` + w.slice(j, i + j + 1).split``.join` ` + '<br>';
    return r;
}

document.write('<pre>' + t(prompt()));


का लक्ष्य क्या है for (s = j = 0; j < w.length; j += s++);? इसके अलावा, एक के अंदर <pre>, आप \nइसके बजाय का उपयोग कर सकते हैं <br>। इसके अलावा, आप यह उल्लेख करना भूल गए कि यह ईएस 6 है।
इस्माईल मिगुएल

पहले लूप का लक्ष्य अंतिम पंक्ति की लंबाई को गिनना है, ताकि प्रत्येक पंक्ति को ठीक से इंडेंट किया जा सके।
nicael

2

जावा, 258 194

golfed:

String f(String a){String r="";int t=(((int)Math.sqrt(8*a.length()+1))-1)/2-1;int i=0,n=0;while(n++<=t){for(int s=-1;s<t-n;++s)r+=" ";for(int j=0;j<n;++j)r+=a.charAt(i++)+" ";r+="\n";}return r;}

Ungolfed:

public class TriangulatingText {

  public static void main(String[] a) {
    // @formatter:off
    String[] testData = new String[] {
      "R",
      "cat",
      "monk3y",
      "meanIngfu1",
      "^/\\/|\\/[]\\",
      "Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?",
    };
    // @formatter:on

    for (String data : testData) {
      System.out.println("f(\"" + data + "\")");
      System.out.println(new TriangulatingText().f(data));
    }
  }

  // Begin golf
  String f(String a) {
    String r = "";
    int t = (((int) Math.sqrt(8 * a.length() + 1)) - 1) / 2 - 1;
    int i = 0, n = 0;
    while (n++ <= t) {
      for (int s = -1; s < t - n; ++s)
        r += " ";
      for (int j = 0; j < n; ++j)
        r += a.charAt(i++) + " ";
      r += "\n";
    }
    return r;
  }
  // End golf
}

कार्यक्रम का उत्पादन:

f("R")
R 

f("cat")
 c 
a t 

f("monk3y")
  m 
 o n 
k 3 y 

f("meanIngfu1")
   m 
  e a 
 n I n 
g f u 1 

f("^/\/|\/[]\")
   ^ 
  / \ 
 / | \ 
/ [ ] \ 

f("Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?")
              T 
             h i 
            s r u 
           n o f c 
          h a r a c 
         t e r s i s 
        m e a n t t o 
       h a v e a l e n 
      g t h t h a t c a 
     n b e e x p r e s s 
    e d a s a t r i a n g 
   u l a r n u m b e r . D 
  i d i t w o r k ? Y o u t 
 e l l m e , I c a n ' t c o 
u n t v e r y w e l l , o k ? 

आप शायद कुछ बाइट्स को बचाने के लिए System.out आयात कर सकते हैं।
रैंडर्स ०१

import static System.out;25 बाइट्स है, और System.7 बाइट्स है। यह तीन बार उपयोग किया जाता है, और 21 <25 इसलिए यह वास्तव में 4 बाइट्स द्वारा आकार में वृद्धि करेगा । अच्छा नेतृत्व, हालांकि, स्थिर आयात अंतरिक्ष को बचा सकता है और हर कोई उनके बारे में नहीं जानता है।

1
जब मुझे यह पता चला तो मैं पुराने उत्तरों से गुज़र रहा था: "एक प्रोग्राम या फ़ंक्शन लिखें " जो मुझे पहले महसूस नहीं हुआ था। क्लास के सामान को बाहर निकालने से जगह बच गई। मैंने इसे एक उचित कार्य में बनाया और दाढ़ी बनाने के लिए कुछ और बाइट्स पाया।

1

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

a=>(y=z=0,(f=p=>p?" ".repeat(--p)+a.split``.slice(y,y+=++z).join` `+`
`+f(p):"")(Math.sqrt(2*a.length)|0))

स्ट्रिंग बनाने के लिए लूप के बजाय पुनरावर्तन का उपयोग करता है।

सबसे लंबे समय तक पंक्ति की लंबाई को खोजने के लिए n वें त्रिकोणीय संख्या के लिए सूत्र का उपयोग T_nहै T_n = (n^2 + n)/2। दिए गए nऔर T_nद्विघात सूत्र का उपयोग करने के लिए हल करना , हमारे पास है:

1/2 * n^2 + 1/2 * n - T_n = 0

a = 1/2, b = 1/2, c = -T_n

-1/2 + sqrt(1/2^2 - 4*1/2*-T_n)   
------------------------------- = sqrt(1/4 + 2*T_n) - 1/2
             2*1/2

यह पता चला है कि फर्श के बाद, वर्गमूल के अंदर 1/4 जोड़ने से परिणाम नहीं बदलता है, इसलिए सबसे लंबी पंक्ति के लिए सूत्र है Math.sqrt(2*a.length)|0



1

पॉवरशेल, 69 बाइट्स

($args|% t*y|?{$r+="$_ ";++$p-gt$l}|%{$r;rv r,p;$l++})|%{' '*--$l+$_}

कम गोल्फ परीक्षण स्क्रिप्ट:

$f = {

(
    $args|% t*y|?{  # test predicate for each char in a argument string 
        $r+="$_ "   # add current char to the result string
        ++$p-gt$l   # return predicate value: current char posision is greater then line num
    }|%{            # if predicate is True
        $r          # push the result string to a pipe
        rv r,p      # Remove-Variable r,p. This variables will be undefined after it.
        $l++        # increment line number
    }

)|%{                # new loop after processing all characters and calculating $l
    ' '*--$l+$_     # add spaces to the start of lines
}                   # and push a result to a pipe

}

@(
    ,("R",
    "R ")

    ,("cat",
    " c ",
    "a t ")

    ,("monk3y",
    "  m ",
    " o n ",
    "k 3 y ")

    ,("meanIngfu1",
    "   m ",
    "  e a ",
    " n I n ",
    "g f u 1 ")

    ,("^/\/|\/[]\",
    "   ^ ",
    "  / \ ",
    " / | \ ",
    "/ [ ] \ ")

    ,("Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Ican'tcountverywell,ok?",
    "              T ",
    "             h i ",
    "            s r u ",
    "           n o f c ",
    "          h a r a c ",
    "         t e r s i s ",
    "        m e a n t t o ",
    "       h a v e a l e n ",
    "      g t h t h a t c a ",
    "     n b e e x p r e s s ",
    "    e d a s a t r i a n g ",
    "   u l a r n u m b e r . D ",
    "  i d i t w o r k ? Y o u t ",
    " e l l m e , I c a n ' t c o ",
    "u n t v e r y w e l l , o k ? ")

    ,("*/\/|\/|o\/|o|\/o|o|\/||o|o\/o|||o|\/o||o|||\/||o|||o|\/|o|||o||o\",
    "          * ",
    "         / \ ",
    "        / | \ ",
    "       / | o \ ",
    "      / | o | \ ",
    "     / o | o | \ ",
    "    / | | o | o \ ",
    "   / o | | | o | \ ",
    "  / o | | o | | | \ ",
    " / | | o | | | o | \ ",
    "/ | o | | | o | | o \ ")

) | % {
    $s,$expected = $_
    $result = &$f $s
    "$result"-eq"$expected"
    $result
}

आउटपुट:

True
R
True
 c
a t
True
  m
 o n
k 3 y
True
   m
  e a
 n I n
g f u 1
True
   ^
  / \
 / | \
/ [ ] \
True
              T
             h i
            s r u
           n o f c
          h a r a c
         t e r s i s
        m e a n t t o
       h a v e a l e n
      g t h t h a t c a
     n b e e x p r e s s
    e d a s a t r i a n g
   u l a r n u m b e r . D
  i d i t w o r k ? Y o u t
 e l l m e , I c a n ' t c o
u n t v e r y w e l l , o k ?
True
          *
         / \
        / | \
       / | o \
      / | o | \
     / o | o | \
    / | | o | o \
   / o | | | o | \
  / o | | o | | | \
 / | | o | | | o | \
/ | o | | | o | | o \

0

सी #, 202

string r(string s,List<string> o,int i=1){o=o.Select(p=>" "+p).ToList();o.Add(String.Join(" ",s.Substring(0,i).ToCharArray()));return s.Length==i?String.Join("\n",o):r(s.Substring(i,s.Length-i),o,i+1);}

मुझे नहीं पता कि क्या यह कोड-गोल्फ में कानूनी है लेकिन, क्या फ़ंक्शन की गिनती में कोई सूची पास होती है? मुझे फ़ंक्शन के बाहर घोषित सूची <string> के बिना इसे पुनः प्राप्त करने का कोई तरीका नहीं मिल रहा है इसलिए मैंने इसे एक पैरामीटर के रूप में रखा।

उपयोग:

 r("1",new List<string>());
 r("123", new List<string>());
 r("123456", new List<string>());
 r("Thisrunofcharactersismeanttohavealengththatcanbeexpressedasatriangularnumber.Diditwork?Youtellme,Icanstcountverywell,ok?",new List<string>());

0

सी, 102 बाइट्स

i,j;main(n,s){for(n=sqrt(strlen(gets(s))*2);j<n;printf("%*.1s",i>1?2:i*(n-j),i++>j?i=!++j,"\n":s++));}


0

आर, 142 बाइट्स

मुझे यकीन है कि मैं इसे और नीचे ला सकता हूं। हालांकि उस पर काम कर रहे हैं। मुझे लगता है कि मुझे एक आसान पुनरावृत्ति याद आ रही है - लेकिन मैं इसे छोटा नहीं कर पाया हूं।

f=function(a){n=nchar(a);l=which(cumsum(1:n)==n);w=strsplit(a,c())[[1]];for(i in 1:l){cat(rep(" ",l-i),sep="");cat(w[1:i],"\n");w=w[-(1:i)]}}

ungolfed

f=function(a){
    n = nchar(a)                 #number of characters
    l= which(cumsum(1:n)==n)     #which triangle number
    w= strsplit(a,c())[[1]]      #Splits string into vector of characters
    for (i in 1:l) {
        cat(rep(" ",l-i),sep="") #preceeding spaces
        cat(w[1:i],"\n")         #Letters
        w=w[-(1:i)]              #Shifts removes letters (simplifies indexing)
    }
}

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