Karakter Cross

31

Saya mengharapkan untuk memposting sesuatu yang lebih kompleks sebagai teka-teki pertama saya di PCG, tapi pertanyaan pekerjaan rumah khusus tentang Stack Overflow menginspirasi saya untuk memposting ini. Mereka ingin:

cetak pola berikut untuk kata tertentu yang berisi jumlah ganjil huruf:

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


Perhatikan bahwa huruf adalah langkah ksatria yang terpisah dalam pola yang perlu Anda cetak. Jadi, setiap kolom lainnya kosong. - (Terima kasih xnor untuk menunjukkan ini.)

Aturan

  1. Dilarang menggunakan C ++. Karena saya dapat menghubungkan pertanyaan ini di sana.
  2. Anda dapat menggunakan stdout, atau cara apa pun untuk mengeluarkan string dengan cepat (misalnya alert()dalam JavaScript).
  3. Seperti biasa, kode terpendek menang.
sampathsris
sumber
2
Ini ada dalam pos terkait pada stack overflow: stackoverflow.com/q/5508110
Level River St
2
@ flawr Saya pikir ini berarti aneh, karena bukan bilangan genap.
NinjaBearMonkey
31
Ya Tuhan saya bodoh, saya pikir itu semacam singkatan ilmuwan komputer =)
flawr
2
@ jpjacobs: Bytes, kecuali pertanyaannya secara eksplisit mengatakan sebaliknya.
Dennis
2
Seluruh program atau hanya sebuah fungsi? (sangat pandai saya menjawab terlebih dahulu dan mengajukan pertanyaan ini nanti ...)
Rodolfo Dias

Jawaban:

13

Pyth , 22

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

Uji:

$ 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

Penjelasan:

(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)))))
isaacg
sumber
Tidak ada sedikit komplemen di Pyth?
xnor
@xnor Tidak, tapi itu tidak membantu. Misalkan ~bitwise tidak dalam Pyth. Lalu kita bisa berubah t-lzdmenjadi +lz~d- masih 5 karakter.
isaacg
Vzadalah trik yang rapi: Saya tidak tahu itu U<string>memberi range(len(<string>)).
FryAmTheEggman
Ya, ini fitur yang bagus. Bekerja seperti itu pada daftar juga, tetapi tidak perlu tuple. EDIT: Ups, itu hilang dari dokumentasi. Saya akan menambahkannya. Maaf.
isaacg
20

APL ( 37 35 34 27)

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

Dibutuhkan input dari keyboard, seperti:

      ↑{∊2↑¨⍵↑¨I}¨↓(+∨⌽)∘.=⍨⍳⍴I←⍞
CODE-GOLF
C               F 
  O           L   
    D       O     
      E   G       
        -         
      E   G       
    D       O     
  O           L   
C               F 
marinus
sumber
7
Semua upvotes saya milik APL.
Nit
13

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)

Memasukkan:

"CODE-GOLF"

Keluaran:

C               F
  O           L  
    D       O    
      E   G      
        -        
      E   G      
    D       O    
  O           L  
C               F
Falko
sumber
Saya hanya menulis hal yang sama. Satu perbaikan saya adalah i in[j,L+~j].
xnor
@ xnor: Menemukan kondisi yang lebih pendek. ;)
Falko
Pintar. Anda masih bisa melakukannya L+~j.
xnor
@ xnor: Ah, kamu benar. Saya selalu lupa +~triknya ...
Falko
Bisakah kamu lakukan for i in R:print" ".join([s[j]," "][j!=i!=L+~j]for j in R)untuk menyelamatkan char? (Saya tidak punya akses ke Python 2 sekarang untuk menguji.)
xnor
11

Python 3: 75 karakter

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

Untuk baris i, kita mulai dengan daftar spasi dan mengatur entri idari depan dan belakang menjadi sama dengan huruf-huruf dari string input. Kemudian, kami mencetak hasilnya.

String python tidak dapat diubah, jadi aharus berupa daftar karakter saja. Daftar aharus diinisialisasi di dalam loop atau modifikasi akan terbawa di antara loop. Kami menggunakan print(*a)untuk mencetak setiap karakter dalam daftar, spasi terpisah, yang membutuhkan Python 3.

