Robienie kwadratowych słów

38

Wyzwanie

Twoim zadaniem jest stworzenie programu, który pobiera dane wejściowe z ciągu i generuje dane wyjściowe w formacie kwadratu. Puste ciągi powinny zwracać pusty ciąg.

Przykłady

Biorąc pod uwagę wkład:

golf

Twój program powinien wypisać:

golf
o  l
l  o
flog

Wkład:

123

Wydajność:

123
2 2
321

Wkład:

a

Wydajność:

a

Wkład:

Hello, world!

Dane wyjściowe (zwróć uwagę na odstęp między i w - przerwa nie jest tylko nową linią):

Hello, world!
e           d
l           l
l           r
o           o
,           w

w           ,
o           o
r           l
l           l
d           e
!dlrow ,olleH

Punktacja

To jest , więc wygrywa najkrótsza odpowiedź w każdym języku.

SpookyGengar
źródło
@DJMcMayhem Tak, przepraszam, że zapomniałem to dodać.
SpookyGengar
2
Bez obaw, tylko podwójne sprawdzenie. Ładne pierwsze wyzwanie BTW! Witamy na stronie :)
DJMcMayhem
@SpookyGengar Czy dodałbyś przypadek testowy dla wprowadzenia jednej litery?
musicman523,
@ musicman523, czy już go nie mam? Trzeci przykład z samą literą „a”.
SpookyGengar
1
@SpookyGengar my bad, najwyraźniej jestem ślepy
musicman523

Odpowiedzi:

17

Węgiel , 7 5 bajtów

θ‖O↙↘

Wypróbuj online! Link jest do pełnej wersji kodu. Edycja: Zapisano 2 bajty dzięki @CarlosAlejo. Wyjaśnienie:

θ       Print the input string, making the top row
 ‖O     Reflect with overlap...
   ↙    ... down and left, to create the left side
    ↘   ... down and right, to create the bottom and right sides

(Wiele wskazówek do polecenia Odbicie jest uruchamianych kolejno, a nie jednocześnie).

Neil
źródło
Wow, Jezu, nadal uważam, że Węgiel drzewny był najfajniejszym pomysłem na esolang.
Magic Octopus Urn
1
Można zapisać dwa bajty, jeśli po prostu wydrukować ciąg wejściowy i odzwierciedlają to downleftwards i downrightwards: θ‖B↙↘. Wypróbuj online!
Charlie,
Teraz, gdy o tym myślę, może powinienem był użyć ReflectOverlapzamiast ReflectButterflyunikać odwracania postaci. :-)
Charlie
1
Jest to jeden z nielicznych przypadków, w których odpowiedź golfa w ezoterycznym języku jest łatwiejsza do odczytania i zrozumienia niż pełne nieogolone wersje popularnych języków ogólnego przeznaczenia.
Caleb
Twoja odpowiedź tutaj działa również dla 4 bajtów.
Oliver
10

MATL , 20 16 11 bajtów

otYTO6Lt&(c

Wypróbuj w MATL online!

EDYCJA: Kod działa w wersji 20.2.1, która poprzedza wyzwanie. Link używa tej wersji. (W 20.2.2 kod byłby krótszy, ale byłby późniejszy od wyzwania).

Wyjaśnienie

o     % Implicitly input a string. Convert chars to ASCII codes
t     % Duplicate
YT    % 2-input Toeplitz matrix
O     % Push 0
6L    % Push predefined literal [2, -1+1j]. When used as an index, this is
      % interpreted as 2:end-1 (indexing is 1-based)
t     % Duplicate
&(    % 4-input assignment indexing. This writes 0 at the square formed by
      % rows 2:end-1 and columns 2:end-1 
c     % Convert to char. Char 0 is shown as space. Implicitly display
Luis Mendo
źródło
Bardzo imponujące! :) Czy można usunąć pustą linię na dole każdego wyjścia, czy jest to potrzebne do funkcjonalności?
SpookyGengar
2
@SpookyGengar Jest to bardzo częste żądanie, aby zezwolić na jeden znak nowej linii.
Jonathan Allan
@SpookyGengar Thanks! MATL zawsze wyświetla końcowy znak nowej linii. Jak mówi Jonathan, jest to zwykle dozwolone
Luis Mendo,
1
@LuisMendo Codziennie uczysz się czegoś nowego. :) Dzięki za zgłoszenie - zdecydowanie najlepsze jak dotąd!
SpookyGengar
6

Galaretka ,  29 22  17 bajtów

