Üçgenleme Metni


39

Boşluk dışında yalnızca yazdırılabilir ASCII karakterleri içerdiği ve uzunlukları pozitif bir üçgen sayı (1, 3, 6, 10, 15, ...) olduğu garanti edilen bir dizgide geçen bir program veya işlev yazın .

Aynı diziyi yazdırın veya iade edin, ancak boşlukları kullanarak bir üçgene şekillendirin. Bazı örnekler en iyi ne demek istediğimi gösterecek:

Giriş ise Ro zaman çıkış olacaktır.

R

Giriş ise cato zaman çıkış olacaktır.

 c
a t

Giriş ise monk3yo zaman çıkış olacaktır.

  m
 o n
k 3 y

Giriş ise meanIngfu1o zaman çıkış olacaktır.

   m
  e a
 n I n
g f u 1

Giriş ise ^/\/|\/[]\o zaman çıkış olacaktır.

   ^
  / \
 / | \
/ [ ] \

Giriş ise

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

o zaman çıktı olacak

              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 ?

Temel olarak, üçgen uzunluktaki alt dizelerin arasına yeni çizgiler eklenir, tüm karakterler arasına boşluk eklenir ve her çizgi üçgen şekline uygun boşluklarla girintilidir.

Tek bir sondaki yeni satır ve sondaki boşluklara sahip satırlara isteğe bağlı olarak izin verilir, ancak aksi halde çıktınız bu örneklerle tam olarak eşleşmelidir. Üçgenin son satırında ön boşluk bulunmamalıdır.

Bayt cinsinden en kısa kod kazanır.


Dize uzunluğu olabilir mutlak bir maksimum var mı?
geokavel

@geokavel Dilinizin normal olarak kullanabileceği herhangi bir uzunlukta string için çalışmalıdır.
Calvin'in Hobileri

11
İşte henüz bir şey yapmayanlar için bir Noel ağacı. * / \ / | \ / | o \ / | o | \ / o | o | \ / || o | o \ / o ||| o | \ / o || o ||| \ / || o | || o | \ / | o ||| o || o \
Timmy

Yanıtlar:


9

Pyth, 22 bayt

jua+L\ GjdHfTczsM._UzY

Çevrimiçi deneyin: Gösteri veya Test Paketi

Açıklama:

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

Python, 81 bayt

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

Özyinelemeli bir işlev. Sonundan itibaren s, doğrama ve karakter yazdırma. Alınacak karakter sayısı, uzunluğundan hesaplanır s. İşlev, özyinelemeli aramaların tersi sırayla yazdırmak üzere ayarlanmıştır; bunlar sboş olduğunda sona erer ve ardından hattı geri giderir. Her katman, önek peklenmiş bir ekstra alana sahiptir.

Python 3'te ifkısa devre ile yapılabilir, ancak bu karakterleri kurtarmıyor gibi görünüyor:

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

Eşitsizlik zincirleme ile eşit derecede uzun bir alternatif:

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

Her ikisi de printve fgeri dönüş None, kullanımı zor.


1
Bu oldukça zekice. Her seferinde bir satır dizgiyi keserek, öndeki boşluk sayısını hesaplamak için hala üçgen uzunluklu bir dizge ile son bulursunuz.
xsot

6

Retina , 108 102 94 87 82 64 63 bayt

Bayt sayısını 108'den 82'ye getiren özgün yaklaşımımı takip etmemi sağladığı için Sp3000'e teşekkürler.

Çok daha zarif bir çözüm bulan Kobi'ye büyük teşekkür, bunun üzerine 19 baytı daha kurtarmamı sağladı.

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

Burada <space>(aksi SE ile sıyrılmıştır olacaktır) tek bir boşluk karakteri temsil eder. Sayma amacıyla, her satır ayrı bir dosyaya gider ve \ngerçek bir satır besleme karakteri ile değiştirilmelidir. Kolaylık sağlamak için kodu tek bir dosyadan olduğu gibi -sbayrakla çalıştırabilirsiniz.

Çevrimiçi deneyin.

açıklama

Şey ... her zamanki gibi burada dengeleme gruplarına tam bir giriş yapamam. Bir astar için Yığın Taşması cevabına bakın .

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

İlk aşama, Sgirdiyi artan uzunluktaki çizgiler halinde bölen bir plit aşamasıdır. _Boş parçaları (son konumunda bir maç olacak çünkü sadece, son etkiler) parçalanması sonucunda ihmal edilmesi gerektiğini belirtir. Regex'in kendisi tamamen etrafa bakıyor, bu yüzden karakterlerle eşleşmeyecek, yalnızca konumlarla eşleşecek.