Garis output simetris, jadi kita bisa imenghitung mundur daripada menggunakan loop sementara.

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

Ini juga berfungsi untuk jumlah huruf genap.

>>> CODEGOLF
C             F
  O         L  
    D     O    
      E G      
      E G      
    D     O    
  O         L  
C             F
Tidak
sumber
Mengubah ini ke Pyth, saya mendapatkan VlzJ*]dlz=@JN@zN=@Jt_N@_zNjdJyang 29 byte ... Saya kira saya harus mencoba sesuatu yang lain untuk mengalahkan APL. Juga, +1 sebagai bukti bahwa Python 3 dapat bermain golf Python 2 (kadang-kadang)
FryAmTheEggman
@fry Python 3 biasanya out-golf 2 menurut pengalaman saya. Bahkan jika tidak ada yang berubah di tempat lain, sebagian besar tantangan memberikan satu input dan mengharapkan satu output, dan len("raw_input()") + len("print ") > len("input()") + len("print()").
undergroundmonorail
@undergroundmonorail Nah, masalah dengan itu adalah yang input() juga berlaku di python 2 (hanya bertindak agak berbeda), jadi kecuali jika input untuk tantangan cukup ketat, python 2 biasanya akan menang.
FryAmTheEggman
Wow, bahkan dengan Python 2 dan print" ".join(a)kode Anda lebih pendek (82) dari saya.
Falko
@FryAmTheEggman Lihat jawaban saya - ini merupakan adaptasi dari jawaban python lainnya, dan jauh lebih pendek dari APL. Sayangnya, Pyth benar-benar tidak suka ditugaskan ke indeks.
isaacg
8

CJam, 27 25 byte

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

Cobalah online.

Contoh dijalankan

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

Seperti contoh dalam jawaban, setiap baris memiliki spasi spasi.

Bagaimana itu bekerja

                             " 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                              ";
Dennis
sumber
1
Maaf bahwa ini pada dasarnya adalah 'jawaban yang bagus!' komentar, tetapi saya hanya harus mengatakan bahwa tidak pernah, pernah terpikir oleh saya untuk membangun kotak dengan kolom, bukan oleh baris.
FryAmTheEggman
4

Jawa - 168

Lingkaran bersarang sederhana, tidak ada yang benar-benar istimewa terjadi di sini.

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":""));}}

Dengan jeda baris:

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":""));
    }
}
Geobit
sumber
4

Pure Bash, 94 byte

l=${#1}
for((;t<l*l;t++));{
((x=t%l))||echo
((x-t/l&&x+t/l+1-l))&&printf \ ||printf ${1:x:1}
}
Trauma Digital
sumber
1
Terlalu banyak t%lperhitungan. Simpan pada penggunaan pertama untuk variabel ((x=t%l))kemudian gunakan variabel untuk menguranginya menjadi 94 karakter.
manatwork
Ah ya, saya telah melakukan ini untuk x=t%ldan y=t/ldan itu lebih lama ... tidak terlintas dalam pikiran saya hanya untuk menggunakan x saja
Digital Trauma
4

Ruby, 64

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

Penjelasan

  • Masukan diambil sebagai argumen ke lambda. Itu mengharapkan a String.
  • Dalam satu lingkaran yang loop melalui setiap karakter dalam kata ( ntotal):
    • Buat String yang terdiri dari nspasi.
    • Ganti spasi ith dan n-ith ( ~i, thanks xnor) dengan karakter ith dan n-ith dari input.
    • Cetak garis
britishtea
sumber
7
Selamat memposting jawaban ke-25.000! :) (Sebenarnya, saya tidak 100% yakin, ini dia, karena caching. Tapi itu jawaban terakhir, ketika saya pertama kali melihat "25.000 jawaban" dalam statistik situs.)
Martin Ender
2
Anda dapat melakukan -i-1sebagai pelengkap bit ~i.
xnor
Itu sangat pintar, terima kasih!
britishtea
2
Dengan pendekatan ini, tampaknya lebih bermanfaat menggunakan stdin daripada lambda: gets.size.times{|x|u=?\s*~/$/;u[x]=$_[x];u[~x]=$_[~x];puts u}(mengasumsikan input tidak diakhiri oleh baris baru, misalnya echo -n CODE-GOLF). Satu kemudian dapat menggunakan tambahan .charsuntuk menyimpan karakter lain:x=0;gets.chars{|r|u=?\s*~/$/;u[x]=r;u[~x]=$_[-x+=1];puts u}
Ventero
4

