Chữ thập nhân vật


31

Tôi đã mong đợi để đăng một cái gì đó phức tạp hơn như câu đố đầu tiên của tôi trong PCG, nhưng một câu hỏi cụ thể, uh ... bài tập về Stack Overflow đã truyền cảm hứng cho tôi để đăng bài này. Họ muốn:

in mẫu sau cho bất kỳ từ nào có chứa số chữ cái lẻ :

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


Lưu ý rằng các chữ cái là một hiệp sĩ di chuyển ngoài mẫu bạn cần in. Vì vậy, mọi cột khác đều trống rỗng. - (Cảm ơn xnor đã chỉ ra điều này.)

Quy tắc

  1. Sử dụng C ++ bị cấm. Như tôi có thể liên kết câu hỏi này ở đó.
  2. Bạn có thể sử dụng stdouthoặc bất kỳ phương tiện nào để nhanh chóng xuất ra một chuỗi (ví dụ: alert()trong JavaScript).
  3. Như mọi khi, mã ngắn nhất sẽ thắng.

2
Đây là trong các bài viết liên quan về tràn stack: stackoverflow.com/q/5508110
Level River St

2
@flawr Tôi nghĩ nó có nghĩa là số lẻ, vì không phải là số chẵn.
NinjaBearMonkey

31
Chúa ơi, tôi thật ngốc, tôi nghĩ đó là một từ viết tắt của nhà khoa học máy tính tối nghĩa =)
flawr

2
@jpjacobs: Byte, trừ khi câu hỏi nói rõ ràng khác đi.
Dennis

2
Toàn bộ chương trình hay chỉ là một chức năng? (thông minh thực sự của tôi để trả lời trước và đặt câu hỏi này sau ...)
Rodolfo Dias

Câu trả lời:


13

Kim tự tháp , 22

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

Kiểm tra:

$ 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

Giải trình:

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

Không có bit bổ sung trong Pyth?
xnor

@xnor Không, nhưng nó sẽ không giúp. Giả sử ~là bitwise không ở Pyth. Sau đó, chúng tôi có thể thay đổi t-lzdthành +lz~d- vẫn còn 5 ký tự.
isaacg

Vzlà một mánh khóe gọn gàng: tôi không biết điều đó U<string>đã cho range(len(<string>)).
FryAmTheEggman

Vâng, đó là một tính năng tốt. Hoạt động theo cách đó trong danh sách quá, nhưng không nhất thiết phải bộ. EDIT: Rất tiếc, đó là thiếu trong tài liệu. Tôi sẽ thêm nó. Lấy làm tiếc.
isaacg

20

APL ( 37 35 34 27)

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

Nó nhận đầu vào từ bàn phím, như vậy:

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

7
Tất cả các upvote của tôi thuộc về APL.
Nit

13

Con trăn 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)

Đầu vào:

"CODE-GOLF"

Đầu ra:

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

Tôi chỉ đang viết điều tương tự. Một cải tiến của tôi là i in[j,L+~j].
xnor

@xnor: Tìm thấy một điều kiện thậm chí còn ngắn hơn. ;)
Falko

Tài giỏi. Bạn vẫn có thể làm L+~jmặc dù.
xnor

@xnor: Ah, bạn nói đúng. Tôi luôn quên +~mánh khóe ...
Falko

Bạn có thể làm gì for i in R:print" ".join([s[j]," "][j!=i!=L+~j]for j in R)để cứu một char? (Hiện tại tôi không có quyền truy cập vào Python 2 để kiểm tra.)
xnor

11

Python 3: 75 ký tự

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

Đối với dòng i, chúng tôi bắt đầu với một danh sách các khoảng trắng và đặt các mục itừ phía trước và phía sau bằng với các chữ cái của chuỗi đầu vào. Sau đó, chúng tôi in kết quả.

Chuỗi Python là bất biến, vì vậy aphải là một danh sách các ký tự thay thế. Danh sách aphải được khởi tạo bên trong vòng lặp hoặc các sửa đổi sẽ tiếp tục giữa các vòng lặp. Chúng tôi sử dụng print(*a)để in từng ký tự trong danh sách, phân tách không gian, yêu cầu Python 3.

