テキストの三角形化


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

@geokavelそれはあなたの言語が通常扱える任意の長さの文字列に対して機能するはずです。
カルビンの趣味

11
これはまだ自分のものを入れていない人のためのクリスマスツリーです。* / \ / | \ / | o \ / | o | \ / o | o | \ / || o | o \ / o ||| o | \ / o || o ||| \ / || o | || o | \ / | o ||| o || o \
ティミー

回答:


9

Pyth、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

Python、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に余分なスペースが追加されます。

Python 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:]))

両方printfreturn None、これは使いにくいです。


1
これは非常に賢い方法です。一度に1行ずつ文字列を切り取ると、先頭のスペースの数を計算するための三角形の長さの文字列になります。
xsot

6

網膜108 102 94 87 82 64 63バイト

オリジナルのアプローチを追求してくれたSp3000に感謝します。これにより、バイト数が108から82に減少しました。

より洗練されたソリューションを見つけたKobiに多大な感謝を捧げました。その上でさらに19バイトを節約することができました。

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

where <space>は単一のスペース文字を表します(そうでなければSEによって除去されます)。カウントのために、各行は個別のファイル\nに入れられ、実際の改行文字に置き換える必要があります。便宜上、-sフラグ付きの単一ファイルからコードをそのまま実行できます。

オンラインでお試しください。

説明

さて...いつものように、ここでグループのバランスを完全に紹介することはできません。入門書については、Stack Overflowの回答をご覧ください

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

最初のステージはSプリットステージで、入力を長さの長い行に分割します。_(最後の位置に一致が存在することになるので、端部のみに影響を与え、)空のチャンクが分割から除外されるべきであることを示します。正規表現自体は完全にルックアラウンドに含まれているため、どの文字にも一致せず、位置のみに一致します。

この部分は、Kobiのソリューションに基づいています。後読みは.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^、行の先頭に一致させるための通常の複数行モードです。+文字列が変化しなくなるまで、この段階を繰り返すように網膜に伝える(これは、この場合の手段でその正規表現はもはや一致)。

^      # 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̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳今、Kobiのご厚意により、さらに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

CJam、27 26バイト

1バイトを節約してくれたSp3000に感謝します。

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

驚いたことに、Pythの近くで、これがゴルフできるかどうか見てみましょう...

ここでテストしてください。

説明

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

@geokavel Sは文字ではなく文字列であるためf、行のリストではなくその文字列にマップされます。
マーティンエンダー

それは私の推測でした。Sを文字列にする理由について何か考えはありますか?
geokavel

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

rsteveverrillが示唆するように変数を削除することで、さらに数バイトを削減しました。

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

ゴルフをしていない:

->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。の,代わりにを 使用..します。カンマの後の数字は、範囲の終わりではなく、返す要素の総数です。
レベルリバーセント

本当です。ヒントをありがとう、すぐに私の答えを更新しています:)
Vasu Adari

4

Pyth、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

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

あなたはこれまでに1バイトでCとビートJavaScriptを持っているように見える:D
マーク・K・コーワン

@MarkKCowanはい、明らかに。もっと小さくしたいと思います!:)
サヒルアローラ

@SahilArora- printf(" ")printf("\n")puts(" ")、とで置き換えることができputs("\n")ます。置換ごとに2バイト節約できます。:)
enhzflep

@enhzflepすでに試してみましたが、あいまいな出力になりました!
サヒルアローラ

ああ。:(ここではgcc 4.7.1を使用したwin7で正常に動作します
-printf

4

Rubyアプローチ2 rev 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]}}

Vasu Adariの回答からの構文のアイデアに加えて、私自身のいくつかの工夫を使用して最適化されました。

Rubyアプローチ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行ずつ印刷します。

Rubyアプローチ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

Minkolang 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
このような完璧なバイトカウント!よくやった!
TanMath

1
@TanMathが42は三角数字ではありません!
パエロエベルマン

3

Python 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

CJam、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

JavaScript(ES6)、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>。また、ES6であることを忘れていました。
イスマエルミゲル

最初のループの目的は、最後の行の長さをカウントして、各行を適切にインデントすることです。
ニカエル

2

Java、258 194

ゴルフ:

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

ゴルフをしていない:

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を静的にインポートして、いくつかのバイトを節約できます。
RAnders00

import static System.out;は25バイトで、System.7バイトです。これは3回使用され、21 <25であるため、実際にはサイズが4バイト増加します。ただし、静的インポートはスペースを節約でき、誰もがそれを知っているわけではありません。

1
これを見つけたとき、私は古い答えを経験していました。「プログラムや関数を書く」ということで、最初は気づきませんでした。クラスのものを取り除くと、スペースが節約されました。私はそれを適切な関数にし、さらに数バイト削る必要があることを発見しました。

1

JavaScript(ES6)、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))

forループの代わりに再帰を使用して、文字列を作成します。

最長の行の長さを見つけるために、n番目の三角形の数の数式を使用しT_nていますT_n = (n^2 + n)/2。二次式nT_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

Powershell、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

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

これがコードゴルフで合法かどうかはわかりませんが、関数のリストを渡すことはカウントされますか?関数の外部で宣言されたList <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

C、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

R、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)]}}

食べない

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.