Teks Triangulasi


39

Tulis program atau fungsi yang mengambil string yang dijamin hanya berisi karakter ASCII yang dapat dicetak kecuali ruang, dan menjadi angka segitiga positif (panjang 1, 3, 6, 10, 15, ...).

Cetak atau kembalikan string yang sama, tetapi bentuk menjadi segitiga menggunakan spasi. Beberapa contoh terbaik akan menunjukkan apa yang saya maksud:

Jika inputnya Rmaka output akan menjadi

R

Jika inputnya catmaka output akan menjadi

 c
a t

Jika inputnya monk3ymaka output akan menjadi

  m
 o n
k 3 y

Jika inputnya meanIngfu1maka output akan menjadi

   m
  e a
 n I n
g f u 1

Jika inputnya ^/\/|\/[]\maka output akan menjadi

   ^
  / \
 / | \
/ [ ] \

Jika inputnya

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

maka hasilnya akan menjadi

              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 ?

Pada dasarnya, baris baru disisipkan di antara substring dengan panjang segitiga, spasi ditambahkan di antara semua karakter, dan setiap baris diberi indentasi dengan spasi agar sesuai dengan bentuk segitiga.

Sebuah baris baru dan garis trailing dengan spasi tambahan secara opsional diizinkan, tetapi jika tidak, output Anda harus persis sama dengan contoh-contoh ini. Baris terakhir dari segitiga seharusnya tidak memiliki spasi di depan.

Kode terpendek dalam byte menang.


Apakah ada nilai absolut panjang string?
geokavel

@geokavel Ini seharusnya bisa digunakan untuk string apa saja yang biasanya bisa ditangani oleh bahasa Anda.
Hobi Calvin

11
Ini pohon Natal untuk siapa saja yang belum memakainya. * / \ / | \ / | o \ / | o | \ / o | o | \ / || o | o \ / o ||| o | \ / o || o || | \ / || o | || o | \ / | o || o || o \
Timmy

Jawaban:


9

Pyth, 22 byte

jua+L\ GjdHfTczsM._UzY

Cobalah online: Demonstrasi atau Test Suite

Penjelasan:

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 byte

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

Fungsi rekursif. Mulai dari akhir s, memotong dan mencetak karakter. Jumlah karakter yang akan diambil dihitung dari panjang s. Fungsi ini diatur untuk mencetak dalam urutan terbalik dari panggilan rekursif, yang berakhir ketika skosong dan kemudian menyelesaikan kembali jalur. Setiap lapisan, awalan pmemiliki ruang tambahan yang ditambahkan.

Dalam Python 3, ifini dapat dilakukan melalui hubungan arus pendek, meskipun ini tampaknya tidak menghemat karakter:

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

Alternatif yang sama panjangnya dengan rantai ketimpangan:

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

Keduanya printdan fkembali None, yang sulit digunakan.


1
Ini cukup pintar. Dengan memotong string satu baris pada satu waktu, Anda masih memiliki string panjang segitiga untuk menghitung jumlah spasi terdepan.
xsot

6

Retina , 108 102 94 87 82 64 63 byte

Terima kasih kepada Sp3000 untuk membuat saya mengejar pendekatan asli saya, yang membawa jumlah byte dari 108 ke 82.

Terima kasih banyak kepada Kobi yang menemukan solusi yang jauh lebih elegan, yang memungkinkan saya untuk menyimpan 19 byte lagi.

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

Dimana <space>mewakili karakter spasi tunggal (yang kalau tidak akan dilucuti oleh SE). Untuk tujuan penghitungan, setiap baris masuk dalam file terpisah dan \nharus diganti dengan karakter linefeed yang sebenarnya. Untuk kenyamanan, Anda dapat menjalankan kode seperti dari satu file dengan -sbendera.

Cobalah online.

Penjelasan

Yah ... seperti biasa saya tidak bisa memberikan pengantar penuh untuk menyeimbangkan kelompok di sini. Untuk primer, lihat jawaban Stack Overflow saya .

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

Tahap pertama adalah tahap Split, yang membagi input menjadi garis-garis yang semakin panjang. Yang _menunjukkan bahwa potongan kosong harus dihilangkan dari pemisahan (yang hanya mempengaruhi akhir, karena akan ada kecocokan di posisi terakhir). Regex itu sendiri sepenuhnya terkandung dalam look-around sehingga tidak akan cocok dengan karakter apa pun, tetapi hanya posisi.

