J, 54 bytes
[:|:|.@i.@#(>@],~' '#~[)"_1[:(,' '&,)/&.>>:@i.@#<@#"0]
Experimente online! (observe que a saída no TIO tem uma nova linha e três espaços, mas isso não é da chamada de função - provavelmente é exatamente o que o intérprete J faz automaticamente).
Acho que a idéia geral para resolver isso é correta, mas há pequenas coisas que provavelmente estou fazendo de maneira subótima que estão adicionando ao número de bytes.
Variantes anteriores
55 bytes
<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1>:@i.@#(,' '&,)/@#"0]
56 bytes
<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1#{.[:(,' '&,)//.[:]\.]
Explicação
Isso será dividido em algumas funções. Além disso, não fui tão meticuloso com as últimas partes da explicação, então deixe-me saber se você deseja uma explicação melhor para uma determinada parte e posso editá-la.
dup =. >:@i.@# <@#"0 ]
space =. (,' '&,)/&.>
pad =. |.@i.@# (>@],~' '#~[)"_1 ]
trans =. |:
dup
duplica cada caractere tantas vezes quanto seu índice (mais um) na string
space
insere espaços entre cada caractere
pad
preenche os caracteres com a quantidade certa de espaços
trans
transpõe a matriz resultante
Exemplo de chamada:
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
Os resultados estão em caixas para impedir que J preencha as extremidades com espaços (já que são de comprimento desigual).
Exemplo de chamada:
dup 'abc'
┌─┬──┬───┐
│a│bb│ccc│
└─┴──┴───┘
Espaço
(,' '&,)/&.>
&.> For each boxed element
(,' '&,)/ Insert spaces between each
Exemplo de chamada:
space dup 'abc'
┌─┬───┬─────┐
│a│b b│c c c│
└─┴───┴─────┘
Almofada
|.@i.@# (>@],~' '#~[)"_1 ]
(>@],~' '#~[) Pad the right arg with spaces given by the left arg
|.@i.@# Indices in reverse order
i. # Range [0,length)
|. Reverse
Basicamente, preencha o primeiro elemento com comprimento - 1 espaços, o segundo com comprimento - 2, etc. Ele também remove o boxe.
Exemplo de chamada:
pad space dup 'abc'
a
b b
c c c
Transpor
Esta é apenas a função |:
interna que aceita a transposição de uma matriz.