g | x | w | all
Bytes Lang Time Link
079Zsh211015T055836Zroblogic
085AWK250805T190552Zxrs
033Vyxal 3250730T121356ZThemooni
126Nim250730T075037ZjanAkali
013Vyxal 3250729T180016Zpacman25
021Pip240513T220332ZDLosc
2814Nibbles240524T210133ZDLosc
185Scala 3240518T092438Z138 Aspe
010Jelly220219T204049ZUnrelate
075TIBasic211019T230400ZYouserna
006Canvas200409T022635Zuser9206
176Python 3200409T082339ZDion
089R180817T124325ZRobert H
081PHP181123T235116ZTitus
088R181120T095705ZJ.Doe
005Canvas181120T131831Zdzaima
010Charcoal180817T074336ZKevin Cr
078Powershell180817T093755Zmazzy
013Stax180820T225232Zrecursiv
081JavaScript Node.js180817T060919Zuser5812
026K4180817T225720Zmkst
031K oK180817T224112Zmkst
091QBasic180817T214831ZDLosc
011Jelly170622T181408ZErik the
nan160407T080610Zuser5286
240Prolog141030T170716ZKijewski
nan141030T002737ZRip Leeb
071Befunge93141030T065843ZKasran
097PowerShell141029T225343ZDarkAjax
170C# 192 /141030T152656ZRobIII
030J141029T154221Zjpjacobs
nanNo matter how long141029T144439ZRodolfo
180TSQL141030T005603ZMickyT
nan141029T103207Zedc65
064Ruby141029T150924Zbritisht
nan141029T152014ZCristian
022Pyth141029T200208Zizzyg
025CJam141029T173112ZDennis
094Pure Bash141029T181224ZDigital
090Perl141029T165818Zhmatt1
168Java141029T153639ZGeobits
105C141029T145336ZLevel Ri
149Mathematica141029T112701Zjcai
032CJam141029T085220ZMartin E
208C#141029T111353Zbacchusb
027APL141029T073908Zmarinus
170JavaScript ES6141029T100805ZScimonst
212C#141029T090303ZInvisibl
075Python 3141029T075116Zxnor
088Python 2141029T070731ZFalko

Zsh, 90 82 79 bytes

79 bytes, using left-padding tricks.

n=$#1/2+1;for i ({1..$[n]} {$[n-1]..1})<<<${(l:2*i:)1[i]}${(l:4*n-4*i:)1[-i%n]}

Try it Online!


Previous, 82 bytes, thanks to @pxeger.

for i ({1..$#1})(for z (${(s::)1}){((i==++j||j+i==$#1+1))||z=\ 
printf $z\ }
echo)

Attempt this Online   90 bytes

AWK, 104 85 bytes

{for(;i++<d=NF;print"")for(j=0;j++<d*2;)printf j==2*i?$i:j==2*d-2*(i-1)?$(d-i+1):" "}

Attempt This Online!

{for(;i++<NF;)x[2*i][i]=x[2*i][NF-i+1]=$i
for(;j++<NF;print"")for(k=0;k++<NF*2;)printf(d=x[k][j])?d:" "}

Vyxal 3, 33 bytes

½⍨h?L«$ƛm›«m›N?i?Lm›d-«W„„}æ$↸Wf”

Vyxal It Online!

what a mess.

½⍨h?L«$ƛm›«m›N?i?Lm›d-«W„„}æ$↸Wf”­⁡​‎‎⁡⁠⁡‏⁠‎⁡⁠⁢‏‏​⁡⁠⁡‌⁢​‎‎⁡⁠⁣‏⁠‎⁡⁠⁤‏⁠‎⁡⁠⁢⁡‏⁠‎⁡⁠⁢⁢‏‏​⁡⁠⁡‌⁣​‎‎⁡⁠⁢⁣‏⁠‎⁡⁠⁢⁤‏⁠‎⁡⁠⁢⁣⁣‏‏​⁡⁠⁡‌⁤​‎‎⁡⁠⁣⁡‏⁠‎⁡⁠⁣⁢‏⁠‎⁡⁠⁣⁣‏‏​⁡⁠⁡‌⁢⁡​‎‎⁡⁠⁣⁤‏⁠‎⁡⁠⁤⁡‏⁠‎⁡⁠⁤⁢‏⁠‎⁡⁠⁤⁣‏⁠‎⁡⁠⁤⁤‏‏​⁡⁠⁡‌⁢⁢​‎‎⁡⁠⁢⁡⁡‏⁠‎⁡⁠⁢⁡⁢‏⁠‎⁡⁠⁢⁡⁣‏⁠‎⁡⁠⁢⁡⁤‏⁠‎⁡⁠⁢⁢⁡‏⁠‎⁡⁠⁢⁢⁢‏⁠‎⁡⁠⁢⁢⁣‏‏​⁡⁠⁡‌⁢⁣​‎‎⁡⁠⁢⁢⁤‏⁠‎⁡⁠⁢⁣⁡‏‏​⁡⁠⁡‌⁢⁤​‎‎⁡⁠⁢⁣⁢‏‏​⁡⁠⁡‌⁣⁡​‎‎⁡⁠⁢⁣⁤‏‏​⁡⁠⁡‌⁣⁢​‎‎⁡⁠⁢⁤⁡‏⁠‎⁡⁠⁢⁤⁢‏⁠‎⁡⁠⁢⁤⁤‏‏​⁡⁠⁡‌⁣⁣​‎‎⁡⁠⁢⁤⁣‏⁠‎⁡⁠⁣⁡⁡‏‏​⁡⁠⁡‌­
½⍨                                 # ‎⁡halve input, dump to stack
  h?L«                             # ‎⁢prepend input length spaces to middle letter
      $ƛ                  }        # ‎⁣over the first half, map:
        m›«                        # ‎⁤prepend i+1 spaces to the letter
           m›N?i                   # ‎⁢⁡get letter -(i+1) from the original string
                ?Lm›d-«            # ‎⁢⁢prepend len(input)-2*(i+1) spaces
                       W„          # ‎⁢⁣wrap stack and join it on spaces
                         „         # ‎⁢⁤intersperse spaces
                           æ       # ‎⁣⁡duplicate and reverse the copy of all of that
                            $↸ f   # ‎⁣⁢stack manipulation to get [original copy, middle letter, reversed copy] in that order
                              W ”  # ‎⁣⁣wrap the stack and join on newlines
