J、54バイト
[:|:|.@i.@#(>@],~' '#~[)"_1[:(,' '&,)/&.>>:@i.@#<@#"0]
オンラインでお試しください!(TIOの出力には改行と3つのスペースがありますが、これは関数呼び出しからではなく、Jインタープリターが自動的に実行するものであることに注意してください)。
これを解決するための一般的なアイデアは正しいと思いますが、バイトカウントに追加している、おそらく次善の方法で行っている小さなこともあります。
以前の亜種
55バイト
<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1>:@i.@#(,' '&,)/@#"0]
56バイト
<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1#{.[:(,' '&,)//.[:]\.]
説明
これはいくつかの機能に分割されます。また、説明の後半部分については徹底的ではなかったので、特定の部分についてより良い説明が必要な場合はお知らせください。編集することができます。
dup =. >:@i.@# <@#"0 ]
space =. (,' '&,)/&.>
pad =. |.@i.@# (>@],~' '#~[)"_1 ]
trans =. |:
dup
文字列内のインデックス(プラス1)と同じ回数だけ各文字を複製します
space
各文字の間にスペースを挿入します
pad
文字に適切なスペースを埋めます
trans
結果の行列を転置します
サンプル呼び出し:
trans pad space dup 'abc'
c
b
a c
b
c
デュプ
>:@i.@# <@#"0 ]
>:@i.@# Indices of each character plus one
# Length of the string
i. Range [0,length)
>: Add one
<@#"0 ] Duplicate each character as many times as it index (plus one)
"0 For each
# ] Copy the character
>:@i.@# as many times as it index
< Box the result
結果はボックス化されており、Jが両端をスペースで埋めないようにします(長さが不均等であるため)。
サンプル呼び出し:
dup 'abc'
┌─┬──┬───┐
│a│bb│ccc│
└─┴──┴───┘
スペース
(,' '&,)/&.>
&.> For each boxed element
(,' '&,)/ Insert spaces between each
サンプル呼び出し:
space dup 'abc'
┌─┬───┬─────┐
│a│b b│c c c│
└─┴───┴─────┘
パッド
|.@i.@# (>@],~' '#~[)"_1 ]
(>@],~' '#~[) Pad the right arg with spaces given by the left arg
|.@i.@# Indices in reverse order
i. # Range [0,length)
|. Reverse
基本的に、最初の要素に長さ-1スペース、2番目に長さ-2などを追加します。また、ボクシングを削除します。
サンプル呼び出し:
pad space dup 'abc'
a
b b
c c c
転置
これは|:
、行列の転置を行う組み込み関数です。