縦書きの単語を含む文字列を印刷する


12

タスクは、ASCII文字の入力文字列を取得し、文字列をスペースで区切られた一連の垂直ワードとして出力することです。以下に例を示します。

与えられた文字列:

Hello, World! My name is Foo.

出力は次のようになります。

H W M n i F
e o y a s o
l r   m   o
l l   e   .
o d
, !

プログラムが端末をラップアラウンドする必要がある文字列を正しく処理する場合、10文字のボーナスポイントが付与されます。これは80文字に設定されます。

あなたのプログラムが逆もできるなら50ポイント!



3
@manatwork:そうだと思います。それは同じではありません-私は私の問題が少し簡単だと主張するかもしれません。
フーバリニョ14

100%同一ではありませんが、重複としてカウントするのに十分近いです。同一にするための削減は、各スペースを2つの改行で置き換えるだけです。
ピーターテイラー

1
@PeterTaylor:まったく違います。私の問題には、元の文字列の改行を尊重する要件はありません。この問題では、改行をスペースに変換し、スペースを2つの改行に変換する必要があります。それほど簡単な削減ではありません。
フーバリニョ14

回答:


10

J、15

|:>'\S+| 'rxall

使用法:

   |:>'\S+| 'rxall 'Hello, World! My name is Foo.'
H W M n i F
e o y a s o
l r   m   o
l l   e   .
o d        
, !        

5

Javascript- 228 172 145 126

A=prompt().split(" "),B="",N=A;for(y=0;y<N.length;y++){for(i=0;i<N.length;i++){if(A[i][y]){B+=A[i][y];}else{B+=" ";}}B+="\n";}

私の最初のコードゴルフ:)


あなたの最初の試みに最適です!
フーバリニョ14

たとえば、スペースを削除するなど、コードをできるだけ短くするようにしてください。また"Input ?"、プログラムの動作に実際には影響しないため、削除してください。
mniip 14

修正されたバグ。期待どおりに動作するはずです:)
WolleVanillebärLutz 14

1
正しく動作するようになりました。しかし、いくつかの小さなこと:変数Nは必要ありませんlength。2回尋ねる代わりに配列を保存します。A=prompt().split(" "),B="";for(y=0;y<(l=A.length);y++){for(i=0;i<l;i++)if(A[i][y])B+=A[i][y];else B+="_";B+="\n"}alert(B)。(IOJavaScript標準に関する質問では、REPLの暗黙的な出力に依存することは正しいと見なされるべきではないという意見がほとんど一致しました。)
manatwork 14

1
(未テスト)if(A[i][y]){B+=A[i][y];}else{B+=" ";}=>B+=(x=A[i][y])?x:" "
daniero 14

5

APL、22

{⍉⊃⍵⊂⍨1+0,+\2≠/⍵=' '}

説明

{              ⍵=' '}   A. check which chars are spaces           
            2≠/         B. of that vector, which consecutive pairs are different  
          +\            C. compute the partial sums                           
      1+0,              D. insert 0 at the front and add 1 to every item
   ⍵⊂⍨                     use this vector to split the original string
 ⍉⊃                        disclose into a matrix and transpose

    'W o w   S u c h   D o g e'
A.   0 0 0 1 0 0 0 0 1 0 0 0 0
B.    0 0 1 1 0 0 0 1 1 0 0 0
C.    0 0 1 2 2 2 2 3 4 4 4 4
D.  1 1 1 2 3 3 3 3 4 5 5 5 5

      {⍉⊃⍵⊂⍨1+0,+\2≠/⍵=' '} 'Hello, World! My name is Foo.'
H W M n i F
e o y a s o
l r   m   o
l l   e   .
o d        
, !        

3

ルビー、91 87

s=gets.split
puts s.map{|x|x.ljust(s.map(&:size).max,' ').split''}.transpose.map &:join

やったー、Perlを倒した!:D

ルビー、150-50ボーナス= 100

s=$<.read
n=s.index"
"
s=s.split n ?'
':' '
o=s.map{|x|x.ljust(s.map(&:size).max,' ').split''}.transpose.map &:join
puts n ?o.map(&:strip).join(' '):o

改行を検出し、検出された場合は特別な処理を適用します。

次のように実行します

ruby transposegolf.rb < transposegolfinput.txt

3

Javascript 184 149 123

var a=s.split(" "),b="",c;for(c in a)b+="<div style='float:left'>"+a[c].split("").join("<br>")+"</div>";document.write(b);

