J, 54 bytes
[:|:|.@i.@#(>@],~' '#~[)"_1[:(,' '&,)/&.>>:@i.@#<@#"0]
Pruébalo en línea!(tenga en cuenta que la salida en TIO tiene una nueva línea y tres espacios, pero eso no proviene de la llamada a la función; probablemente sea lo que el intérprete J hace automáticamente).
Creo que la idea general para resolver esto es correcta, pero hay cosas pequeñas que probablemente estoy haciendo de manera subóptima que se están agregando al conteo de bytes.
Variantes anteriores
55 bytes
<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1>:@i.@#(,' '&,)/@#"0]
56 bytes
<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1#{.[:(,' '&,)//.[:]\.]
Explicación
Esto se dividirá en algunas funciones. Además, no fui tan minucioso con las últimas partes de la explicación, así que avíseme si desea una mejor explicación para cierta parte y puedo editarla.
dup =. >:@i.@# <@#"0 ]
space =. (,' '&,)/&.>
pad =. |.@i.@# (>@],~' '#~[)"_1 ]
trans =. |:
dup
duplica cada carácter tantas veces como su índice (más uno) en la cadena
space
inserta espacios entre cada personaje
pad
rellena los caracteres con la cantidad correcta de espacios
trans
transpone la matriz resultante
Llamada de muestra:
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
Los resultados están encuadrados para evitar que J rellene los extremos con espacios (ya que son de longitud desigual).
Llamada de muestra:
dup 'abc'
┌─┬──┬───┐
│a│bb│ccc│
└─┴──┴───┘
Espacio
(,' '&,)/&.>
&.> For each boxed element
(,' '&,)/ Insert spaces between each
Llamada de muestra:
space dup 'abc'
┌─┬───┬─────┐
│a│b b│c c c│
└─┴───┴─────┘
Almohadilla
|.@i.@# (>@],~' '#~[)"_1 ]
(>@],~' '#~[) Pad the right arg with spaces given by the left arg
|.@i.@# Indices in reverse order
i. # Range [0,length)
|. Reverse
Básicamente, rellene el primer elemento con longitud - 1 espacios, el segundo con longitud - 2, etc. También elimina el boxeo.
Llamada de muestra:
pad space dup 'abc'
a
b b
c c c
Transponer
Esta es solo la función incorporada |:
que toma la transposición de una matriz.