💎

Created with the help of Luminespire.

<script type="vyxal3">
½⍨h?L«$ƛm›«m›N?i?Lm›d-«W„„}æ$↸Wf”   ¶p
                                   ##^ prepend a newline for display
</script>
<script>
    args=[["CODE-GOLF"],["PROGRAM"]]
</script>
<script src="https://themoonisacheese.github.io/snippeterpreter/snippet.js" type="module"/>

Nim, 126 bytes

proc(s="")=(var l=s.len/%2;for i in-l..l:
var
 a=i.abs
 z="";for i in..l:z&="    "
z[(l-a)*2]=s[l-a]
z[(l+a)*2]=s[l+a]
echo z)

Try it in Wandbox!

Ungolfed

proc print_cross(input = "") =
  var half_len = input.len /% 2       # /% is unsigned division
  for index in -half_len .. half_len:
    var
      offset = index.abs
      line = ""
    for i in ..half_len:              # ..N == 0..N ; deprecated, but works
      line &= "    "                  # fill line with spaces (2x input length)
    line[(half_len - offset) * 2] = input[half_len - offset]
    line[(half_len + offset) * 2] = input[half_len + offset]
    echo line

Vyxal 3, 13 bytes

ƶ≛VŁ»¨fæẄ⑵⅟∨'

Vyxal It Online!

Pip, 21 bytes

FiQPEYHU#^:aP@ZJaXiJs

Try It Online!

Explanation

FiQPEYHU#^:aP@ZJaXiJs­⁡​‎‎⁡⁠⁣⁢‏⁠‎⁡⁠⁣⁣‏⁠‎⁡⁠⁣⁤‏‏​⁡⁠⁡‌⁢​‎‎⁡⁠⁣⁡‏‏​⁡⁠⁡‌⁣​‎‎⁡⁠⁢⁣‏⁠‎⁡⁠⁢⁤‏‏​⁡⁠⁡‌⁤​‎‎⁡⁠⁢⁡‏⁠‎⁡⁠⁢⁢‏‏​⁡⁠⁡‌⁢⁡​‎‎⁡⁠⁣‏⁠‎⁡⁠⁤‏‏​⁡⁠⁡‌⁢⁢​‎‎⁡⁠⁡‏⁠‎⁡⁠⁢‏‏​⁡⁠⁡‌⁢⁣​‎‎⁡⁠⁢⁡⁡‏⁠‎⁡⁠⁢⁡⁢‏⁠‎⁡⁠⁢⁡⁣‏‏​⁡⁠⁡‌⁢⁤​‎‎⁡⁠⁤⁣‏⁠‎⁡⁠⁤⁤‏‏​⁡⁠⁡‌⁣⁡​‎‎⁡⁠⁤⁢‏‏​⁡⁠⁡‌⁣⁢​‎‎⁡⁠⁢⁡⁤‏⁠‎⁡⁠⁢⁢⁡‏‏​⁡⁠⁡‌⁣⁣​‎‎⁡⁠⁤⁡‏‏​⁡⁠⁡‌­
         ^:a           ; ‎⁡Split the input string into a list of characters in-place
        #              ; ‎⁢Get its length
      HU               ; ‎⁣Halve, rounding up
    EY                 ; ‎⁤Identity matrix of that size
  QP                   ; ‎⁢⁡Quad-palindromize to get an X matrix