定義された文字列の例:

var s = "Hello, World! My name is Foo.";
var a=s.split(" "),b="",c;for(c in a)b+="<div style='float:left'>"+a[c].split("").join("<br>")+"</div>";document.write(b);

2番目のステートメントをブラウザコンソールにコピーできます。

未縮小:

var res = "Hello, World! My name is Foo.";
var t=res.split(" ");
var s ="";
for (var word in t){
    s+="<div style='float:left'>" + t[word].split("").join("<br />") + "</div>";
}
document.write(s);

JsFiddleリンク:http ://jsfiddle.net/FzMvK/

私の最初のコードゴルフポスト:P


非常にうまくやった
フーバリニョ14

逆支援する@FooBarrigno更新答え
RononDex

@FooBarrigno回答を更新し、リバースサポートを削除し、バイトカウントを減らすためにロジックを完全に変更しました
RononDex 14

賢い、私はそれが好きです。float:right逆に変更することはできませんか?
ダニー14

2
「逆」の意味に依存します。最初の文字が下にある場合は機能しません。それは単に言葉を逆にしている場合、それはイエス動作するはずです
RononDex

2

Perl-92 97

$_=<>;chop;@x=split$";do{print((substr$_,$q,1or$").$")for@x;$q++,print$/}while/@{['\S'x$q]}/

かなり簡単な方法で仕事をします。


ステートメント修飾子の式を括弧で囲む必要はありません。
マナトワーク14

ここでwhile使用されているのはステートメント修飾子でもあることに注意してください。
マナトワーク14

それは...ですか?do{}while()ループではありませんか?
mniip 14

いや。doそれ自体には、ブロックはありません。これwhileは別のものです。
マナトワーク14

2

K、33