Bagian ini didasarkan pada solusi Kobi dengan golfitude tambahan yang saya temukan sendiri. Perhatikan bahwa lookbehinds dicocokkan dari kanan ke kiri di .NET, jadi penjelasan berikut sebaiknya dibaca dari bawah ke atas. Saya juga memasukkan yang lain \Gdalam penjelasan untuk kejelasan, meskipun itu tidak perlu untuk pola untuk bekerja.

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

Saya masih mengagumi karya Kobi di sini. Ini bahkan lebih elegan daripada regex pengujian utama. :)

Mari kita beralih ke tahap selanjutnya:

.
$0 

Sederhana: masukkan spasi setelah setiap karakter non-linefeed.

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

Tahap terakhir ini membuat indentasi semua garis dengan benar untuk membentuk segitiga. Ini mhanya mode multiline biasa untuk ^mencocokkan awal baris. The +memberitahu Retina mengulangi tahap ini sampai string berhenti berubah (yang, dalam hal ini berarti bahwa regex pertandingan tidak lagi).

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

Jadi ini cocok dengan awal dari setiap baris yang tidak memiliki indentasi lebih besar dari yang berikutnya. Dalam posisi apa pun kita memasukkan spasi. Proses ini berakhir, setelah garis disusun dalam segitiga yang rapi, karena itulah tata letak minimal di mana setiap baris memiliki indentasi yang lebih besar daripada yang berikutnya.



@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Sekarang dengan 100% lebih banyak keagungan, milik Kobi.
Martin Ender

6

Candy , 67 59 57 byte

&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

atau:

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

bentuk panjang:

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

Ya, saya merasa Natal-y.
Dale Johnson

5

CJam, 27 26 byte

Terima kasih kepada Sp3000 untuk menghemat 1 byte.

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

Anehnya dekat dengan Pyth, mari kita lihat apakah ini bisa golf ...

Uji di sini.

Penjelasan

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

Mengapa itu tidak berfungsi jika saya beralih ' ke S???
geokavel

@geokavel Karena Sadalah string, bukan karakter, maka fakan memetakan string yang bukan daftar garis.
Martin Ender

Itu dugaanku. Apakah Anda punya ide tentang alasan untuk membuat S string?
geokavel

@geokavel Tidak, saya tidak.
Martin Ender

5

Ruby, 84 77 73 byte

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

77 byte

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

Mengurangi beberapa byte lagi dengan menghapus variabel rseperti yang disarankan oleh steveverrill.

84 byte

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

Tidak Disatukan:

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

Pertama menghitung angka segitiga dari string input

n=v.size**0.5*1.4

yaitu misalnya ukuran string input adalah 120 dan angka segitiga n kita, akan menjadi 15.

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

Pada baris di atas, ia mencetak spasi diikuti oleh serangkaian string yang diambil dari string input menggunakan pola berikut

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

Pemakaian:

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 ?

Wow, pendekatan kami sangat mirip, tetapi kami tampaknya memiliki pengetahuan golf yang saling melengkapi. Saya tidak tahu uptotidak memerlukan argumen integer, ( timestentu saja tidak.) Saya telah memasukkan beberapa sintaks Anda ke dalam revisi jawaban saya. Kiat terbesar yang saya miliki untuk Anda adalah, Anda tidak perlu variabel itu r. Cukup gunakan ,alih - alih ..dan nomor setelah koma adalah jumlah total elemen yang akan dikembalikan, bukan akhir rentang.
Level River St

Benar. Terima kasih atas tipnya, saya segera memperbarui jawaban saya :)
Vasu Adari

4

Pyth, 27 byte

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 Suite

Pendekatan yang menarik - keharusan, dan menggunakan .I. Mungkin golf.


4

C, 138 136 134 byte

Mengambil string sebagai input:

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

Anda tampaknya telah mengalahkan JavaScript dengan C sejauh 1 byte: D
Mark K Cowan

@MarkKCowan ya, rupanya. Saya harap saya membuatnya lebih kecil! :)
Sahil Arora

@SahilArora - Anda dapat mengganti printf(" ")danprintf("\n") dengan puts(" ")dan puts("\n"). Setiap subtitusi akan menghemat 2 byte. :)
enhzflep

@enhzflep Saya sudah mencobanya, itu memberikan output yang ambigu!
Sahil Arora