Węgiel będzie sprać + D to wynik ...

J⁶ẋa0,1¦"ṚṚ;$ṖŒḌY

Monadyczny link pobierający i zwracający listy znaków; lub pełny program drukujący wynik.

Wypróbuj online!

W jaki sposób?

J⁶ẋa0,1¦"ṚṚ;$ṖŒḌY - Link: list of characters, w     e.g. "whole"
 ⁶                - literal space character              ' '
J                 - range(length(w))                     [1,2,3,4,5]
  ẋ               - repeat                               [" ","  ","   ","    ","     "]
         Ṛ        - reverse w                            "elohw"
        "         - zip with:
       ¦          -   sparse application of:
   a              -     and (vectorises)
    0,1           -     to indexes: [0,1] (last and 1st) ["e","ll","o o","h  h","w   w"]
            $     - last two links as a monad:
          Ṛ       -   reverse                            ["w   w","h  h","o o","ll","e"]
           ;      -   concatenate                        ["w   w","h  h","o o","ll","e","e","ll","o o","h  h","w   w"]
             Ṗ    - pop (remove last entry)              ["w   w","h  h","o o","ll","e","e","ll","o o","h  h"]
              ŒḌ  - reconstruct matrix from diagonals    ["whole","h   l","o   o","l   h","elohw"]
                Y - join with newlines                   "whole\nh   l\no   o\nl   h\nelohw"
                  - if running as a full program implicit print
Jonathan Allan
źródło
Bardzo fajny! Jak dotąd najkrótsze rozwiązanie, ale nie działa z wejściami jednoznakowymi i ciągami znaków składającymi się z liczb, np. „123”.
SpookyGengar
Ach, będę musiał poradzić sobie z przypadkiem pojedynczego znaku, tak. Działa z ciągami znaków cyfrowych, dane wejściowe programu powinny być naprawdę cytowane, np. 'Hello'„Spooky's” "123", itp. (Python służy do interpretacji danych wejściowych).
Jonathan Allan
@SpookyGengar - naprawiono to dla przypadku 1-znakowego.
Jonathan Allan
Niezła redukcja długości!
Luis Mendo,
2
Masz rację co do węgla drzewnego.
Neil
3

C, 109 bajtów

i,j;f(char*s){for(i=j=printf("%s\n",s)-2;1[++s];)printf("%c%*c\n",*s,i,s[j-=2]);for(;*s*~i--;)putchar(*s--);}

Wypróbuj online!

Godne uwagi sztuczki:

  • Zamiast marnować bajty strlen, po prostu chwytamy długość łańcucha, jednocześnie drukując pierwszą linię:

    i=j=printf("%s\n",s)-2

    Działa to, ponieważ printfzwraca liczbę zapisanych bajtów.

  • W środkowych liniach musimy zapętlić łańcuch, ale wykluczamy zarówno pierwszy, jak i ostatni znak. Osiąga się to z warunkiem

    1[++s]

    (który jest krótszy niż (++s)[1]), który pomija pierwszy znak z powodu ++jego bycia w stanie i pomija ostatni znak, zatrzymując się, gdy znak minie obecny znak '\0'(zamiast zatrzymywać się na '\0' ).

  • W ciele pierwszej pętli

    printf("%c%*c\n",*s,i,s[j-=2])

    wypisujemy bieżący znak, a następnie odpowiedni znak „dublowany” (śledząc z j, który przechodzi w negatywy, co powoduje dziwną sytuację indeksowania w łańcuch z liczbą ujemną) dopełniany do długości ispacjami (gdzie ijest dogodnie strlen(s) - 1).

  • Odwrócony druk w ostatnim wierszu jest dość prosty; jedyną sztuczką jest to *s*~i--, że jest to najkrótszy sposób na uzyskanie i+2iteracji ciała pętli (od którego nie zależy i; wszystko, co ijest używane, to liczyć). Funky *s*część zapewnia, że ​​pętla nie uruchomi się, jeśli *sjest '\0', co dzieje się na wejściu o długości 1.

Klamka
źródło
3

Oktawa, 40 bajtów

@(s,t=toeplitz(s),u=t(x=2:end-1,x)=32)t;

Wypróbuj online!

To moja odpowiedź, ale opublikowana po odpowiedzi na @Luis MATL