{" "/:',:''x@'/:!max@#:'x:" "\:x}

入力と出力の例:

k){" "/:',:''x@'/:!max@#:'x:" "\:x}"Hello, World! My name is Foo."
"H W M n i F"
"e o y a s o"
"l r   m   o"
"l l   e   ."
"o d        "
", !        "

"そこにいるはずですか?
ベリサリウス博士14

@belisarius文字列がkでどのように表されるかです。あなたは、具体的に、あなたのことが可能にstdoutに書きたい場合は{-1@" "/:',:''x@'/:!max@#:'x:" "\:x;}せずに出力を生成します(37文字)、"
tmartin

4
さて、言語にかかわらず、出力は必要なものであると思います
ベリサリウス博士14

2

Python:

スティングを処理する1行のコード:

import sys
m = "Hello, World! My name is Foo."

map(lambda y: sys.stdout.write(' '.join(y)+'\n'), zip(*map(lambda x: x.ljust(max(map(len,m.split()))), m.split())))

2

Python 2.7、 108 103

これはもっとゴルフできると確信していますが、ここではpythonの初期ソリューションを示します。

w=raw_input().split();m=max(map(len,w));i=0
while i<m:print" ".join(map(lambda x:x.ljust(m)[i],w));i+=1

改善点:

  • split( "")=> split()
  • 余分なスペースを削除しました

良くやった!あなたが起動した場合i=m、ループダウン0に、あなたも100用に別の3つの文字を剃ることができます
DLosc

2

F#、187

let o=Console.ReadLine()
let s=o.Split(' ')
let m=s|>Seq.map String.length|>Seq.max
for l=0 to m-1 do
 for w in s|>Seq.map(fun x->x.PadRight(m,' ').[l])do printf"%c "w
 printfn"%s"""

2

ルビー、63

$F.map(&:size).max.times{|i|puts$F.map{|s|s[i]||' '}.join' '}

アルゴリズムは非常に簡単です。ゴルフのみ。コードの長さは61バイトで、それに-na必要なオプションのための2バイトが追加されています。からruby -h

-n   assume 'while gets(); ... end' loop around your script
-a   autosplit mode with -n or -p (splits $_ into $F)

サンプル実行:

$ echo 'This sentence is false' | ruby -na cols.rb
T s i f
h e s a
i n   l
s t   s
  e   e
  n    
  c    
  e

2

Pythonの2.7 - 137の 112バイト

s=raw_input().split()
for c in range(max(map(len,s))):
 for w in s:
    try:print w[c],
    except:print' ',
 print''

他の誰かがすでにそれをより良くしました、しかし、私はこれを投げるかもしれません。入力の各単語に最長の単語と同じ長さになるまでスペースを追加し(次の部分のインデックスエラーを回避するため)、0から各文字列の長さまでのc間にすべての単語のth文字を出力しcます。

私はこれを行うより良い方法を思いつき、25バイトを削減しました。インデックスエラーを回避するために文字列にスペースを埋め込むのではなく、エラーを直接処理します。印刷に何もない時はいつでも、私はとその場所に単一のスペースを印刷しtry:print w[c],except:print' ',。また、print文と文字列リテラルの間にスペースを必要とせず、1バイト節約されたことも思い出しました。

Python 2では、タブとスペースを混在させることができ、それらを個別のレベルのインデントと見なすことに注意してください。SEのMarkdownインタープリターはタブ文字を4つのスペースに置き換えますが、このプログラムの最初の行を除くすべての行には1バイトのインデントがあります。

フォーマットがあるため、かなり簡単だったprint 'something',印刷物'something 'ではなく'something\n'。私は各キャラクターに対してそれを行い、空のprintステートメントを使用して、必要な場所で改行を取得しました。


2

C、111 110 95 90バイト

このソリューションでは、VT-100制御コードを使用して、端末上のカーソルを移動します

main(int _,char**v){char*s=*++v;printf("^[7");while(*s)' '==*s?(s++,printf("^[8^[[2C^[7")):printf("%c^[[B^H",*s++);}

^[シーケンスは、ここで表示することができない単一のASCII ESC文字、のプレースホルダです。

  • ^[7 現在のポインタ位置を保存します
  • ^[8 カーソル位置を保存された位置に復元します
  • ^[[2C 右に2ステップ移動します
  • ^[[B 1ステップ下に移動します

編集1:^[[D(1つのステップは、左)VT-100コードは、バックスペースに置き換え(として示されており、^Hここでは1つのだけのASCII文字です)。また、「スペースで区切られた」命令を忘れていましたが、修正されました

編集2:

、およびの代わりにforループを使用して保存された7文字:while32' '

main(int _,char**v){printf("^[7");for(char*s=*++v;*s;s++)32==*s?printf("^[8^[[2C^[7"):printf("%c^[[B^H",*s);}

1つ少ない呼び出しで保存される8文字以上printf:三項?:演算子がprintfパラメーターで使用されるようになりました

main(int _,char**v){printf("^[7");for(char*s=*++v;*s;s++)printf(32==*s?"^[8^[[2C^[7":"%c^[[B^H",*s);}

編集3:

ローカル変数sを削除し、argv別名で直接作業しましたv。これは完全に恐ろしいです。しかし、4文字を節約しました。また、交換し==^、したがって、スイッチ?:1つのより多くの文字を保存するために、オペランドを。

main(int c,char**v){printf("^[7");for(v++;**v;)printf(32^*(*v)++?"%c^[[B^H":"^[8^[[2C^[7",**v);}

使用法

$ gcc transpose.c -o transpose --std=c99
$ ./transpose 'Hello, World! My name is Foo.'
H W M n i F
e o y a s o
l r   m   o
l l   e   .
o d
, !

ゴルフをしていないバージョン(最初のバージョン)

main (int _,char**v) {
    char*s=*++v; // init s with the address of the first letter
    printf("^[7"); // save the current cursor position
    while(*s) 
        ' '==*s ? ( /* if current char is a space */
            s++,printf("^[8^[[2C^[7") /* return to the saved location, move right, save position */
        ) : /* kind of else */
            printf("%c^[[B^H",*s++); /* print the current char, move down, move left */
}

非ゴルフバージョン(最終バージョン)

main(int c,char**v) {
    printf("^[7");
    for(v++;**v;) /* v++: make v point to argv[1] */
        printf(     
            32^*(*v)++? /* test if **v is different from ' ', and make *v point to
                           the next char */
                "%c^[[B^H":         
                "^[8^[[2C^[7",      
            **v); /* this undefined behaviour (using *v and (*v)++ in the same expression)
                     works as "expected" with gcc 4.7.2 */
} 

1
ゴルフされていないバージョンは、Befungeのように疑わしく見えます。:)
DLosc 14年

2

ずっと前にこの質問答えました。実際、このサイトへの私の最初の貢献の1つでした。私は最近、それに再び出くわし、ちょっと恥ずかしかったです。112バイト?!受け入れられない。だから私はそれに別のショットを与えた:

Python 3-92バイト

s=input().split()
print('\n'.join(map(' '.join,zip(*[a.ljust(max(map(len,s)))for a in s]))))

最初の回答を投稿してから109日間、私は長い道のりを歩んできたと思っています。Python 3を2.7 1で使用するようなものでさえ、私には起こりませんでした。このコードを100バイト未満にまで下げると、私の魂は最終的に休息でき、死後の世界に進むことができます。

説明

s=input().split()

これは行を取得し、stdin空白文字でリストを分割してリストを作成します。入力にある可能性が高い唯一の空白はスペースであるため、この行は単語のリストを取得します。

2行目を内側から見てみましょう。

                                           max(map(len,s))

map関数とiterableを引数として取ります。iterableの各要素に関数を適用し、結果の新しいiterableを返します。ここでは、各入力語の長さでイテラブルを作成します。maxイテラブルから最大値を取得します。これにより、入力の中で最も長い単語が取得されます。

                                  [a.ljust(              )for a in s]

リストの内包表記はに似ていmapます。iterableのすべての要素に対して何かを行い、結果のリストを返します。入力内のすべての単語に対して、that_word.ljust(いくつかのコードを実行します)ljust「左揃え」の略です。引数として整数を取り、その長さになるまで文字列にスペースを追加します。

                             zip(*                                    )

これはきちんとしたトリックです。このコンテキストで*は、「この反復可能オブジェクトを複数の引数として解凍する」ことを意味します。このように、行列zip転置するために使用できます(例zip(*[(1,2),(3,4)])-> [(1,3),(2,4)])。唯一の制限は、マトリックス内のすべての行が同じ長さでなければならないこと、またはすべての行の要素のうち最短のものが一致するように切り取られることです。

                map(' '.join,                                          )

私たちはすでに何をしているのかを知ってmapいます。ここでの唯一の新しいものはjoin、文字列の反復可能要素を受け取り、それが接続されている区切り文字を使用して単一の文字列にします。たとえば、'a'.join(['I', 'can', 'play', 'the', 'saxophone'])2はになりIacanaplayatheasaxophoneます。

print('\n'.join(                                                        ))

これjoinは一連の文字列を受け取り、改行で区切ります。残っているすべては、にあるprintstdout、私たちは完了です。

すべて一緒に:

print('\n'.join(map(' '.join,zip(*[a.ljust(max(map(len,s)))for a in s]))))

入力から最も長い単語の長さを見つけ、同じ長さになるまですべての単語にスペースを追加し、zip(*3トリックで転置し、join行の各文字をスペースでjoin区切り、再び各行を改行で区切ります。そして印刷!92バイトのプログラムで唯一の非入力処理行については悪くありません。


1. print()の括弧に費やされた余分な文字は、ドロップする4文字分だけ増えていますraw_input()-> input()
2.サックスを実際に演奏できません。
3. )。どういたしまして。


2
これがCWである理由はわかりません。誤ってボタンを押した可能性があります。しかたがない。
地下

あなたは変更することができますprint("\n".join(...))*map(print,...),オンラインでお試しください!
ジョーキング

2

05AB1E、スコア8 -20 -21(30 29 バイト -50ボーナス):

|Dgi#ζεSðý}»}ë¹ε2ô€¬}ζJεðÜ}ðý

オンラインで試してください(通常の単一行​​入力)。
オンラインで試してみてください(複数行反転入力)。

説明:

|                     # Take the input split on newlines:
                      #  i.e. 'This is a test' → ['This is a test']
                      #  i.e. 'T i a t\nh s   e\ni     s\ns     t'
                      #    → ['T i a t','h s   e','i     s','s     t']
 Dg                   #  Duplicate this list, and take the length
                      #   i.e. ['This is a test'] → 1
                      #   i.e. ['T i a t','h s   e','i     s','s     t'] → 4
   i         }        # If the length is exactly 1:
    ¹                 #  Take the input again 
     #                #  Split the input-string by spaces
                      #   i.e. 'This is a test' → ['This','is','a','test']
      ζ               #  Zip with space-filler: Swap all rows and columns
                      #   i.e. ['This','is','a','test'] → ['Tiat','hs e','i  s','s  t']
       ε   }          #  For each item:
        S             #   Convert the item to a list of characters
                      #    i.e. 'Tiat' → ['T','i','a','t']
         ðý           #   Join them by a single space
                      #    i.e. ['T','i','a','t'] → 'T i a t'
            »         #  Join the result by newlines (and output implicitly)
    ë                 # Else:
     ε    }           #  For each item:
      2ô              #   Split it into chunks of two characters
                      #    i.e. 'h s   e' → ['h ','s ','  ','e']
        €¬            #   Take the head (first character) of each:
                      #    i.e. ['h ','s ','  ','e'] → ['h','s',' ','e']
           ζ          #  Zip with space-filler: Swap all rows and columns
                      #   i.e. [['T','i','a','t'],['h','s',' ','e'],['i',' ',' ','s'],['s',' ',' ','t']]
                      #     → [['T','h','i','s'],['i','s',' ',' '],['a',' ',' ',' '],['t','e','s','t']]
            J         #  Join each inner list to a single string
                      #   i.e. [['T','h','i','s'],['i','s',' ',' '],['a',' ',' ',' '],['t','e','s','t']]
                      #     → ['This','is  ','a   ','test']
             ε  }     #  For each item:
              ðÜ      #   Remove any trailing spaces
                      #    i.e. 'is  ' → 'is'
                 ðý   #  Join the items by a single space (and output implicitly)

元の8バイトの回答:

#ζεSðý}»

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

説明:

#           # Split the input-string by spaces
            #  i.e. 'This is a test' → ['This','is','a','test']
 ζ          # Zip with space-filler: Swap all rows and columns
            #  i.e. ['This','is','a','test'] → ['Tiat','hs e','i  s','s  t']
  ε   }     # For each item:
   S        #  Convert the item to a list of characters
            #   i.e. 'Tiat' → ['T','i','a','t']
    ðý      #  Join them by a single space
            #   i.e. ['T','i','a','t'] → 'T i a t'
       »    # Join the result by newlines (and output implicitly)

1

Mathematica 49

明らかに、Mathematicaはこれに最適ではありません。

Grid[PadRight@Characters@StringSplit@s^T]/. 0->" "

Mathematica graphics

^T(転置)は1文字のみです(適切な文字コードが見つかりません)


1

Javascript、141

a=prompt().split(' '),c=0,d=a.map(function(a){b=a.length;c=c<b?b:c});for(j=0;j<c;j++){b='';for(i in a)b+=a[i][j]?a[i][j]:' ';console.log(b);}

サンプル

hello, world! this is code golf

hwticg
eohsoo
lri dl
lls ef
od    
,! 

1

GolfScript [41バイト]

' '%:x{.,x{,}%$-1=-abs' '*+}%zip{' '*}%n*

使い方:

' '%:x          split text into words and store array in 'x'
{               for each word in the array:
    .,              from word's length
    x{,}%$-1=-      substract the length of the longest word in 'x'
    abs             get absolute value (maybe there is a shorter way?)
    ' '*+           add corresponding number of spaces
}%
zip{' '*}%      transpose array of words and add spaces between letters
n*              join words with a new line character

ここでオンラインデモを見ることができます

PS:これは初めてのGolfScriptコードなので、厳密に判断しないでください;)



1

Bash + coreutils、54

eval paste `printf " <(fold -w1<<<%s)" $@`|expand -t2

出力:

$ ./transpose.shこんにちは、World!私の名前はフーです。
HWM ni F
えおやそ
lrmo
lle。
od       
、!       
$ 

更新の提案:コマンド置換のバックティックは減価償却されます。構成体を使用する$()ことは、コマンド置換の一般的な方法です。
妖怪

@Yokai-これはコードゴルフです-ここでは、標準/ベストプラクティスへの準拠ではなく、コード長を最適化しています。 codegolf.stackexchange.com/a/25572/11259
デジタル外傷

コマンド置換の基準が変更されたので、更新を提案します。する必要はありません。これは単なる提案でした。とにかく、カウントに単一の新しいキャラクターを追加するだけです。
妖怪

1

APL:18

⍉↑1↓¨a⊂⍨' '=a←' ',

説明:

a← ''、文字列の前にスペースを入れて、

'' =スペースを検索、ブール値を生成

1↓¨a⊂⍨は、ブール値が1から始まる部分文字列を作成し、それぞれの最初の要素をドロップします(つまり、スペース)

⍉↑結果の部分文字列から行列を作成し、対角線に沿って逆行列にします




0

Pythonの2.7 - 119 106

テイク1-166。リストを逆にすることは、ポップを目的の順序で動作させるために必要でしたが、これは無駄に思えました。そして、楽しみのために単一の理解に結合しようとしたとき、ポップは物事を台無しにしました。

w=raw_input().split(' ');l=max([len(l) for l in w]);
q=[list(p)[::-1]for p in w]+[['\n']*l]
t=[' '+(v.pop() if v else' ')for i in range(l)for v in q]
print ''.join(t)

2-119を取ります。したがって、単純なリストインデックスに変更しました。しかし、特にスペースと改行のパディングに関しては、まだ不格好なようです。

w=raw_input().split(' ');l=max([len(l)for l in w]);print''.join([' '+(v+' '*l)[i]for i in range(l)for v in w+['\n'*l]])

テイク3-@grcに感謝

w=raw_input().split();l=max(map(len,w));print''.join(' '+(v+' '*l)[i]for i in range(l)for v in w+['\n'*l])

2
[len(l)for l in w]短縮することができmap(len,w).split(' ').split()、と.join([...])します.join(...)
GRC

私はこれかもしれないではない仕事ので、あまり詳細にあなたのコードの上に行っていないが、「リストの反転ポップ仕事をするために必要だった、私が望んでいたために、」あなたは使用できませんでしたv.pop(0)最初の要素をポップする代わりに、最後の一つ?
地下

0

Python 3, 124

a=input().split()
l=max(map(len,a))
print("\n".join(" ".join(c[i] for c in [i+" "*(l-len(i)) for i in a]) for i in range(l)))

0

Haskell, 112

Golfed:

import Data.List
r s=unlines$transpose$p$words s
p w=m(\s->s++replicate(maximum(m l w)-l s)' ')w
m=map
l=length

Explained:

import Data.List

-- Break on spaces, then pad, then transpose, then join with newlines
r s=unlines$transpose$p$words s

-- Pads each String in a list of String to have the same length as the longest String
p w=m(\s->s++replicate(maximum(m l w)-l s)' ')w

-- Aliases to save space
m=map
l=length

Example:

*Main Data.List> putStrLn $ r "Hello Doge"
HD
eo
lg
le
o

0

JavaScript, 139 (156 with console.log output)

s=" ",b="",a=prompt().split(s),l=0;for(var i in a){m=a[i].length;l=(l<m)?m:l;}for(i=0;i<l;i++){for(var j in a)b+=((x=a[j][i])?x:s)+s;b+="\n"}console.log(b);

I think this is as golfed as I can get it. I just split, find the largest word and transpose accordingly, adding spaces if the char doesn't exist in the shorter words. More than the previous submitted JavaScript answer, but that answer doesn't seem to work?


0

Japt -R, 5 bytes

¸y¬m¸

Try it


Explanation

¸         :Split on spaces
 y        :Transpose
  ¬       :Split columns
   m      :Map rows
    ¸     :  Join with spaces
          :Implicitly join with newlines and output

0

Pyth, 8 bytes

jbjL\ Cc

Try it online!

Pretty straightforward. Takes input enclosed in quotes, i.e. "Hello World"

jbjL\ CcQ
---------
       cQ    Chop the input Q on spaces
      C      Matrix transpose
  jL\        Join each element by spaces,
             i.e. interleave spaces between the characters of each element
jb           Join by newlines

1
C truncates to the length of the shortest entry, so this doesn't work. Here's a quick fix which is also 8 bytes.
hakr14

0

APL(NARS), 79 chars, 158 bytes

{m←⌈/↑∘⍴¨z←(' '≠⍵)⊂,⍵⋄v←∊m{⍵\⍨∊(k⍴1)(0⍴⍨⍺-k←↑⍴⍵)}¨z⋄((2×↑⍴z)⍴1 0)\[2]⍉(↑⍴z)m⍴v}

test:

  f←{m←⌈/↑∘⍴¨z←(' '≠⍵)⊂,⍵⋄v←∊m{⍵\⍨∊(k⍴1)(0⍴⍨⍺-k←↑⍴⍵)}¨z⋄((2×↑⍴z)⍴1 0)\[2]⍉(↑⍴z)m⍴v}
  f 'Hello, World! My name is Foo.'
H W M n i F 
e o y a s o 
l r   m   o 
l l   e   . 
o d         
, !         

The old function have output not perfect:

  {⍪¨(' '≠⍵)⊂,⍵}'Hello, World! My name is Foo.'
 H  W  M  n  i  F 
 e  o  y  a  s  o 
 l  r     m     o 
 l  l     e     . 
 o  d             
 ,  !
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.