J, 54 bytes
[:|:|.@i.@#(>@],~' '#~[)"_1[:(,' '&,)/&.>>:@i.@#<@#"0]
Try it online! (note that the output on TIO has a newline and three spaces, but that isn't from the function call -- it's probably just what the J interpreter does automatically).
I think the general idea for solving this is right, but there are small things that I'm probably doing sub-optimally that are adding to the bytecount.
Previous variants
55 bytes
<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1>:@i.@#(,' '&,)/@#"0]
56 bytes
<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1#{.[:(,' '&,)//.[:]\.]
Explanation
This will be split into a few functions. Also, I wasn't as thorough with latter parts of the explanation, so let me know if you want a better explanation for a certain part and I can edit that in.
dup =. >:@i.@# <@#"0 ]
space =. (,' '&,)/&.>
pad =. |.@i.@# (>@],~' '#~[)"_1 ]
trans =. |:
dup
duplicates each character as many times as its index (plus one) in the string
space
inserts spaces between each character
pad
pads the characters with the right amount of spaces
trans
transposes the resulting matrix
Sample call:
trans pad space dup 'abc'
c
b
a c
b
c
Dup
>:@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
The results are boxed to prevent J from padding the ends with spaces (since they're of uneven length).
Sample call:
dup 'abc'
┌─┬──┬───┐
│a│bb│ccc│
└─┴──┴───┘
Space
(,' '&,)/&.>
&.> For each boxed element
(,' '&,)/ Insert spaces between each
Sample call:
space dup 'abc'
┌─┬───┬─────┐
│a│b b│c c c│
└─┴───┴─────┘
Pad
|.@i.@# (>@],~' '#~[)"_1 ]
(>@],~' '#~[) Pad the right arg with spaces given by the left arg
|.@i.@# Indices in reverse order
i. # Range [0,length)
|. Reverse
Basically, pad the first element with length - 1 spaces, the second with length - 2, etc. It also removes the boxing.
Sample call:
pad space dup 'abc'
a
b b
c c c
Transpose
This is just the built-in function |:
which takes the transpose of a matrix.
H l o W r d
is a valid center row? Asking because in your example each row has 3 spaces between each character. \$\endgroup\$