Bu bölüm, Kobi'nin kendimi bulduğum ek büyüklükteki çözümüne dayanıyor. Lookbehind'lerin .NET'te sağdan sola eşleştirildiğini unutmayın; bu nedenle aşağıdaki açıklama en iyi aşağıdan yukarıya okunmalıdır. Ayrıca \G, desen çalışması için gerekli olmasa da, açıklama için başka bir açıklama ekledim.

(?<=
  ^         # 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.

Hala Kobi'nin çalışmalarına burada hayranım. Bu, birinci test regex'inden bile daha zarif. :)

Bir sonraki aşamaya geçelim:

.
$0 

Basit: Satır dışı her karakterden sonra bir boşluk bırakın.

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

Bu son aşama, üçgeni oluşturmak için tüm çizgileri doğru bir şekilde girer. mYapmak için sadece olağan satırlı modu ^, satırın başıyla eşleşir. +Dize değişen durana kadar bu aşamayı tekrarlamak Retina söyler (ki bu durumda araçlarında olduğu regex artık maçları).

^      # 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.
)

Yani bu, diğerinden daha büyük bir girintiye sahip olmayan herhangi bir satırın başlangıcıyla eşleşir. Böyle bir pozisyonda bir boşluk ekleriz. Bu işlem, çizgiler düzgün bir üçgen şeklinde düzenlendiğinde sona erer, çünkü her çizginin diğerinden daha büyük girintiye sahip olduğu minimum düzen budur.



@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Şimdi% 100 daha fazla şaşırtıcılık ile Kobi'nin izniyle.
Martin Ender

6

Şeker , 67 59 57 bayt

&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

veya:

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

uzun biçim:

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

Evet, Noel-y'yi hissettim.
Dale Johnson,

5

CJam, 27 26 bayt

1 byte tasarruf için Sp3000 teşekkürler.

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

Şaşırtıcı bir şekilde Pyth'a yakın, bakalım bu golf oynuyor mu ...

Burada test et.

açıklama

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

Ben değiştirirseniz neden çalışmıyor ' için S???
geokavel

@geokavel SKarakter değil, bir dize olduğundan fsatır listesi yerine bu dizginin üzerinde eşlenir .
Martin Ender

Benim tahminim buydu. S'yi dize yapmak için gerekçeyle ilgili herhangi bir fikriniz var mı?
geokavel

@geokavel Hayır.
Martin Ender

5

Ruby, 84 77 73 bayt

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

77 bayt

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

rSteveverrill tarafından önerilen değişkeni kaldırarak daha az sayıda bayt azaltıldı.

84 bayt

->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*" "
  }
}

Girilen dizgeden ilk önce üçgen sayı hesaplaması

n=v.size**0.5*1.4

örneğin, giriş dizesi boyutu 120'dir ve üçgen sayı n, 15 olacaktır.

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

Yukarıdaki satırda boşlukları izler, ardından aşağıdaki deseni kullanarak giriş dizesinden getirilen dizi dizisini izler.

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

Kullanımı:

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 ?

Vay, yaklaşımlarımız çok benzer, ancak tamamlayıcı golf bilgisine sahip gibiyiz. Bilmiyordum uptotamsayı bir argüman gerektirmez, ( timeskesinlikle.) Bazı sözdiziminizi cevabımı gözden geçirdim. Sana verdiğim en büyük ipucu, bu değişkene ihtiyacın yok r. Bunun ,yerine sadece kullanın ..ve virgül sonrasındaki sayı, aralığın sonundan ziyade döndürülecek toplam öğe sayısıdır.
Seviye Nehri St

Doğru. Bahşiş için teşekkürler,
yanıtımı

4

Pyth, 27 bayt

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.

Test odası

İlginç bir yaklaşım - zorunlu ve kullanır .I. Muhtemelen golf oynayabilir.


4

C, 138 136 134 bayt

Giriş olarak bir dize alır:

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++]);}}

Şimdiye kadar JavaScript’i C by 1 byte yendiğiniz görülüyor: D
Mark K Cowan

@MarkKCowan evet, görünüşe göre. Umarım daha da küçük yaparım! :)
Sahil Arora

@SahilArora - Sen değiştirebilir printf(" ")ve printf("\n")ile puts(" ")ve puts("\n"). Her oyuncu değişikliği 2 bayt kurtarır. :)
enhzflep

@enhzflep Zaten denedim, belirsiz bir çıktı verdi!
Sahil Arora

