J, 54 bajty
[:|:|.@i.@#(>@],~' '#~[)"_1[:(,' '&,)/&.>>:@i.@#<@#"0]
Wypróbuj online!(zwróć uwagę, że wyjście w TIO ma nowy wiersz i trzy spacje, ale to nie pochodzi z wywołania funkcji - prawdopodobnie jest to dokładnie to, co interpreter J robi automatycznie).
Myślę, że ogólny pomysł na rozwiązanie tego problemu jest słuszny, ale są pewne rzeczy, które prawdopodobnie robię nieoptymalnie, które zwiększają liczbę bajtów.
Poprzednie warianty
55 bajtów
<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1>:@i.@#(,' '&,)/@#"0]
56 bajtów
<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1#{.[:(,' '&,)//.[:]\.]
Wyjaśnienie
Zostanie to podzielone na kilka funkcji. Ponadto nie byłem tak dokładny w ostatnich częściach wyjaśnienia, więc daj mi znać, jeśli chcesz lepszego wyjaśnienia dla określonej części, a ja mogę to edytować.
dup =. >:@i.@# <@#"0 ]
space =. (,' '&,)/&.>
pad =. |.@i.@# (>@],~' '#~[)"_1 ]
trans =. |:
dup
duplikuje każdy znak tyle razy, ile jego indeks (plus jeden) w ciągu
space
wstawia spacje między każdym znakiem
pad
wypełnia znaki odpowiednią ilością spacji
trans
transponuje uzyskaną macierz
Przykładowe połączenie:
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
Wyniki są umieszczane w ramkach, aby zapobiec dopełnianiu przez J spacji na końcach (ponieważ mają one nierówną długość).
Przykładowe połączenie:
dup 'abc'
┌─┬──┬───┐
│a│bb│ccc│
└─┴──┴───┘
Przestrzeń
(,' '&,)/&.>
&.> For each boxed element
(,' '&,)/ Insert spaces between each
Przykładowe połączenie:
space dup 'abc'
┌─┬───┬─────┐
│a│b b│c c c│
└─┴───┴─────┘
Podkładka
|.@i.@# (>@],~' '#~[)"_1 ]
(>@],~' '#~[) Pad the right arg with spaces given by the left arg
|.@i.@# Indices in reverse order
i. # Range [0,length)
|. Reverse
Zasadniczo wypełnij pierwszy element długością - 1 spacje, drugi długością - 2 itd. Usuwa również boks.
Przykładowe połączenie:
pad space dup 'abc'
a
b b
c c c
Transponować
To tylko wbudowana funkcja, |:
która przejmuje transpozycję macierzy.