JavaScript (E6) 101 95 129 136

Edit spasi surat yang salah. Tetap.
Edit Lebih sederhana dan lebih pendek menggunakan klasik untuk loop
Sebagai fungsi, output melalui 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)
}

Versi sebelumnya menggunakan .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'))

Uji di konsol FireFox / FireBug

F('Java-Script')

Keluaran

J                   t
  a               p  
    v           i    
      a       r      
        -   c        
          S          
        -   c        
      a       r      
    v           i    
  a               p  
J                   t
edc65
sumber
2
Ini tidak memiliki jarak horizontal yang cukup - harus ada kolom semua ruang antara setiap kolom dengan huruf.
isaacg
4

Befunge-93, 68 71

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

Anda bisa mengujinya di sini . Ini akan muncul dengan kotak dialog input pada setiap pass ~; masukkan kata Anda satu karakter pada satu waktu (katanya inputnya 'klunky'), diakhiri dengan spasi.

Itu tidak akan mencetak ke konsol; bagaimanapun, ini bukan Befunge tanpa sedikit modifikasi diri! Alih-alih itu akan memodifikasi kisi sendiri untuk menampilkan pesan. Setelah selesai, kotak akan terlihat seperti ini:

 ~: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

(Perhatikan pengorbanan mulia sel di (0,0), setelah kita tahu pointer tidak akan pergi ke sana lagi, untuk tujuan menyimpan sepotong data.)

Ini juga bekerja dengan input yang panjangnya genap. Perhatikan bahwa, karena Befunge-93 terbatas pada kisi 80x25, ukuran input dibatasi hingga 21 karakter jika Anda menjalankannya dalam juru bahasa Befunge-93. Menjalankannya sebagai Befunge-98 harus menghapus batas ini.

Sunting - Sekarang ini berfungsi lebih banyak di sepanjang garis keluaran yang dimaksudkan, dengan mengorbankan hanya tiga karakter panjangnya.

Kasran
sumber
Perhatikan bahwa surat-surat dipisahkan dengan kolom kosong. Surat relatif dalam bentuk L.
sampathsris
Drat! Hal-hal rumit itu agak signifikan. Saya pikir saya bisa menyelamatkan ini, tetapi itu akan menambah ukuran akhir ... oh well.
Kasran
4

Javascript 102 84 85

Sunting: Harus memperbaiki spasi. Tidak lagi kecil.

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
Rip Leeb
sumber
Ini tidak memiliki jarak horizontal yang cukup.
Dennis
1
Wow, lebih pendek dari saya dan bahkan tidak menggunakan ES6. +1
Scimonster
Lebih baik, tapi jaraknya masih salah (lihat X). Juga, kecuali pertanyaannya mengatakan sebaliknya, Anda harus menulis sebuah program atau fungsi. Cuplikan dengan variabel hardcoded umumnya disukai.
Dennis
1
Dan tidak bisakah Anda membuatnya function(s)karena Anda tidak berulang?
Zacharý
3

CJam, 38 36 35 34 32 byte

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

Uji di sini. Ini membaca kata input dari STDIN. Ini juga berfungsi untuk jumlah karakter genap. Ini mencetak kolom spasi tambahan, tapi saya tidak melihat apa pun dalam aturan yang menentangnya.

Penjelasan

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.";

Isi tumpukan dicetak secara otomatis di akhir program.