Ah. :( İşleri ince buraya gcc 4.7.1 ile win7 üzerinde - Ben printf çıktı Stdout'a akış olmasına yol ile ilgisi olduğunu tahmin 1 JavaScript dövmek için..
enhzflep

4

Yakut yaklaşımı 2 rev 1, 76 bayt

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

Vasu Adari'nin cevabındaki sözdizimi fikirlerini kullanarak ve ayrıca birkaç çevrimi kullanarak optimize edildi.

Yakut yaklaşımı 2 rev 0, 93 bayt

->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]}}

Tamamen farklı bir yaklaşım. İlk önce girişin karakterleri arasına boşluk ekleriz. Sonra satır satır satır yazdırırız.

Yakut yaklaşımı 1, 94 bayt

->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?$/:' '}}

bu beklenenden çok daha uzun sürdü.

w alt satırdaki yazdırılabilir karakterlerin sayısını veya eşdeğer olarak satır sayısını içerir.

Her satır wboşluk karakterleri (en sonuncusu newline'dır) içerir; bu nedenle fikir bu boşluk karakterlerini yazdırmak ve gerektiğinde yazdırılabilir karakterleri eklemektir.


3

Minkolang 0.14 , 42 bayt

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

Burada dene.

açıklama

(                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
Mükemmel bir bayt sayısı! aferin!
TanMath

1
@TanMath ama 42 üçgen bir sayı değil!
Paŭlo Ebermann 30:15

3

Python 2, 88 85 bayt

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

3 bayt kaydettiğiniz için teşekkür ederiz.


Kısaltmak s, boşluk sayısı hesaplamasını bozmaz mı?
xnor

Ah doğru. Göndermeden önce geçici bir değişkeni kaldırdım ancak kodu geçersiz kıldığını fark etmedim.
xsot

Ya daha önce hoşlanıyor ama yedeklemeyi kaydediyorsanız S=s=raw_input()?
xnor

İyi öneri. Bence muhtemelen daha kısa bir genel strateji var.
xsot

Geçti 88 komik görünüyor
pinkfloydx33

3

CJam, 50 Bayt

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

Burada dene.

açıklama

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

JavaScript (ES6), 135 bayt

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}

De-golf + demo:

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()));


Amacı ne for (s = j = 0; j < w.length; j += s++);? Ayrıca, içinde bir yerine <pre>kullanabilirsiniz . Ayrıca, ES6 olduğunu söylemeyi unuttun. \n<br>
Ismael Miguel,

İlk döngünün amacı, her bir çizgiyi uygun şekilde girintilemek için son çizginin uzunluğunu saymaktır.
nicael

2

Java, 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
}

Program çıktısı:

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 ? 

Bazı baytları kaydetmek için muhtemelen statik olarak System.out dosyasını içe aktarabilirsiniz.
RAnders00

import static System.out;25 bayttır ve System.7 bayttır. Üç kez kullanılır ve 21 <25 olduğundan , boyutu 4 byte kadar artırır . Ancak, iyi müşteri adayları, statik ithalat alandan tasarruf sağlayabilir ve herkes onları bilmez.

1
Bunu bulduğumda eski cevaplardan geçiyordum: ilk başta anlamadığım " bir program ya da işlev yaz ". Sınıftaki şeylerin sökülmesi yerden tasarruf sağladı. Uygun bir işleve girdim ve tıraş için birkaç bayt daha buldum.

1

JavaScript (ES6), 106 bayt

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

Dizeyi oluşturmak için for döngüsü yerine özyineleme kullanır.

N'inci üçgen sayısı için formül kullanmak, uzun satır uzunluğunu bulmak için T_nolan T_n = (n^2 + n)/2. Ikinci dereceden formülü kullanmak için verilen nve çözme T_n, biz var:

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

Döşemeden sonra, karekök içine 1/4 eklemek sonucu değiştirmez, bu nedenle en uzun satırın formülüdür Math.sqrt(2*a.length)|0.



1

Powershell, 69 bayt

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

Daha az golf oynadığı test senaryosu:

$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
}

Çıktı:

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

C #, 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);}

Bunun kod golfünde yasal olup olmadığını bilmiyorum, ancak işlev listesindeki bir liste geçiyor mu? Bunu, işlevi dışında bildirilen bir <string> listesi olmadan bunu tekrarlamak için bir yol bulamıyorum, bu yüzden onu parametre olarak koydum.

Kullanımı:

 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

C, 102 bayt

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

Bash + sed, 87

for((;i<${#1};i+=j));{
a+=(${1:i:++j})
}
printf %${j}s\\n ${a[@]}|sed 's/\S/ &/g;s/.//'

0

R, 142 bayt

Bunu daha iyi anlayabileceğimden eminim. Yine de bu konuda çalışıyor. Kolayca bir özyinelemeyi özlüyorum gibi hissediyorum - ancak bunu doğru bir şekilde kısaramadım.

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)
    }
}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.