Oh :( Berfungsi dengan baik di sini pada win7 dengan gcc 4.7.1 - Saya kira itu ada hubungannya dengan cara agar keluaran printf memerah ke stdout. +1 untuk mengalahkan Javascript.
enhzflep

4

Pendekatan Ruby 2 rev 1, 76 byte

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

Dioptimalkan menggunakan ide-ide sintaksis dari jawaban Vasu Adari, ditambah beberapa tikungan saya sendiri.

Pendekatan Ruby 2 rev 0, 93 byte

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

Pendekatan yang sama sekali berbeda. Pertama kita menambahkan spasi di antara karakter input. Lalu kami mencetak baris demi baris.

Pendekatan Ruby 1, 94 byte

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

ini berakhir jauh lebih lama dari yang diperkirakan.

w berisi jumlah karakter yang dapat dicetak di baris bawah, atau yang setara, jumlah garis.

Setiap baris berisi wkarakter spasi putih (yang terakhir adalah baris baru) sehingga idenya adalah untuk mencetak karakter spasi putih ini dan masukkan karakter yang dapat dicetak jika perlu.


3

Minkolang 0,14 , 42 byte

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

Coba di sini.

Penjelasan

(                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
Hitungan byte yang sempurna! kerja bagus!
TanMath

1
@TanMath tetapi 42 bukan angka segitiga!
Paŭlo Ebermann

3

Python 2, 88 85 byte

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

Terima kasih xnor untuk menyimpan 3 byte.


Tidakkah memperpendek smengacaukan perhitungan jumlah ruang?
xnor

Oh benar Saya menghapus variabel sementara sebelum mengirimkan tetapi tidak menyadari bahwa itu membatalkan kode.
xsot

Bagaimana jika Anda memang suka sebelumnya tetapi menyimpan cadangan S=s=raw_input()?
xnor

Saran yang bagus Saya pikir mungkin ada strategi keseluruhan yang lebih pendek.
xsot

Dicoret 88 terlihat lucu
pinkfloydx33

3

CJam, 50 Bytes

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

Coba di sini.

Penjelasan

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 byte

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


Apa tujuannya for (s = j = 0; j < w.length; j += s++);? Juga, di dalam <pre>, Anda dapat menggunakan \nbukan <br>. Juga, Anda lupa menyebutkan bahwa itu adalah ES6.
Ismael Miguel

Tujuan dari loop pertama adalah untuk menghitung panjang baris terakhir, sehingga untuk indentasi setiap baris dengan benar.
nicael

2

Jawa, 258 194

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

Tidak Disatukan:

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
}

Output program:

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 ? 

Anda mungkin dapat mengimpor System.out secara statis untuk menghemat beberapa byte.
RAnders00

import static System.out;adalah 25 byte, dan System.7 byte. Ini digunakan tiga kali, dan 21 <25 sehingga benar-benar akan meningkatkan ukuran 4 byte. Namun, petunjuk yang baik, impor statis dapat menghemat ruang dan tidak semua orang tahu tentang mereka.

1
Saya sedang mencari jawaban lama ketika saya menemukan ini: "menulis sebuah program atau fungsi " yang awalnya tidak saya sadari. Melucuti barang-barang kelas menghemat ruang. Saya membuatnya menjadi fungsi yang tepat dan menemukan beberapa byte lagi untuk dicukur.

1

JavaScript (ES6), 106 byte

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

Menggunakan rekursi alih-alih for loop untuk membangun string.

Untuk menemukan panjang baris terpanjang, gunakan rumus untuk angka segitiga n T_ntersebut T_n = (n^2 + n)/2. Diberikan ndan dipecahkan untuk T_nmenggunakan rumus kuadratik, kami memiliki:

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

Ternyata setelah lantai, menambahkan 1/4 di dalam akar kuadrat tidak mengubah hasilnya, maka rumus untuk baris terpanjang adalah Math.sqrt(2*a.length)|0.



1

Powershell, 69 byte

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

Skrip uji yang kurang golf:

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

Keluaran:

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

Saya tidak tahu apakah ini legal dalam kode-golf tetapi, apakah meneruskan daftar dalam fungsi berfungsi? Saya tidak dapat menemukan cara untuk mengulang ini tanpa Daftar <string> dideklarasikan di luar fungsi jadi saya menempatkannya sebagai parameter.

Pemakaian:

 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 byte

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 byte

Cukup yakin saya bisa mendapatkan ini lebih banyak. Masih bekerja pada itu. Saya merasa seperti kehilangan rekursi yang mudah - tetapi saya belum dapat mempersingkatnya dengan benar.

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.