Martin Ender
sumber
CJam sayang, Anda baru saja dikalahkan oleh APL. ^ _ ^
vaxquis
@vaxquis Saya terkejut saya bisa mengalahkannya dua kali. Masalah ini tampaknya jauh lebih cocok untuk APL dan co daripada ke bahasa berbasis stack.
Martin Ender
2
baik, setidaknya lebih mudah untuk menulis l:I,,_f{f{_2$=@2$+I,(=|\I=S?S}N}di atas serbet daripada ↑{∊2↑¨⍵↑¨I}¨↓(+∨⌽)∘.=⍨⍳⍴I←⍞... terkekeh
vaxquis
Yah, orang lain berhasil mengalahkan saya menggunakan CJam, dan saya tidak bisa membuat program saya lebih pendek, jadi CJam akhirnya mengalahkan saya. (Tapi Pyth mendapatkan mahkota.) (Yang mengatakan, @vaxquis, APL jauh lebih mudah dibaca daripada sebagian besar bahasa lain yang digunakan di sini, tentu saja setelah Anda tahu 60 karakter atau lebih, dan tentu saja bila dibandingkan dengan Pyth atau CJam atau even J.)
marinus
3

C, 105

dua cara yang sedikit berbeda untuk melakukannya.

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));}

Jika Anda ingin menambahkan spasi tambahan, ganti putchar(dengan printf(" %c",untuk 5 karakter tambahan.

Level River St
sumber
3

J - 36 30 byte:

Sunting: 6 karakter lebih pendek, kredit masuk ke @algorithmshark .

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

misalnya:

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

Bonus: bekerja dengan string panjang genap juga:

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

Prolog - 240 byte

:-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.

Doa:

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

Dapat dibaca:

:- 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).
kay
sumber
3

Kanvas , 5 byte

\\:⇵n

Coba di sini!

Penjelasan:

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

R , 99 98 93 89 byte

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

Cobalah online!

Baris 1 membaca string input, membaginya menjadi karakter, menyimpan panjangnya dan membuat matriks dengan kata pada diagonal utamanya - huruf-huruf dari kata tersebut ditumpangkan pada matriks identitas (dan diulangi secara default agar sesuai dengan panjangnya) dan hanya yang cocok 1 dipertahankan, lainnya digantikan oleh spasi.

Baris 2 mencetak matriks yang dibentuk oleh elemen-elemen baik dari matriks diagonal atau versi cermin horizontal, yang mana yang lebih besar.

−2 + 1 = −1 byte berkat JayCe

−4 byte berkat Giuseppe

Robert Hacken
sumber
1
Manis! Dan penjelasan yang bagus. Anda dapat menghemat 2 byte
JayCe
1
melihat dia jawaban lain dan pertanyaan - Sepertinya matriks harus lebih besar (ruang ekstra) - output tidak boleh berupa matriks persegi ..
JayCe
@JayCe Terima kasih untuk 2 byte! Dan terima kasih atas komentar tentang pemformatan, Anda mungkin benar (walaupun aturannya bisa lebih jelas tentang ini). Untungnya semua yang dibutuhkan adalah menempatkan ruang ke pemisah saat mencetak.
Robert Hacken
89 byte menggunakanpmax dan sebaris beberapa tugas lagi.
Giuseppe
@Giuseppe Terima kasih! Sayangnya, masih belum cukup untuk mengalahkan J.Doe 's solusi
Robert Hacken
2

C # ( 214 212)

(Tentu saja sangat buruk) Versi golf:

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);}}}

Versi tidak disatukan:

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);
    }
  }
}

Semua petunjuk, kiat, trik, atau komentar sangat disambut baik, karena ini adalah upaya pertama saya di CodeGolf. Saya hanya ingin mencobanya, meskipun saya tahu panjang C # byte saya bahkan tidak akan mendekati dua kali lipat solusi terbaik;)

Dan bagaimana kalian menghitung byte Anda? Saya baru saja memposting di atas ke jendela Quick Watch dan melakukannya .Length. Saya bisa menulis sebuah program kecil untuk menghitung byte untuk saya, tetapi saya yakin ada cara yang lebih mudah yang belum saya ketahui.

InvisiblePanda
sumber
Anda dapat menyimpan dua byte dengan menghapus spasi di for(;i < l;i++).
Beta Decay
Juga, saya menggunakan ini untuk penghitungan byte saya.
Beta Decay
@ BetaDecay Ah bagus, saya pasti mengabaikan itu. Dan terima kasih untuk tautannya!
InvisiblePanda
2

JavaScript (ES6) - 185 177 175 170 byte

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')}