rahnema1
źródło
2
Bardzo miła odpowiedź. Btw: twój kod zawiesił gałąź programistyczną GNU Octave 4.3.1 (b481a9baeb61) i jest teraz częścią zestawu testowego :-) hg.savannah.gnu.org/hgweb/octave/rev/c94e9509461b
Andy
1
@ Dziękuję i witamy w codegolf! Cieszę się, że może pomóc w ulepszeniu projektu Octave!
rahnema1
3

Haskell , 84 78 bajtów

f s@(_:x)|_:y<-r x=s:[a:(y>>" ")++[b]|(a,b)<-zip x y]++[r s];f s=[s]
r=reverse

Wypróbuj online! Zastosowanie: f "test". Zwraca listę linii.

Edycja: -6 bajtów dzięki Dianne!

Laikoni
źródło
1
możesz zaoszczędzić kilka bajtów, używając osłony wzorca jako osłony i definiując synonim reverse; r=reverse;f s@(_:x)|_:y<-r x=s:[a:(y>>" ")++[b]|(a,b)<-zip x y]++[r s];f s=[s]ma 78 bajtów.
dianne
2

Python 2 , 89 81 88 86 bajtów

i=input();n=k=len(i)-2
print i
exec'print i[~k]+" "*n+i[k];k-=1;'*n
if~k:print i[::-1]

Wypróbuj online!

Koishore Roy
źródło
Ta sama awaria dla łańcuchów o długości 1, którą miała moja.
Stephen
@StepHen naprawił to i grał w dalszą
grę
2

R , 113 bajtów

function(s){n=length(s<-strsplit(s,'')[[1]])
m=matrix(' ',n,n)
m[n,n:1]=m[,1]=m[1,]=m[n:1,n]=s
write(m,'',n,,'')}

Wypróbuj online!

Giuseppe
źródło
Moja odpowiedź na wyzwanie dupe jest krótsza - co za różnica może zrobić rok!
Giuseppe,
2

05AB1E , 17 16 15 19 bajtów

ÂDÂø¦¨Dgú€Ás)˜»Igi¨

Wypróbuj online!

Wyjaśnienie

Przykład z input = golf

ÂDÂ                  # bifurcate, duplicate, bifurcate
                     # STACK: 'golf', 'flog', 'flog', 'golf'
   ø                 # zip the top 2 items
                     # STACK: 'golf', 'flog', ['fg', 'lo', 'ol', 'gf']
    ¦¨               # remove the first and last element
                     # STACK: 'golf', 'flog', ['lo', 'ol']
      Dg             # get the length of the list
                     # STACK: 'golf', 'flog', ['lo', 'ol'], 2
        ú            # prepend that many spaces to each element
                     # STACK: 'golf', 'flog', ['  lo', '  ol']
         €Á          # rotate each right
                     # STACK: 'golf', 'flog', ['o  l', 'l  o']
           s         # swap the top 2 items
                     # STACK: 'golf', ['o  l', 'l  o'], 'flog'
            )˜       # wrap in a flattened list
                     # STACK: ['golf', 'o  l', 'l  o', 'flog']
              »      # join on newline
               Igi¨  # if input is length 1, remove last char

Poprawka dla wprowadzania 1-literowego była dość droga.
Czuję, że inne podejście może być teraz lepsze.

Emigna
źródło
1

Python 2 , 99 88 bajtów

-4 bajty dzięki musicman523.

lambda s:s[1:]and[s]+[s[i]+' '*(len(s)-2)+s[~i]for i in range(1,len(s)-1)]+[s[::-1]]or s

Wypróbuj online!

Zwraca listę ciągów.

całkowicie ludzki
źródło
Blisko! Wynik nie jest dokładnie tym, o co proszę.
SpookyGengar
1
89 bajtów przesuwając si s[::-1]dojoin
musicman523
To nie do końca działa na łańcuchy o długości 1
musicman523,
2
Uwaga: wszystkie problemy zostały naprawione.
całkowicie ludzki,
1

Mathematica, 128 bajtów