Các dòng đầu ra là đối xứng, vì vậy chúng ta có thể iđếm ngược thay vì sử dụng vòng lặp while.

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

Nó cũng hoạt động cho một số lượng chẵn các chữ cái.

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

Chuyển đổi nó thành Pyth, tôi nhận VlzJ*]dlz=@JN@zN=@Jt_N@_zNjdJđược 29 byte ... Tôi đoán tôi sẽ phải thử một thứ khác để đánh bại APL. Ngoài ra, +1 để chứng minh rằng Python 3 có thể vượt qua Python 2 (đôi khi)
FryAmTheEggman

@fry Python 3 thường out-golfs 2 theo kinh nghiệm của tôi. Ngay cả khi không có gì thay đổi ở bất cứ nơi nào khác, hầu hết các thách thức đều đưa ra một đầu vào và mong đợi một đầu ra, và len("raw_input()") + len("print ") > len("input()") + len("print()").
undergroundmonorail

@undergroundmonorail Vâng, rắc rối với điều đó input() cũng có giá trị trong python 2 (nó chỉ hoạt động hơi khác), vì vậy trừ khi đầu vào cho thử thách khá nghiêm ngặt, python 2 thường sẽ thắng.
FryAmTheEggman

Ồ, ngay cả với Python 2 và print" ".join(a)mã của bạn ngắn hơn (82) so với của tôi.
Falko

@FryAmTheEggman Xem câu trả lời của tôi - đó là bản phóng tác của câu trả lời trăn khác, và nó ngắn hơn nhiều so với APL. Thật không may, Pyth không thích gán cho các chỉ mục, thật không may.
isaacg

8

CJam, 27 25 byte

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

Hãy thử trực tuyến.

Chạy ví dụ

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

Như ví dụ trong câu trả lời, mỗi dòng có khoảng trắng ở cuối.

Làm thế nào nó hoạt động

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

1
Xin lỗi vì đây về cơ bản là một 'câu trả lời tuyệt vời!' bình luận, nhưng tôi chỉ cần nói rằng nó sẽ không bao giờ xảy ra với tôi để xây dựng hộp theo cột thay vì theo hàng.
FryAmTheEggman

4

Java - 168

Một vòng lặp lồng đơn giản, không có gì thực sự đặc biệt đang diễn ra ở đây.

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

Với ngắt dòng:

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

4

Bash thuần, 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}
}

1
Quá nhiều t%ltính toán. Lưu nó vào lần đầu tiên sử dụng vào một biến ((x=t%l))sau đó sử dụng biến để giảm nó xuống 94 ký tự.
thao tác

À đúng rồi, tôi đã làm điều này x=t%ly=t/llâu hơn ... tôi không nghĩ chỉ sử dụng x
Chấn thương kỹ thuật số

4

Ruby, 64

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

Giải trình

  • Đầu vào được lấy làm đối số cho lambda. Nó mong đợi a String.
  • Trong một vòng lặp lặp lại máng mọi ký tự trong từ ( ntổng cộng):
    • Tạo một chuỗi bao gồm các nkhoảng trắng.
    • Thay thế không gian ithứ và n-ithứ ( ~icảm ơn xnor) bằng ký tự thứ in-ithứ của đầu vào.
    • In dòng

7
Chúc mừng bạn đã đăng câu trả lời thứ 25.000! :) (Trên thực tế, tôi không chắc chắn 100%, đây là câu hỏi, do bộ nhớ đệm. Nhưng đó là câu trả lời mới nhất, khi tôi lần đầu tiên nhìn thấy "25.000 câu trả lời" trong thống kê trang web.)
Martin Ender

2
Bạn có thể làm -i-1như bổ sung bit ~i.
xnor

Điều đó rất thông minh, cảm ơn!
Anh

2
Với phương pháp này, thực sự có ích khi sử dụng stdin thay vì lambda: gets.size.times{|x|u=?\s*~/$/;u[x]=$_[x];u[~x]=$_[~x];puts u}(giả sử đầu vào không bị chấm dứt bởi một dòng mới, ví dụ echo -n CODE-GOLF). Sau đó, người ta có thể sử dụng bổ sung .charsđể lưu một ký tự khác:x=0;gets.chars{|r|u=?\s*~/$/;u[x]=r;u[~x]=$_[-x+=1];puts u}
Ventero