Masukkan ini di konsol Firefox dan jalankan sebagai 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
Scimonster
sumber
Saya juga melihatnya.
Scimonster
2

Mathematica, 149 byte

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

Input dikirimkan sebagai parameter ke fungsi; fungsi mengembalikan string output. Ada baris baru di akhir output.

Penjelasan: Kami membuat matriks diagonal dengan string, lalu kami membuat salinannya secara vertikal menggunakan Reverse@#untuk membalikkan baris. Kemudian kita memiliki matriks ketiga dengan dimensi yang sama yang hanya berisi 32 (ruang ascii). Kami menggunakan MapThreaduntuk mengambil maks elemen-bijaksana dari 3 matriks ini. Akhirnya, kita Rifflespasi ke setiap baris, Appendbaris baru di akhir, dan Flattenhasilnya.

jcai
sumber
2

C , 119

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

Ini mungkin tidak dikompilasi sebagai C ++, jadi saya harap, saya tidak melanggar aturan :)

VX
sumber
1. Output saat ini salah. Harus ada spasi di antara surat-surat itu. 2. i=0dan j=0tidak diperlukan, karena variabel global diinisialisasi ke nol. 3. Anda bisa menggunakannya main(l,v)char**v;sebagai ganti main(int l,char**v). 4. Jika Anda memperbarui isebagai i+=puts(""), Anda dapat menyingkirkan kurung keriting lingkaran luar.
Dennis
2

Perl - 90

Dimungkinkan untuk memeras beberapa karakter lagi dari ini:

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

89+ 1untuk -n.

Jalankan dengan:

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

Keluaran:

p           m
  r       a
    o   r
      g
    o   r
  r       a
p           m
hmatt1
sumber
2

T-SQL: 180

Mengambil input dari variabel @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

Ini memasukkan karakter tunggal di / decrementing dari awal dan akhir menjadi serangkaian spasi.

Hasil tes

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 
MickyT
sumber
2

PowerShell 118 102 97

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

Output:

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

JavaScript (Node.js) , 81 byte

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

EDIT : -1 Terima kasih Joe King. Saya tidak melihat TIO memberikan pasta langsung terformat untuk CG.

Cobalah online!


sumber
btw, kode berlebih untuk mengeksekusi kode di TIO bisa masuk di catatan kaki program. Ini membantu menentukan jumlah byte yang benar dan menggunakan format jawaban PPCG otomatis lebih lancar. mis. Coba online!
Jo King
-i-1bisa+~i
Jo King
1

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);
}
bacchusbeale
sumber
Simpan 11 karakter berharga dengan t+=i==j?s[i]:i==n-j-1?s[n-i-1]:"";.
sampathsris
Bisakah Anda menghapus baris baru itu?
Zacharý
1

GolfScript 46 ( DEMO )

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

Tidak peduli berapa lama, selalu ada jawaban di ...

Java - 289 234 byte

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();}}}

Tidak Disatukan:

    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();
        }
    }
}

Keluaran, yang dilakukan dengan buruk, adalah:

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

Menambahkan bagian import java.util.Scannerdalam kode karena saya tidak pernah ingat jika impor dihitung terhadap jumlah byte ... Sial, saya benar-benar payah dalam hal ini.

Rodolfo Dias
sumber
2
Impor memang masuk hitungan. Ini sebagian karena sintaks impor-dan-alias Python: from math import floor as fyang sedikit curang
Anda harus dapat menyimpan banyak karakter dengan menggabungkan semua System.out.printpanggilan menjadi satu, menggunakan beberapa operator ternary.
DLosc
@DLosc Bisakah Anda memberi saya beberapa contoh?
Rodolfo Dias
1
Ya, sebenarnya jawaban Geobits adalah contoh sempurna - lihat isi System.out.printpanggilan di akhir.
DLosc
1
@RodolfoDias Jangan merasa seperti itu. Beberapa golf pertama saya di Jawa sangat buruk , dan saya masih bisa mencukur "revisi pertama" saya jika saya terlihat cukup keras;)
Geobits
1

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");};}}

Atau, sebagai "Hanya utama ()":

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");};}
RobIII
sumber