(c=Column;g=Length[x=Characters@#]-1;If[g==0,#,c@{#,c@Table[""<>{x[[i]],""<>Table[" ",g-1],x[[-i]]},{i,2,g}],StringReverse@#}])&
J42161217
źródło
1

C, 96 bajtów

i,l;f(char*s){for(i=l=puts(s)-2;--i;)printf("%c%*c\n",s[l-i],l,s[i]);for(;l+1;)putchar(s[l--]);}

Wersja premiowa (122 bajty):

x,y,i,l;f(char*s){for(i=l=puts(s)-1;++i<l*-~l;putchar(x==l?10:x%~-l*(y%~-l)?32:s[(x*y?l+l-2-x-y:x+y)%l]))x=i%-~l,y=i/-~l;}
orlp
źródło
1

Swift 3 , 215 199 bajtów

let s=readLine()!,c=s.characters,r:[Character]=c.reversed(),b=c.count
print(s)
if b>1{for i in 0..<b-2{print("\(r.reversed()[i+1])\(String.init(repeating:" ",count:b-2))\(r[i+1])")};print(String(r))}

Wypróbuj online

Mic1780
źródło
1

Python 3, 88 bajtów

w=input();p=print;l=len(w)-2
[p(w[n+1]+' '*l+w[l-n])for n in range(l)]
l+1and p(w[::-1])
Levi
źródło
1
Witamy w PPCG!
Martin Ender
Witamy również na stronie! Wierzę, że l+1 andmożna to przepisać, l+1andaby zaoszczędzić bajt.
Wheat Wizard
Edytowano @WheatWizard - dzięki! Byłem zaskoczony, że zadziałało ...
Levi
Będzie działał, z wyjątkiem przypadku 0or, w którym Python nie analizuje, ponieważ 0ojest to ósemkowy przedrostek.
Wheat Wizard
Gdy uruchomię to, że nie wydaje się, aby wydrukować górną linię ... tio.run/##FcoxCsQgEAXQPqeYLk7EwqRL8CRiEVh3Iww/...
Coty Johnathan Saxman
1

JavaScript (ES8), 108 112 bajtów

let f = 

s=>(n=s.length)<2?s:(r=[...s].reverse()).slice(1,-1).reduce((a,v,i)=>a+`
`+s[i+1].padEnd(n-1)+v,s)+`
`+r.join``

o.innerHTML = f("hello folks!")
<pre id="o"></pre>

Mniej golphed

s=>
   (n=s.length) < 2 ?    // record and check length
   s :                   // s has 0 or 1 char, else
   (r=[...s].reverse())  // reverse characters,
   .slice(1,-1)          // exclude 1st and last
   .reduce((a,v,i)=>     // append inner lines
      a +'\n' +s[i+1].padEnd(n-1) + v
    ,s)                  // to first line
    + '\n' +r.join("")   // append characters reversed

Podziękowania dla Justina Marinera za zaoszczędzenie dużej ilości bajtów, które następnie przyzwyczaiły się do dodawania kontroli zerowej lub pojedynczej postaci potrzebnej do wykonania wyzwania. Łapiesz to :-(

traktor53
źródło
Możesz zapisać 7 bajtów, tworząc drugą linię `+s[i+1].padEnd(s.length-1)+v,s)+`i używając r.join``.
Justin Mariner
Dzięki @JustinMariner za wskazówki na temat String.prototype.padStarti otagowano literały szablonów. Potrzebowałem tego, aby ograniczyć dodawanie kontroli długości do minimum :-)
traktor53
Twoje odstępy są teraz o jedną postać za krótkie; możesz to naprawić i zaoszczędzić jeszcze kilka, robiąc (n=s.length-1)?(r=<...>+r.join``:si używając padEnd(n). Jeśli długość wynosi 1, length-1wynosi 0(fałsz).
Justin Mariner
@JustinMariner jest ustalony, ale utrzymałem test długości - jak rozumiem, zarówno łańcuchy o zerowej długości, jak i łańcuchy jednego znaku zwracają się bez powrotu karetki lub powtórzenia łańcucha.
traktor53
1
padEndjest ES2017.
Neil
1

PHP , 118 bajtów

echo $s=$argv[1];$l=strlen($r=strrev($s))-1;for($i=$l-1;$l&&$i;)echo "\n".str_pad($r[$i],$l).$s[$i].(--$i?"":"\n$r");

Wypróbuj online!

echo $s = $argv[1];
$l = strlen($r = strrev($s)) - 1;

for ($i = $l - 1; $l && $i;)
    echo "\n" . str_pad($r[$i], $l) . $s[$i] . (--$i ? "" : "\n$r");
marcv
źródło
1

APL , 58 bajtów

{(' ',⍵)[x+(x←∘.{((c-1)=⍺⌈⍵)∨0=⍺⌊⍵}⍨r)×o⌊⌽⊖o←∘.⌈⍨r←⍳c←≢⍵]}

Z ⎕IO←0.

Wypróbuj online!

W jaki sposób?

c←≢⍵ - długość sznurka

r←⍳ - zasięg

o←∘.⌈⍨ - produkt zewnętrzny z minimum

123
223
333

o⌊⌽⊖- zminimalizować z samym sobą obróconym o 180 o

123  ⌊  333  =  123
223  ⌊  322  =  222
333  ⌊  321  =  321

× - pomnóż przez

x←∘....⍨r - produkt zewnętrzny z zakresu

    ((c-1)=⍺⌈⍵)∨0=⍺⌊⍵ - rama matrycy

111  ×  123  =  123
101  ×  222  =  202
111  ×  321  =  321

x+ - dodaj ramkę

111  +  123  =  234
101  +  202  =  303
111  +  321  =  432

(' ',⍵)[...] - pobierz według indeksu z łańcucha połączonego w spację

Uriel
źródło
Może ⍉⊖⍉⊖być ⌽⊖?
Zacharý
@ Zacharý dzięki
Uriel
0

JavaScript (ES2017), 87 bajtów

s=>[...s].reverse(l=s.length-1).map((c,i,z)=>i?l-i?s[i].padEnd(l)+c:z.join``:s).join`
`

Wersja ES6: 93 bajty

s=>[...s].reverse(l=s.length-1).map((c,i,z)=>i?l-i?s[i]+' '.repeat(l-1)+c:z.join``:s).join`
`

Mniej golfa

s => (
  l = s.length-1,
  [...s].reverse().map( // scan string backwards
     (c, i, z) => 
     i != 0 // check if top row
     ? l-i != 0 // check if bottom row
       ? s[i].padEnd(l) + c // any middle row
       : z.join`` // bottom row: string reversed
     :s // top row: original string
  ).join`\n`
)

F=
s=>[...s].reverse(l=s.length-1).map((c,i,z)=>i?l-i?s[i].padEnd(l)+c:z.join``:s).join`
`

function update() {
  O.textContent = F(I.value)
}

update()
<input id=I value='Hello, world!' oninput='update()'>
<pre id=O></pre>

edc65
źródło
padEndjest ES2017.
Neil
@ Nee dziękuję, zmienię nagłówek
edc65
Możesz zapisać bajt w swojej wersji ES6 za pomocą l+~i, unikając konieczności odejmowania 1 dwa razy zamiast tego możesz odjąć 2 raz.
Neil
@Neil powinno byćl-~-i
edc65
Myślałem o tym, s=>[...s].reverse(l=s.length).map((c,i,z)=>i?l+~i?s[i]+' '.repeat(l-2)+c:z.join``:s).join`\n` ale s=>[...s].reverse(l=s.length-2).map((c,i,z)=>i?i+~l?s[i]+' '.repeat(l)+c:z.join``:s).join`\n` też działa.
Neil
0

Java, 191 bajtów

(s)->{PrintStream o=System.out;int l=s.lenght();o.println(s);for(int i=0;i<l;i++){o.printf("%"+"s%"+(l-1)+"s%n",s.charAt(i),s.charAt(l-1-i));for(int i=0;i<l;i++){o.print(s.charAt(l-1-i));}}};
Serverfrog
źródło
(s)może być sprawiedliwy s. Pętle z pojedynczymi liniami wewnątrz mogą mieć usunięte nawiasy klamrowe. Możesz powrócić zamiast drukowania, jeśli pozwoli ci to zaoszczędzić bajty. Używasz int iw obu pętlach, nie wiem, czy mają różne zakresy, ale warto na nie zwrócić uwagę. Inicjalizacja podobnie jak zmienne zwykle oszczędza bajty. for(int i=0;i<l;i++){o.print(s.charAt(l-1-i));}-> for(int i=0;i<l;){o.print(s.charAt(l-1-i++));}. Nie potrzebujesz końcowego średnika.
TheLethalCoder
Dzięki za wskazanie;) (niezbyt zaznajomiony z golfem). Zoptymalizuje to później!
Serverfrog
0

C # (.NET Core) , 179 161 bajtów

-18 bajtów dzięki TheLethalCoder

using System.Linq;
s=>{int l=s.Length-1,i=1;var d=s.Reverse().ToArray();while(i<l)s+="\n"+s[i]+new string(' ',l-1)+d[i++];if(l>1)s+="\n"+new string(d);return s;};

Wypróbuj online!

Nie jestem pewien co do reguł, jeśli jest to potrzebne do liczenia bajtów, czy nie:

using System.Linq;

Ktoś, proszę, popraw mnie w tej sprawie.

Nie golfowany:

s =>
{
    int l = s.Length - 1, i = 1;
    var d = s.Reverse().ToArray();
    while (i < l)
        s += "\n" + s[i] + new string(' ', l - 1) + d[i++];
    if (l > 1)
        s += "\n" + new string(d);
    return s;
};
Grzegorz Puławski
źródło
Witaj w PPCG! Używasz Linq, więc powinieneś uwzględnić usingw swojej liczbie bajtów. Ponieważ używasz Linq ToCharArray()może być po prostu ToArray(), czy naprawdę potrzebujesz go wcześniej Reverse()? Podczas używania Stringmusisz go w pełni zakwalifikować lub włączyć używanie, można to jednak łatwo naprawić, zmieniając go string. ifMoże być krótszy jak potrójny podobnego s+=l>1?if code:"";. Możesz usunąć i++pętlę i zwiększyć ją o d[i++].
TheLethalCoder
Zainicjuj za ipomocą llike int l=s.Length-1,i=1;. I myślę, że to może być to!
TheLethalCoder
@TheLethalCoder dziękuję! Dodałem twoje sugestie do kodu. Kilka uwag: Całkowicie zapomniałem, że łańcuch faktycznie ma IEnumerable; Sznurek zamiast sznurka był resztą Javy, z którą wciąż walczę, trójskładnik był w rzeczywistości równie zaskakująco długo; a po twoich zmianach zmieniłem na (; wyrażenie;) na while (wyrażenie), ponieważ wygląda ładniej i ma taką samą liczbę bajtów. Jeszcze raz dziękuję.
Grzegorz Puławski
Bez obaw! Trójskładniki czasami są, ale zwykle wychodzą krócej, więc zawsze warto je wypróbować.
TheLethalCoder
0

Siatkówka , 106 bajtów

..+
$&¶$&
O$^`.(?=.*$)

\G.
$&$%'¶
r`.\G
¶$%`$&
+`(.+)¶¶((.*¶)*).(.*)
¶¶$1$4$2
T`p` `(?<=.¶.).*(?=.¶.)
G`.

Wypróbuj online! Wyjaśnienie:

..+
$&¶$&

Jeśli są co najmniej dwa znaki, zduplikuj dane wejściowe.

O$^`.(?=.*$)

Odwróć duplikat.

\G.
$&$%'¶
r`.\G
¶$%`$&

Zamień struny w trójkąty. Górny trójkąt zaczyna się od wejścia i za każdym razem usuwa pierwszy znak, a dolny trójkąt zaczyna się od pierwszej litery odwróconego wejścia i za każdym razem dodaje znak.

+`(.+)¶¶((.*¶)*).(.*)
¶¶$1$4$2

Połącz trójkąty, nakładając się na siebie, aby ostatnia postać tworzyła /przekątną.

T`p` `(?<=.¶.).*(?=.¶.)

Zmień wszystkie postacie na spacje, jeśli są przynajmniej jedną postacią od końca z każdej strony.

G`.

Usuń wszelkie pozostałe puste linie.

Neil
źródło
0

Python 3, 85 bajtów

Używanie danych wejściowych dla górnego rzędu :)

a=input()
b=len(a)
for i in range(b-2):print(a[1+i]+" "*(b-2)+a[-2-i])
print(a[::-1])
abc123
źródło
Czy na pewno daje to prawidłową odpowiedź?
Koishore Roy
0

Lua , 104 bajty

print(s);for a=2,#s-1 do print(s:sub(a,a)..(" "):rep(#s-2)..s:sub(#s-a+1,#s-a+1)) end;print(s:reverse())

Wypróbuj online!


źródło
ale używałeś tylko praz ...
Leaky Nun
To prawda ... to zmieni.
0

Python 3, 106 bajtów

Wersja funkcjonalna ...

w=input();p=print;l=len(w)-2
def f(k):p(w[k]+' '*l+w[-k-1]);l-k>0and f(k+1)
l<0 or f(1)or l<1or p(w[::-1])
Levi
źródło
0

Mathematica, 138 91 bajtów

(b=Outer[" "&,#,#];Do[l={{1,k},{k,1}};b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,Length@#}];b)&

Możesz wypróbować online, wklejając następujące elementy w piaskownicy chmurowej Wolfram i klikając „oceniaj komórkę” lub naciskając Shift + Enter lub Numpad Enter:

(b=Outer[" "&,#,#];Do[l={{1,k},{k,1}};b=ReplacePart[b,Join[l,-l]->#[[k]]],{k,Length@#}];b)&@{"g","o","l","f","y"}//MatrixForm
Znaki.
źródło