4

JavaScript (E6) 101 95 129 136

Chỉnh sửa khoảng cách chữ sai. Đã sửa.
Chỉnh sửa Đơn giản hơn và ngắn hơn bằng cách sử dụng cổ điển cho các vòng lặp
Là một chức năng, xuất ra thông qua cửa sổ bật lên.

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

Phiên bản trước sử dụng .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'))

Kiểm tra trong bảng điều khiển FireFox / FireBug

F('Java-Script')

Đầu ra

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

2
Điều này không có đủ khoảng cách ngang - nên có các cột của tất cả các khoảng trắng giữa mỗi cột với các chữ cái.
isaacg

4

Befunge-93, 68 71

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

Bạn có thể kiểm tra nó ở đây . Nó sẽ đưa ra một hộp thoại đầu vào trên mỗi lần đi qua ~; nhập từ của bạn một ký tự tại một thời điểm (có nghĩa là đầu vào là 'klunky'), kết thúc bằng một khoảng trắng.

Nó sẽ không in ra bàn điều khiển; Rốt cuộc, đây sẽ không phải là Befunge nếu không có gợi ý tự sửa đổi! Thay vào đó, nó sẽ sửa đổi lưới riêng của mình để hiển thị thông báo. Sau khi hoàn thành, lưới sẽ trông giống như thế này:

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

(Lưu ý sự hy sinh cao quý của tế bào tại (0,0), sau khi chúng tôi biết con trỏ sẽ không đến đó nữa, với mục đích lưu trữ một phần dữ liệu.)

Nó cũng hoạt động với đầu vào có độ dài chẵn. Lưu ý rằng, vì Befunge-93 bị giới hạn ở lưới 80x25, kích thước đầu vào bị giới hạn ở 21 ký tự nếu bạn chạy nó trong trình thông dịch Befunge-93. Chạy nó như Befunge-98 sẽ loại bỏ giới hạn này.

Chỉnh sửa - Bây giờ nó hoạt động nhiều hơn dọc theo các dòng của đầu ra dự định, với chi phí chỉ có ba ký tự.


Lưu ý rằng các chữ cái được phân tách bằng một cột trống. Chữ tương đối trong hình chữ L.
sampathsris

Drats! Đó là những điều phức tạp khá đáng kể. Tôi nghĩ rằng tôi có thể cứu vãn điều này, nhưng nó sẽ thêm vào kích thước kết thúc ... oh tốt.
Kasran

4

Javascript 102 84 85

Chỉnh sửa: Phải sửa khoảng cách. Không còn nhỏ nữa.

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

Điều này không có đủ khoảng cách ngang.
Dennis

1
Wow, ngắn hơn của tôi và thậm chí không sử dụng ES6. +1
Scimonster

Tốt hơn, nhưng khoảng cách vẫn sai (nhìn vào X). Ngoài ra, trừ khi câu hỏi nói khác, bạn nên viết chương trình hoặc hàm. Đoạn trích với các biến được mã hóa cứng thường được tán thành.
Dennis

1
Và bạn không thể làm điều đó function(s)vì bạn không tái diễn?
Zacharý

3

CJam, 38 36 35 34 32 byte

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

Kiểm tra nó ở đây.Điều này đọc từ đầu vào từ STDIN. Nó cũng hoạt động cho một số lượng nhân vật chẵn. Điều này in một cột dấu cách của các khoảng trắng, nhưng tôi không thấy bất cứ điều gì trong các quy tắc chống lại điều đó.

Giải trình

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

Nội dung của ngăn xếp được in tự động vào cuối chương trình.


CJam thân mến của tôi, bạn vừa bị APL đánh bại. ^ _ ^
vaxquis

@vaxquis Tôi rất ngạc nhiên khi tôi có thể đánh bại nó hai lần ngay từ đầu. Vấn đề này có vẻ phù hợp với APL và co hơn là các ngôn ngữ dựa trên ngăn xếp.
Martin Ender