Fi                     ; ‎⁢⁢For each row i in that matrix:
                aXi    ; ‎⁢⁣  String-repeat each character in a either 0 or 1 times
                       ;   depending on the corresponding value in i
              ZJ       ; ‎⁢⁤  Zip, filling empty spots with spaces, and join each row
                       ;   This creates a list containing a single string
             @         ; ‎⁣⁡  Get the first element (that string)
                   Js  ; ‎⁣⁢  Join it on spaces
            P          ; ‎⁣⁣  Print
💎

Created with the help of Luminespire.


Using the -S flag, we can get this down to 18 bytes:

^ZJ(^a)X_MQPEYHU#a

Try It Online!

This is basically the same thing, but using map instead of a for loop. The -S flag formats the resulting list of lists of characters as multiple lines with the items on each line space-separated.

Nibbles, 28 nibbles (14 bytes)

.;!;,,@\@[.!__,:?==__=@;;@~~

Attempt This Online!

Explanation

This was... an odyssey. Explanation uses named variables instead of de Bruijn indices (mostly).

.                                   # Map over...
 ;                                  # this value:
  !                                 #  Zip
   ; ,,fstLine sets range           #  range(len(input)) (save as a var named range)
   \ @                              #  and the same list reversed
   [                                #  with the min function
 sets bouncedRange                  #  (save as a var named bouncedRange)
                                    # E.g. if len(input) is 5, range is 1 2 3 4 5
                                    # and bouncedRange is 1 2 3 2 1
 \bouncedRowIdx                     # For each bouncedRowIdx in bouncedRange:
 .                                  #  Map over...
  ! range bouncedRange ,            #   Zip range and bouncedRange as list of tuples
  \colIdx bouncedColIdx             #  For each (colIdx, bouncedColIdx) in that list:
  :                                 #   Concat...
   ? == bouncedRowIdx bouncedColIdx #    If bounced row & col indices are equal,
    = colIdx fstLine                #    character of input at index colIdx
    ~                               #    else, default char (space)
  ~                                 #   ... with empty list (wrapping in singleton)

The result is a list of lists of single-character strings. By default, Nibbles prints such a list newline-separated and space-separated, matching the challenge's output format.

Scala 3, 185 bytes

Golfed version. Attempt This Online!

object M{def main(a:Array[String])={val s=scala.io.StdIn.readLine();var l=s.size;var i=l;while(i>0){i-=1;val t=Array.fill(l)(' ');t(i)=s(i);t(l-i-1)=s(l-i-1);println(t.mkString(" "))}}}

Ungolfed version. Attempt This Online!

object Main {
  def main(args: Array[String]): Unit = {
    val s = scala.io.StdIn.readLine()
    val n = s.length
    var i = n

    while (i > 0) {
      i -= 1
      val a = Array.fill(n)(' ')
      a(i) = s(i)
      a(n - i - 1) = s(n - i - 1)
      println(a.mkString(" "))
    }
  }
}

Jelly, 10 bytes

ṪṭaɗƤ⁶»Ṛ$G

Try it online!

Erik's existing answer ties with minor modifications to also use G: LḶ⁶ẋ;"µ»ṚG.

    Ƥ         For each prefix of the input,
Ṫ             remove the last element
 ṭ            and append it back onto
  aɗ ⁶        the remaining elements replaced with spaces.
      »       Take the maximum of each element of that and
       Ṛ$     its reverse.
         G    Grid format: join each row on spaces then join the rows on newlines.

TI-Basic, 75 bytes

Input Str1
length(Str1→L
For(I,1,L
" 
For(J,1,L
If max(J={I,1-I+L:Then
Ans+sub(Str1,J,1)+" 
Else
Ans+"  
End
End
Disp Ans
End

There is 1 space at the end of lines 4 and 7, and there are 2 spaces at the end of line 9. Outputs a leading space at the beginning of each line.


Alternatively, a larger but faster method (100 bytes):

Input Str1
length(Str1→L
" 
For(I,1,L
Ans+"  →Str2
End
For(I,1,L
min(I,1-I+L→K
2(max(L,2)-Ans
Disp sub(Str2+sub(Str1,K,1)+Str2,Ans+4,Ans)+sub(Str1,L-K+1,1
End

There is 1 space at the end of line 3. Outputs two leading spaces if the input has a length of 1.

Canvas, 6 bytes

\:↶n *

Try it here!

Explanation

\       Create a diagonal with the input
 :      Duplicate the diagonal
  ↶     Rotate left
    n   Simple overlap 
      * Insert spaces on every line

Python 3, 176 bytes

w=input();l=len(w);d=l//2;n=' ';x=range(d)
for i in x:print(n*i*2+w[i],n*(l+2-i*4),w[-1*i-1])
print(n*(l-1)+w[d])
for i in x:print(n*(l-i*2-3)+w[-1*(d+i+2)],n*(i*4+1),w[d+i+1])

Try it online!

This is super stupid, any improvements that you notice are welcome

R, 99 98 93 89 bytes

m=ifelse(diag(l<-length(w<-el(strsplit(scan(,''),'')))),w,' ')
write(pmax(m,m[,l:1]),1,l)

Try it online!

Line 1 reads input string, splits it into characters, stores its length and creates a matrix with the word on its main diagonal – letters of the word are superposed on an identity matrix (and repeated by default to match its length) and only those matching 1's are retained, others being replaced by spaces.

Line 2 prints a matrix formed by elements of either the diagonal matrix or its horizontally mirrored version, whichever are greater.

−2 + 1 = −1 byte thanks to JayCe

−4 bytes thanks to Giuseppe

PHP, 81 bytes

for($k=strlen($s=$argn);$k;$t[2*$i]=$s[$i++],$t[2*--$k]=$s[$k],print"$t
")$t=" ";

Run as pipe with -nR or try it online.

R, 88 bytes

n=ncol(m<-diag(u<-utf8ToInt(scan(,""))-32));diag(m[,n:1])=u;write(intToUtf8(m+32,T),1,n)

Try it online!

Canvas, 5 bytes

\\:⇵n

Try it here!

Explanation:

\      create a diagonal of the input
 \     create an even steeper diagonal of that
  :⇵   reverse a copy of it vertically
    n  overlap the two

Charcoal, 9 7 17 10 bytes

↘S⟲OOLθUE¹

+10 bytes because I missed the requirement of space-columns.
-7 bytes thanks to @ASCII-only.

Try it online (verbose) or try it only (pure).

Challenges like this is why Charcoal was made.

Explanation:

Print the input-string in a down-right direction:

Print(:DownRight, InputString());
↘S

Rotate it 90 degree counterclockwise, and shift it up the length of the input-string amount of times with overlap:

RotateOverlapOverlap(Length(q));
⟲OOLθ

Put a space gap of size 1 between every column:

Extend(1);
UE¹

Powershell, 78 bytes

+8 bytes thanks @streetster

param($s)$s|% t*y|%{$r=,' '*$s.length;$r[+$i++]=$_;$r[-$i]=$s[-$i];$r-join' '}

Explaned test script:

$f = {

param($s)               # declare a parameter $s stores a word
$s|% t*y|%{             # split $s into chars https://codegolf.stackexchange.com/a/168174/80745
    $r=,' '*$s.length   # create an array of spaces with length equal length of the word
    $r[$i++]=$_         # set first char
    $r[-$i]=$s[-$i]     # set last char
    $r-join' '          # join the array to string
}

}

&$f PROGRAM
''
&$f sword
''
&$f uhm
''
&$f o
''
&$f codegolf  # It works with word that contains even number of letters

Powershell, 70 bytes (if a word can be represented by an array of chars)

+8 bytes thanks @streetster

($s=$args)|%{$r=,' '*$s.count;$r[+$i++]=$_;$r[-$i]=$s[-$i];$r-join' '}

Test script:

$f = {

($s=$args)|%{$r=,' '*$s.count;$r[+$i++]=$_;$r[-$i]=$s[-$i];$r-join' '}

}

&$f P R O G R A M
''
&$f s w o r d
''
&$f u h m
''
&$f o
''
&$f c o d e g o l f  # It works with word that contains even number of letters

Output for both cases:

P           M
  R       A
    O   R
      G
    O   R
  R       A
P           M

s       d
  w   r
    o
  w   r
s       d

u   m
  h
u   m

o

c             f
  o         l
    d     o
      e g
      e g
    d     o
  o         l
c             f

Stax, 13 bytes

â┤▼iS╙£≥»u5V╓

Run and debug it

Unpacked, ungolfed, and commented, it looks like this.

{       begin block for mapping characters of input
  ]i^)  left-pad each character to length (i+1) where i is the index
m       map using block
r       reverse the array; this produces the southwest-northeast diagonal
m       map using the rest of the program, implicitly output result
  i     iteration index
  xi@   get the i'th character of the original input, where i is the iteration
  &     assign element to array at index
  0\    join with spaces

Run this one

JavaScript (Node.js), 81 bytes

f=s=>[...s].map((_,i,a)=>a.map((c,j)=>j==i|j==s.length+~i?c:' ').join` `).join`
`

EDIT: -1 Thanks Joe King. I didn't see the TIO gives preformatted direct paste for CG.

Try it online!

K4, 26 bytes

Solution:

a||a:(2*#x)$(-1-2*!#x)$$x:

Explanation:

Similar to my oK answer but a little shorter:

a||a:(2*#x)$(-1-2*!#x)$$x: / the solution
                        x: / save input as x
                       $   / string ($) breaks into char lists
                      $    / cast ($)
            (        )     / do this together
                   #x      / count (#) length of x
                  !        / range (!) 0..this count
                2*         / double it
             -1-           / subtract from -1
           $               / pad
     (    )                / do this together
        #x                 / count (#) length of x
      2*                   / multiply by 2
   a:                      / save as a
  |                        / reverse (|) it
a|                         / or (|) with a

K (oK), 31 bytes

Solution:

`c$a||a:(2*#x)$(-1-2*!#x)$,:'x:

Try it online!

Explanation:

Generate the diagonal, and or with the reverse of the diagonal

`c$a||a:(2*#x)$(-1-2*!#x)$,:'x: / the solution
                             x: / save input as x
                          ,:'   / enlist (,:) each-both (')
                         $      / pad (negative is right-pad)
               (        )       / do this together
                      #x        / count (#) length of x
                     !          / range (!) 0..this count
                   2*           / double it
                -1-             / subtract from -1
              $                 / pad
        (    )                  / do this together
           #x                   / count (#) length of x
         2*                     / multiply by 2
      a:                        / save as a
     |                          / reverse (|) it
   a|                           / or (|) with a
`c$                             / cast to characters                           

QBasic, 91 bytes

INPUT w$
l=LEN(w$)
FOR i=1TO l
c$=MID$(w$,i,1)
LOCATE i+1,i*2
?c$
LOCATE l-i+2,i*2
?c$
NEXT

Loops through the input word and uses the LOCATE statement to place each letter (twice) on the screen.

Jelly, 11 bytes

LḶḤ⁶ẋ;"µ»ṚY

Try it online!

C++:

#include <iostream>
#include <string>

int main()
{
    char a[] = {'P','R','O','G','R','A','M'};
    int length = sizeof(a)/sizeof(a[0]);
    int l = length - 1, i, j;
    for (i=0; i <= l; i++) {
        for (j=0; j <= l;j++) {
            if (j == i)
                std::cout<<a[i];
            else if (i == l-j)
                std::cout<<a[j];
            else
                std::cout<<"s";
        }            
        std::cout<<"\n";
    }
}

Prolog - 240 bytes

:-initialization m.
+[]. +[H|T]:-(H=' ';!),+T.
+[H|T]+I+X:-0=:=I,X=H;+T+(I-1)+X.
+L+I+C+S:-L=:=I;S=[D|E],+C+I+B,+C+(L-I-1)+B,+B+2*I+D,+L+(I+1)+C+E,+B,writef('%s\n',[B]).
-X:-get_char(C),(C='\n',X=[];X=[C|Y],-Y).
m:- -X,length(X,L),+L+0+_+X.

Invocation:

$ echo "Code-Golf" | swipl -qf c.pl
C               f
  o           l
    d       o
      e   G
        -
      e   G
    d       o
  o           l
C               f

Readable:

:- initialization(main).

vars_to_spaces([]).
vars_to_spaces([' '|T]) :- vars_to_spaces(T).
vars_to_spaces([_|T]) :- vars_to_spaces(T).

get_index([Head|_], Index, Result) :-
    0 =:= Index,
    Result = Head.
get_index([_|Tail], Index, Result) :-
    get_index(Tail, Index-1, Result).

print_loop(Length, Index, Board, String) :-
    Length =:= Index;
    String = [FirstChar|RestString],
    get_index(Board, Index, Line),
    get_index(Board, Length-Index-1, Line),
    get_index(Line, 2*Index, FirstChar),
    print_loop(Length, Index+1, Board, RestString),
    vars_to_spaces(Line),
    writef('%s\n', [Line]).

get_line(Line) :-
    get_char(C),
    (   C = '\n', Line = [];
        Line = [C|More], get_line(More)).

main :-
    get_line(String),
    length(String, Length),
    print_loop(Length, 0, _, String).

Javascript 102 84 85

Edit: Had to fix spacing. Not so small anymore.

function p(s){for(i in s){o='';for(n in s)o+=(n==i?s[n]:n==s.length-1-i?s[n]:' ')+' ';console.log(o)}}

p('Thanks-Dennis')

T                       s
  h                   i
    a               n
      n           n
        k       e
          s   D
            -
          s   D
        k       e
      n           n
    a               n
  h                   i
T                       s

Befunge-93, 68 71

:~:84*-!#@#v_\:2*\4+p1+
::+\4+g:!| >$1+0:>p1-::
00+4\*2:\<>0p#:- ^#2g

You can test it here. It'll come up with an input dialog box on each pass through ~; enter your word one character at a time (it does say the input is 'klunky' after all), ending with a space.

It won't print to the console; this wouldn't be Befunge without a hint of self-modification, after all! Instead it will modify its own grid to display the message. After it's done, the grid will look something like this:

 ~:84*-!#@#v_\:2*\4+p1+
::+\4+g:!| >$1+0:>p1-::
00+4\*2:\<>0p#:- ^#2g

c               f      
  o           l        
    d       o          
      e   g            
        -              
      e   g            
    d       o          
  o           l        
c               f

(Note the noble sacrifice of the cell at (0,0), after we know the pointer won't go there anymore, for the purpose of storing a piece of data.)

It also works with inputs of even length. Note that, since Befunge-93 is limited to an 80x25 grid, the input size is limited to 21 characters if you run it in a Befunge-93 interpreter. Running it as Befunge-98 should remove this limit.

Edit - Now it works more along the lines of the intended output, at the expense of only three characters of length.

PowerShell 118 102 97

($x=[char[]]"$args")|%{$i++;$y=[char[]]" "*$x.Count;$y[$i-1]=$x[$i-1];$y[-$i]=$x[-$i];$y-join' '}

Outputs:

PS C:\PowerShell> .\cross.ps1 SWORD
S       D
  W   R
    O
  W   R
S       D

C# (192 / 170)

using System;class P{static void Main(){var s=Console.ReadLine();int x,y,l=s.Length;for(x=0;x<l;x++){for(y=0;y<l;y++)Console.Write(x==y||l-x==y+1?s.Substring(x,1):" ");Console.Write("\n");};}}

Or, as "Main() only":

static void Main(){var s=Console.ReadLine();int x,y,l=s.Length;for(x=0;x<l;x++){for(y=0;y<l;y++)Console.Write(x==y||l-x==y+1?s.Substring(x,1):" ");Console.Write("\n");};}

J - 36 30 bytes:

Edit: 6 characters shorter, credits go to @algorithmshark .

(1j1#"1' '&,({~](*>.*&|.)=)#\)

eg:

   (1j1#"1' '&,({~](*>.*&|.)=)#\) 'Code-Golf'
C               f
  o           l  
    d       o    
      e   G      
        -        
      e   G      
    d       o    
  o           l  
C               f

Bonus: works with even length strings too:

   (1j1#"1' '&,({~](*>.*&|.)=)#\) 'CodeGolf'
C             f
  o         l  
    d     o    
      e G      
      e G      
    d     o    
  o         l  
C             f

No matter how long, there's always gotta be an answer in...

Java - 289 234 bytes

public static void main(String[]a){int l=a.length-1,i=0,j;for(;i<=l;i++){for(j=0;j<=l;j++){if(j==i)System.out.print(a[i]);else if(i==l-j)System.out.print(a[j]);else System.out.print(" ");System.out.print(" ");}System.out.println();}}}

Ungolfed:

    class A {

    public static void main(String[] a) {
        int l = a.length - 1, i = 0, j;
        for (; i <= l; i++) {
            for (j=0; j <= l;j++) {
                if (j == i)
                    System.out.print(a[i]);
                else if (i == l-j)
                    System.out.print(a[j]);
                else
                    System.out.print(" ");
                System.out.print(" ");
                }            
            System.out.println();
        }
    }
}

Output, lousily done, is:

P           M 
  R       A   
    O   R     
      G       
    O   R     
  R       A   
P           M 

Added the import java.util.Scanner inside the code because I never remember if the imports count towards the byte count... Damn, I really suck at this.

T-SQL: 180

Taking the input from variable @i

DECLARE @s VARCHAR(MAX)=REPLICATE('  ',LEN(@i)),@ INT=1a:PRINT STUFF(STUFF(@s,@*2-1,1,SUBSTRING(@i,@,1)),LEN(@i)*2-(@*2)+1,1,SUBSTRING(@i,LEN(@i)-@+1,1))SET @+=1IF @<=LEN(@i)GOTO A

This stuffs single characters in/decrementing from the start and end into a string of spaces.

Test Result

DECLARE @i VARCHAR(MAX)='Super Large'
DECLARE @s VARCHAR(MAX)=REPLICATE('  ',LEN(@i)),@ INT=1a:PRINT STUFF(STUFF(@s,@*2-1,1,SUBSTRING(@i,@,1)),LEN(@i)*2-(@*2)+1,1,SUBSTRING(@i,LEN(@i)-@+1,1))SET @+=1IF @<=LEN(@i)GOTO A
S                   e 
  u               g   
    p           r     
      e       a       
        r   L         

        r   L         
      e       a       
    p           r     
  u               g   
S                   e 

JavaScript (E6) 101 95 129 136

Edit Wrong letter spacing. Fixed.
Edit Simpler and shorter using classic for loops
As a function, output via popup.

F=a=>{
  for(l=a.length+1,i=s=o='';++i<l;s='\n')
    for(j=0;++j<l;)
      o+=s+((s=' ')+a)[j==i|i+j==l&&j]
  alert(o)
}

Previous version using .map

F=a=>alert([...a].map((c,p)=>
  --q<p
  ?B(q)+a[q]+B(p-q-1)+c 
  :B(p)+c+(p-q?B(q-p-1)+a[q]:'')
,B=n=>' '.repeat(n),q=a.length).join('\n'))

Test In FireFox/FireBug console

F('Java-Script')

Output

J                   t
  a               p  
    v           i    
      a       r      
        -   c        
          S          
        -   c        
      a       r      
    v           i    
  a               p  
J                   t

Ruby, 64

f=->w{x=w.size
x.times{|i|y=" "*x
y[i],y[~i]=w[i],w[~i]
puts y}}

Explanation

GolfScript 46 (DEMO)

:w,:l,{l,{.[.l(\-]2$?)!w@[=32]=}%\;''+' '*}%n*

Pyth, 22

Vzjdm?@zd}N,dt-lzd\ Uz

Test:

$ pyth -c 'Vzjdm?@zd}N,dt-lzd\ Uz' <<< "CODE-GOLF"
C               F
  O           L  
    D       O    
      E   G      
        -        
      E   G      
    D       O    
  O           L  
C               F

Explanation:

(Implicit)                  z = input()
(Implicit)                  d = ' '
Vz                          for N in range(len(z)):
  jd                            print(d.join(
    m                               map(lambda d:
     ?@zd                                        z[d] if
         }N                                      N in
           ,dt-lzd                                    (d,len(z)-d-1) else
      \                                          " ",
     Uz                                          range(len(z)))))

CJam, 27 25 bytes

l_,S*:Sf{W):W2$tW~@tS}zN*

Try it online.

Example run

$ cjam <(echo 'l_,S*:Sf{W):W2$tW~@tS}zN*') <<< CROSS; echo
C       S 
  R   S   
    O     
  R   S   
C       S 

As the example in the answer, each line has trailing whitespace.

How it works

                             " N := '\n'; R := []; S = ' '; W := -1 ";
l                            " Q := input()                         ";
 _,S*:S                      " S := len(Q) * S                      ";
       f{            }       " for each C in Q:                     ";
                             "   T := S                             ";
         W):W                "   W += 1                             ";
             2$t             "   T[W] := C                          ";
                W~@t         "   T[~W] := C                         ";
                             "   R += [T]                           ";
                    S        "   R += [S]                           ";
                      z      " R := zip(R)                          ";
                       N*    " R := N.join(R)                       ";
                             " print R                              ";

Pure Bash, 94 bytes

l=${#1}
for((;t<l*l;t++));{
((x=t%l))||echo
((x-t/l&&x+t/l+1-l))&&printf \ ||printf ${1:x:1}
}

Perl - 90

It might be possible to squeeze some more characters out of this:

($j=$i++%8)==7?++$k&&print"\n":print$j+1==$k||7-$j==$k?"$_ ":"  "for split//,($_ x y///c)

89 + 1 for -n.

Run with:

echo "program" | perl -nE'($j=$i++%8)==7?++$k&&print"\n":print$j+1==$k||7-$j==$k?"$_ ":"  "for split//,($_ x y///c)'

Output:

p           m
  r       a
    o   r
      g
    o   r
  r       a
p           m

Java - 168

A simple nested loop, there's nothing really special going on here.

class C{public static void main(String[]a){int b=-1,c=a[0].length()-1,d;for(;b++<c;)for(d=-1;d++<c;)System.out.print((b==d|b==c-d?a[0].charAt(d):" ")+(c==d?"\n":""));}}

With line breaks:

class C{
    public static void main(String[]a){
        int b=-1,c=a[0].length()-1,d;
        for(;b++<c;)
            for(d=-1;d++<c;)
                System.out.print(
                    (b==d|b==c-d?a[0].charAt(d):" ")+
                    (c==d?"\n":""));
    }
}

C, 105

two slightly different ways of doing it.

c,i,j;main(int l,char**v){for(l=strlen(v[1]);j-l;)putchar((c=v[1][i++])?i-1-j&&l-i-j?32:c:(i=0,j++,10));}

i,j;main(int l,char**v){for(l=strlen(v[1]);j-l;i++)putchar((l-i)?i-j&&l-i-j-1?32:v[1][i]:(i=-1,j++,10));}

If you want to add extra spaces, replace putchar( with printf(" %c", for an extra 5 characters.

Mathematica, 149 bytes

FromCharacterCode@Flatten[Append[Riffle[#,32],10]&/@MapThread[Max,{#,Reverse@#,ConstantArray[32,Dimensions@#]},2]&@DiagonalMatrix@ToCharacterCode@#]&

Input passed as parameter to the function; function returns the output string. There is a trailing newline at the end of the output.

Explanation: We create a diagonal matrix with the string, then we create a copy of it vertically flipped using Reverse@# to reverse the rows. Then we have a third matrix of the same dimensions containing only 32 (ascii space). We use MapThread to take the element-wise max of these 3 matrices. Finally, we Riffle spaces into each row, Append a newline at the end, and Flatten the result.

CJam, 38 36 35 34 32 bytes

l:I,,_f{f{_2$=@2$+I,(=|\I=S?S}N}

Test it here. This reads the input word from STDIN. It also works for an even number of characters. This prints a trailing column of spaces, but I don't see anything in the rules against that.

Explanation

l:I,,_f{f{_2$=@2$+I,(=|\I=S?S}N}
l:I                              "Read input and store it in I.";
   ,                             "Get string length.";
    ,_                           "Turn into range and duplicate.";
      f{                       } "Map block onto first range, with second range on the stack.";
        f{                   }   "Map block onto second range, with first iterator in stack.
                                  Each invocation of this block will start with grid coordinates
                                  y and x on the stack (x on top).";
          _2$=                   "Duplicate x, duplicate y, check for equality.";
              @2$+               "Pull up y, duplucate x, add,";
                  I,(=           "Check if that's one less than the string length.";
                      |          "Bitwise or between conditions.";
                       \         "Swap condition and x.";
                        I=       "Take x'th character from the string.";
                          S?     "Push a space and select character depending on condition.";
                            S    "Push another space.";
                              N  "Push a line feed.";

The contents of the stack are printed automatically at the end of the program.

C# 208

static void Main()
{
string s=Console.ReadLine(),t="";
int n=s.Length;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j)t+=s[i];
else if(i==n-j-1)t+=s[n-i-1];
t+=" ";
}
t+="\n";
}
Console.WriteLine(t);
}

APL (37 35 34 27)

↑{∊2↑¨⍵↑¨I}¨↓(+∨⌽)∘.=⍨⍳⍴I←⍞

It takes input from the keyboard, like so:

      ↑{∊2↑¨⍵↑¨I}¨↓(+∨⌽)∘.=⍨⍳⍴I←⍞
CODE-GOLF
C               F 
  O           L   
    D       O     
      E   G       
        -         
      E   G       
    D       O     
  O           L   
C               F 

JavaScript (ES6) - 185 177 175 170 bytes

f=n=>{return s='  ',r='repeat',n=[...n],l=n.length,j=l/2-.5,[...h=n.slice(0,j).map((c,i)=>s[r](i)+c+s[r](l-2-(i*2))+' '+n[l-i-1]),s[r](j)+n[j],...h.reverse()].join('\n')}

Put this in the Firefox console and run as f('PROGRAM'):

P           M
  R       A
    O   R
      G
    O   R
  R       A
P           M

f("CODE-GOLF"):

C               F
  O           L
    D       O
      E   G
        -
      E   G
    D       O
  O           L
C               F

C# (214 212)

(Certainly badly) Golfed version:

using System;class A{static void Main(){char[]a,w=Console.ReadLine().ToCharArray();int l=w.Length,i=0;for(;i<l;i++){a=new string(' ',2*l-1).ToCharArray();a[2*i]=w[i];a[2*l-2*i-2]=w[l-i-1];Console.WriteLine(a);}}}

Ungolfed version:

using System;

class A
{
  static void Main()
  {
    char[] a, w = Console.ReadLine().ToCharArray();
    int l = w.Length, i = 0;
    for (; i < l; i++)
    {
      a = new string(' ', 2 * l - 1).ToCharArray();
      a[2 * i] = w[i];
      a[2 * l - 2 * i - 2] = w[l - i - 1];
      Console.WriteLine(a);
    }
  }
}

Any hints, tips, tricks or remarks are very welcome, as this is my first attempt at CodeGolf. I just wanted to try it, even though I know my C# byte length won't even come close to double the best solutions ;)

And how do you guys count your bytes? I just posted the above into a Quick Watch window and did .Length. I could write a small program to count bytes for me, but I bet there is an easier way that I don't yet know.

Python 3: 75 chars

s=input()
i=n=len(s)
while i:i-=1;a=[" "]*n;a[i]=s[i];a[~i]=s[~i];print(*a)

For line i, we start with a list of spaces and set the entries i from the front and back to be equal to the letters of the input string. Then, we print the result.

Python strings are immutable, so a must be a list of characters instead. The list a must be initialized inside the loop or the modifications will carry over between loops. We use print(*a) to print each character in the list, space separated, which requires Python 3.

The output lines are symmetrical, so we can have i count down rather than up using a while loop.

>>> CODE-GOLF
C               F
  O           L  
    D       O    
      E   G      
        -        
      E   G      
    D       O    
  O           L  
C               F

It also works for an even number of letters.

>>> CODEGOLF
C             F
  O         L  
    D     O    
      E G      
      E G      
    D     O    
  O         L  
C             F

Python 2 - 94 90 89 88

s=input()
L=len(s)
R=range(L)
for i in R:print" ".join([s[j]," "][j!=i!=L+~j]for j in R)

Input:

"CODE-GOLF"

Output:

C               F
  O           L  
    D       O    
      E   G      
        -        
      E   G      
    D       O    
  O           L  
C               F