2
tốt, ít nhất thì việc viết l:I,,_f{f{_2$=@2$+I,(=|\I=S?S}N}lên khăn ăn còn dễ hơn là ↑{∊2↑¨⍵↑¨I}¨↓(+∨⌽)∘.=⍨⍳⍴I←⍞... cười thầm
vaxquis

Chà, một người khác đã xoay sở để đánh bại tôi bằng cách sử dụng CJam và tôi không thể làm cho chương trình của mình ngắn hơn nữa, vì vậy cuối cùng, CJam đã đánh bại tôi. (Nhưng Pyth có được vương miện.) (Điều đó nói rằng, @vaxquis, APL dễ đọc hơn nhiều so với hầu hết các ngôn ngữ khác được sử dụng ở đây, chắc chắn một khi bạn biết 60 ký tự hoặc hơn, và chắc chắn khi so sánh với Pyth hoặc CJam hoặc thậm chí J.)
marinus

3

C, 105

hai cách hơi khác nhau để làm điều đó.

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

Nếu bạn muốn thêm khoảng trắng, thay thế putchar(bằng printf(" %c",thêm 5 ký tự.


3

J - 36 30 byte:

Chỉnh sửa: ngắn hơn 6 ký tự, tín dụng chuyển đến @alerskymshark .

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

ví dụ:

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

Phần thưởng: cũng hoạt động với các chuỗi có độ dài bằng nhau:

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

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.

Cầu nguyện:

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

Có thể đọc được

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


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)

Hãy thử trực tuyến!

Dòng 1 đọc chuỗi đầu vào, chia chuỗi thành các ký tự, lưu trữ độ dài của nó và tạo một ma trận với từ trên đường chéo chính của nó - các chữ cái của từ được đặt chồng lên trên một ma trận danh tính (và được lặp lại theo mặc định để khớp với độ dài của nó) 1 được giữ lại, những người khác được thay thế bởi không gian.

Dòng 2 in một ma trận được hình thành bởi các phần tử của ma trận đường chéo hoặc phiên bản được nhân đôi theo chiều ngang của nó, tùy theo giá trị nào lớn hơn.

2 + 1 = byte1 byte nhờ JayCe

4 byte nhờ Giuseppe


1
Ngọt! Và lời giải thích hay. Bạn có thể lưu 2 byte
JayCe

1
nhìn vào anh ta các câu trả lời khác và câu hỏi - Có vẻ như ma trận nên lớn hơn (không gian thừa) - đầu ra không phải là ma trận vuông ..
JayCe

@JayCe Cảm ơn vì 2 byte! Và cảm ơn vì nhận xét về định dạng, bạn có thể đúng (mặc dù các quy tắc có thể rõ ràng hơn về điều này). May mắn thay, tất cả những gì nó cần là đặt một khoảng trống vào dải phân cách trong khi in.
Robert Hacken

89 byte sử dụngpmax và nội tuyến một số bài tập thêm.
Giuseppe

@Giuseppe Cảm ơn! Đáng buồn thay, vẫn không đủ để đánh bại giải pháp của J.Doe
Robert Hacken

2

C # ( 214 212)

(Chắc chắn là rất tệ) Phiên bản chơi gôn:

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

Phiên bản bị đánh cắp:

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

Bất kỳ gợi ý, mẹo, thủ thuật hoặc nhận xét nào đều rất đáng hoan nghênh, vì đây là nỗ lực đầu tiên của tôi tại CodeGolf. Tôi chỉ muốn thử nó, mặc dù tôi biết độ dài byte C # của tôi thậm chí sẽ không đạt gần gấp đôi các giải pháp tốt nhất;)

Và làm thế nào để các bạn đếm byte của bạn? Tôi chỉ đăng những điều trên vào một cửa sổ Xem nhanh và đã làm .Length. Tôi có thể viết một chương trình nhỏ để đếm byte cho tôi, nhưng tôi cá rằng có một cách dễ dàng hơn mà tôi chưa biết.


Bạn có thể lưu hai byte bằng cách loại bỏ khoảng trắng trong for(;i < l;i++).
Beta Decay

Ngoài ra, tôi sử dụng điều này để đếm byte của tôi.
Beta Decay

@BetaDecay Ah tuyệt vời, tôi phải bỏ qua những cái đó. Và cảm ơn về liên kết này!
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')}

Đặt cái này trong bảng điều khiển Firefox và chạy như f('PROGRAM')sau:

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


Tôi cũng thấy cái đó
Scimonster

2

Toán học, 149 byte

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

Đầu vào được truyền dưới dạng tham số cho hàm; Hàm trả về chuỗi đầu ra. Có một dòng mới ở cuối đầu ra.

Giải thích: Chúng tôi tạo một ma trận đường chéo với chuỗi, sau đó chúng tôi tạo một bản sao của nó được lật theo chiều dọc bằng cách sử dụng Reverse@#để đảo ngược các hàng. Sau đó, chúng ta có một ma trận thứ ba có cùng kích thước chỉ chứa 32 (không gian ascii). Chúng tôi sử dụng MapThreadđể lấy tối đa phần tử của 3 ma trận này. Cuối cùng, chúng tôi Rifflekhoảng trống vào mỗi hàng, Appendmột dòng mới ở cuối và Flattenkết quả.


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

Điều này có thể không được biên dịch thành C ++, vì vậy tôi hy vọng, tôi đã không vi phạm các quy tắc :)


1. Đầu ra hiện đang sai. Cần có một khoảng trống giữa các chữ cái. 2. i=0j=0không cần thiết, vì các biến toàn cục được khởi tạo bằng không. 3. Bạn có thể sử dụng main(l,v)char**v;thay vì main(int l,char**v). 4. Nếu bạn cập nhật idưới dạng i+=puts(""), bạn có thể thoát khỏi dấu ngoặc nhọn của vòng ngoài.
Dennis

2

Perl - 90

Có thể ép thêm một số nhân vật trong số này:

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

89+ 1cho -n.

Chạy với:

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

Đầu ra:

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

2

T-SQL: 180

Lấy đầu vào từ biến @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

Điều này nhồi các ký tự đơn trong / giảm dần từ đầu và cuối thành một chuỗi khoảng trắng.

Kết quả kiểm tra

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 

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

Đầu ra:

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


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`
`

CHỈNH SỬA : -1 Cảm ơn Joe King. Tôi không thấy TIO cung cấp dán trực tiếp được định dạng sẵn cho CG.

Hãy thử trực tuyến!


btw, mã thừa để thực thi mã trong TIO có thể đi trong phần chân trang của chương trình. Điều này giúp xác định số byte chính xác và sử dụng định dạng câu trả lời PPCG tự động trơn tru hơn. ví dụ: Hãy thử trực tuyến!
Jo King

-i-1có thể+~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);
}

Lưu 11 nhân vật quý giá với t+=i==j?s[i]:i==n-j-1?s[n-i-1]:"";.
sampathsris

Bạn có thể loại bỏ những dòng mới?
Zacharý


1

Cho dù bao lâu, luôn có câu trả lời trong ...

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

Ung dung:

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

Đầu ra, được thực hiện một cách tệ hại, là:

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

Đã thêm import java.util.Scannermã bên trong bởi vì tôi không bao giờ nhớ nếu nhập khẩu được tính vào số byte ... Chết tiệt, tôi thực sự rất thích điều này.


2
Nhập khẩu làm tính. Điều này một phần là do cú pháp nhập và bí danh của Python: from math import floor as fhơi gian lận

Bạn sẽ có thể lưu một loạt các ký tự bằng cách kết hợp tất cả các System.out.printcuộc gọi thành một, sử dụng một vài toán tử tạm thời.
DLosc

@DLosc Bạn có thể cho tôi một vài ví dụ?
Rodolfo Dias

1
Vâng, thực sự câu trả lời của Geobits là một ví dụ hoàn hảo - xem nội dung System.out.printcuộc gọi ở cuối.
DLosc

1
@RodolfoDias Đừng cảm thấy như vậy. Một vài môn đánh gôn đầu tiên của tôi ở Java rất tệ và tôi vẫn có thể thường xuyên cạo sạch một "bản sửa đổi đầu tiên" nếu tôi trông đủ cứng;)
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");};}}

Hoặc, là "Chính () chỉ":

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");};}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.