ตัวละครข้าม


31

ฉันคาดหวังว่าจะโพสต์สิ่งที่ซับซ้อนกว่าเดิมเป็นปริศนาตัวแรกใน PCG แต่โดยเฉพาะคำถามการบ้านใน Stack Overflow เป็นแรงบันดาลใจให้ฉันโพสต์สิ่งนี้ พวกเขาต้องการ:

พิมพ์รูปแบบต่อไปนี้สำหรับคำที่ระบุที่มีจำนวนตัวอักษรแปลก

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


ขอให้สังเกตว่าตัวอักษรเป็นอัศวินที่เคลื่อนไหวในรูปแบบที่คุณต้องการพิมพ์ ดังนั้นคอลัมน์อื่น ๆ จะว่างเปล่า - (ขอบคุณxnor ที่ชี้เรื่องนี้ออกมา)

กฎระเบียบ

  1. ห้ามใช้ C ++ เพราะฉันอาจเชื่อมโยงคำถามนี้ที่นั่น
  2. คุณอาจใช้stdoutหรือวิธีการใด ๆ ในการส่งออกสตริง (เช่นalert()ใน JavaScript)
  3. เช่นเคยรหัสสั้นที่สุดชนะ

2
นี่คือในโพสต์ที่เกี่ยวข้องในกองล้น: stackoverflow.com/q/5508110
ระดับแม่น้ำเซนต์

2
@ flawr ฉันคิดว่ามันหมายถึงแปลกเพราะไม่ใช่เลขคู่
NinjaBearMonkey

31
พระเจ้าฉันโง่ฉันคิดว่ามันเป็นตัวย่อของนักวิทยาศาสตร์คอมพิวเตอร์ที่คลุมเครือ =)
ข้อบกพร่อง

2
@jpjacobs: ไบต์เว้นแต่คำถามจะระบุไว้เป็นอย่างอื่นอย่างชัดเจน
เดนนิส

2
โปรแกรมทั้งหมดหรือเพียงแค่ฟังก์ชั่น? (สมาร์ทที่แท้จริงของฉันที่จะตอบก่อนและทำคำถามนี้ในภายหลัง ... )
Rodolfo Dias

คำตอบ:


13

Pyth , 22

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

ทดสอบ:

$ 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

คำอธิบาย:

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

ไม่มีบิตเสริมใน Pyth หรือไม่?
xnor

@xnor ไม่ แต่มันไม่ช่วยอะไร สมมติว่าระดับ~บิตไม่ใช่ใน Pyth จากนั้นเราสามารถเปลี่ยนt-lzdเป็น+lz~d- ยัง 5 ตัวอักษร
isaacg

Vzเป็นเคล็ดลับที่เรียบร้อย: ฉันไม่รู้ว่ามันU<string>ให้range(len(<string>))อะไร
FryAmTheEggman

ใช่มันเป็นคุณสมบัติที่ดี ทำงานในรายการด้วยเช่นกัน แต่ไม่จำเป็นต้องมีสิ่งอันดับ แก้ไข: โอ๊ะโอเอกสารที่ขาดหายไป ฉันจะเพิ่ม ขอโทษ
isaacg

20

APL ( 37 35 34 27)

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

ใช้อินพุตจากคีย์บอร์ดเช่น:

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

7
upvotes ของฉันทั้งหมดเป็นของ APL
นิตย์

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)

การป้อนข้อมูล:

"CODE-GOLF"

เอาท์พุท:

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

ฉันแค่เขียนสิ่งเดียวกัน i in[j,L+~j]ปรับปรุงหนึ่งของฉันคือ
xnor

@xnor: พบสภาพที่สั้นกว่า ;)
Falko

ฉลาด. คุณยังสามารถทำL+~jแม้ว่า
xnor

@xnor: อาคุณพูดถูก ฉันลืม+~เคล็ดลับเสมอ...
Falko

คุณfor i in R:print" ".join([s[j]," "][j!=i!=L+~j]for j in R)ช่วยประหยัดถ่านได้ไหม? (ตอนนี้ฉันไม่สามารถเข้าถึง Python 2 เพื่อทดสอบได้)
xnor

11

Python 3: 75 ตัวอักษร

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

สำหรับบรรทัดiเราเริ่มต้นด้วยรายการช่องว่างและตั้งค่ารายการiจากด้านหน้าและด้านหลังให้เท่ากับตัวอักษรของสตริงอินพุต จากนั้นเราจะพิมพ์ผลลัพธ์

สตริง Python ไม่สามารถเปลี่ยนได้ดังนั้นaจะต้องเป็นรายการอักขระแทน รายการaจะต้องเริ่มต้นได้ภายในลูปมิฉะนั้นการแก้ไขจะดำเนินการระหว่างลูป เราใช้print(*a)พิมพ์อักขระแต่ละตัวในรายการเว้นวรรคซึ่งต้องใช้ Python 3

บรรทัดเอาต์พุตมีความสมมาตรดังนั้นเราสามารถiนับถอยหลังได้มากกว่าใช้ลูป while

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

นอกจากนี้ยังใช้งานได้กับตัวอักษรจำนวนคู่

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

การแปลงเป็น Pyth ฉันได้VlzJ*]dlz=@JN@zN=@Jt_N@_zNjdJ29 ไบต์ซึ่งฉันเดาว่าฉันต้องลองอย่างอื่นเพื่อเอาชนะ APL นอกจากนี้ +1 เพื่อพิสูจน์ว่า Python 3 สามารถออกสนามกอล์ฟ Python 2 (บางครั้ง)
FryAmTheEggman

@fry Python 3 มักจะเล่นกอล์ฟ 2 ในประสบการณ์ของฉัน len("raw_input()") + len("print ") > len("input()") + len("print()")แม้ว่าไม่มีอะไรเปลี่ยนแปลงอื่นใดความท้าทายมากที่สุดให้หนึ่งในการป้อนข้อมูลและคาดว่าหนึ่งในการส่งออกและ
undergroundmonorail

@undergroundmonorail ปัญหาก็คือinput() มันยังใช้ได้ใน python 2 (มันทำหน้าที่แตกต่างกันบ้าง) ดังนั้นถ้าอินพุตสำหรับการท้าทายค่อนข้างเข้มงวด python 2 มักจะชนะ
FryAmTheEggman

ว้าวแม้ใช้ Python 2 และprint" ".join(a)รหัสของคุณก็สั้นกว่า (82) มากกว่าของฉัน
Falko

@FryAmTheEggman ดูคำตอบของฉัน - เป็นการปรับคำตอบแบบหลามอื่น ๆ และมันสั้นกว่า APL มาก Pyth ไม่ชอบการกำหนดให้กับดัชนี แต่น่าเสียดายที่
isaacg

8

CJam, 27 25 ไบต์

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

ลองออนไลน์

ตัวอย่างการวิ่ง

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

เป็นตัวอย่างในคำตอบแต่ละบรรทัดมีช่องว่างต่อท้าย

มันทำงานอย่างไร

                             " 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
ขออภัยที่นี่เป็นคำตอบที่ยอดเยี่ยม! ความคิดเห็น แต่ฉันต้องบอกว่ามันจะไม่เคยเกิดขึ้นกับฉันในการสร้างกล่องโดยคอลัมน์แทนที่จะเป็นแถว
FryAmTheEggman

4

Java - 168

การวนซ้ำง่าย ๆ ไม่มีอะไรพิเศษเกิดขึ้นที่นี่

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

ด้วยตัวแบ่งบรรทัด:

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

Pure Bash ขนาด 94 ไบต์

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
การt%lคำนวณมากเกินไป บันทึกในการใช้งานครั้งแรกกับตัวแปร((x=t%l))จากนั้นใช้ตัวแปรเพื่อลดให้เหลือ 94 อักขระ
จัดการ

อ่าใช่ฉันได้ทำสิ่งนี้มานานx=t%lแล้วy=t/lและมันก็นานกว่านั้น ... ฉันไม่ได้ตั้งใจที่จะใช้ x เท่านั้น
Digital Trauma

4

ทับทิม, 64

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

คำอธิบาย

  • อินพุตถูกใช้เป็นอาร์กิวเมนต์สำหรับแลมบ์ดา Stringมันคาดว่า
  • ในวงที่วนลูปรางตัวละครทุกตัวในคำ ( nรวม):
    • สร้าง String ที่ประกอบด้วยnช่องว่าง
    • แทนที่ช่องว่างith และn-ith ( ~iขอบคุณ xnor) ด้วยอักขระ th iและn-ith ของอินพุต
    • พิมพ์บรรทัด

7
ขอแสดงความยินดีกับการโพสต์คำตอบที่ 25,000! :) (ที่จริงแล้วฉันไม่แน่ใจ 100% นี่เป็นอันเนื่องจากแคช แต่มันเป็นคำตอบล่าสุดเมื่อฉันเห็น "25,000 คำตอบ" ครั้งแรกในสถิติของเว็บไซต์)
Martin Ender

2
คุณสามารถทำอะไรเป็นส่วนประกอบบิต-i-1 ~i
xnor

มันฉลาดมากขอบคุณ!
britishtea

2
ด้วยวิธีนี้ดูเหมือนว่าจะเป็นประโยชน์ในการใช้ stdin แทนแลมบ์ดา: gets.size.times{|x|u=?\s*~/$/;u[x]=$_[x];u[~x]=$_[~x];puts u}(สมมติว่าอินพุตไม่ได้ถูกยกเลิกโดยบรรทัดใหม่เช่นecho -n CODE-GOLF) จากนั้นหนึ่งสามารถใช้ประโยชน์เพิ่มเติม.charsเพื่อบันทึกอักขระอื่น:x=0;gets.chars{|r|u=?\s*~/$/;u[x]=r;u[~x]=$_[-x+=1];puts u}
Ventero

4

JavaScript (E6) 101 95 129 136

แก้ไขการเว้นวรรคตัวอักษรผิด คงที่
แก้ไขเรียบง่ายและสั้นลงโดยใช้แบบคลาสสิคสำหรับลูป
ในฐานะที่เป็นฟังก์ชั่นให้ส่งออกผ่านป๊อปอัป

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

รุ่นก่อนหน้าโดยใช้. 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'))

ทดสอบในคอนโซล FireFox / FireBug

F('Java-Script')

เอาท์พุต

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

2
สิ่งนี้มีระยะห่างในแนวนอนไม่เพียงพอ - ควรมีคอลัมน์ของช่องว่างทั้งหมดระหว่างแต่ละคอลัมน์ด้วยตัวอักษร
isaacg

4

Befunge-93, 68 71

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

คุณสามารถทดสอบได้ที่นี่ มันจะเกิดขึ้นกับกล่องโต้ตอบการป้อนข้อมูลในแต่ละผ่าน~ ; ป้อนคำของคุณทีละตัวอักษร (มันบอกว่าการป้อนข้อมูลคือ 'klunky' หลังจากทั้งหมด) ลงท้ายด้วยช่องว่าง

มันจะไม่พิมพ์ไปที่คอนโซล สิ่งนี้จะไม่ใช่ Befunge โดยปราศจากการดัดแปลงตนเองหลังจากทั้งหมด! แต่จะแก้ไขกริดของตนเองเพื่อแสดงข้อความ หลังจากเสร็จสิ้นแล้วกริดจะมีลักษณะดังนี้:

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

(สังเกตการเสียสละอันสูงส่งของเซลล์ที่ (0,0) หลังจากที่เรารู้ว่าตัวชี้จะไม่ไปที่นั่นอีกต่อไปเพื่อจุดประสงค์ในการเก็บชิ้นส่วนของข้อมูล)

มันยังทำงานได้กับอินพุตที่มีความยาวเท่ากัน โปรดทราบว่าเนื่องจาก Befunge-93 ถูก จำกัด ไว้ที่ตาราง 80x25 ขนาดอินพุตจะถูก จำกัด ไว้ที่ 21 ตัวอักษรหากคุณเรียกใช้ในล่าม Befunge-93 เรียกใช้ในฐานะ Befunge-98 ควรลบขีด จำกัด นี้

แก้ไข - ตอนนี้มันทำงานได้มากขึ้นตามบรรทัดของผลลัพธ์ที่ต้องการโดยใช้ความยาวเพียงสามอักขระ


โปรดทราบว่าตัวอักษรจะถูกคั่นด้วยคอลัมน์ว่าง ตัวอักษรมีรูปร่างค่อนข้าง L
sampathsris

Drats! สิ่งที่ซับซ้อนค่อนข้างมีนัยสำคัญ ฉันคิดว่าฉันสามารถกอบกู้สิ่งนี้ได้ แต่มันจะเพิ่มขนาดสิ้นสุด ... ดี
Kasran

4

Javascript 102 84 85 85

แก้ไข: ต้องแก้ไขระยะห่าง ไม่เล็กอีกต่อไป

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

สิ่งนี้มีระยะห่างแนวนอนไม่เพียงพอ
เดนนิส

1
ว้าวสั้นกว่าของฉันและไม่ได้ใช้ ES6 +1
Scimonster

ดีกว่า แต่ระยะห่างยังคงผิด (ดูที่ X) นอกจากนี้หากคำถามไม่ได้ระบุไว้เป็นอย่างอื่นคุณควรเขียนโปรแกรมหรือฟังก์ชั่น ตัวอย่างที่มีตัวแปร hardcoded มักจะขมวดคิ้วอยู่
เดนนิส

1
และfunction(s)คุณทำไม่ได้เพราะคุณไม่ได้เงินคืนใช่ไหม
Zacharý

3

CJam, 38 36 35 34 32 ไบต์

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

ทดสอบที่นี่คำนี้อ่านคำที่ป้อนจาก STDIN นอกจากนี้ยังใช้งานได้กับจำนวนอักขระ สิ่งนี้พิมพ์คอลัมน์ของช่องว่างต่อท้าย แต่ฉันไม่เห็นสิ่งใดในกฎที่ขัดกัน

คำอธิบาย

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

เนื้อหาของสแต็กจะถูกพิมพ์โดยอัตโนมัติเมื่อสิ้นสุดโปรแกรม


CJam ที่รักของฉันคุณเพิ่งถูกโจมตีโดย APL ^ _ ^
vaxquis

@ vaxquis ฉันรู้สึกประหลาดใจที่ฉันสามารถเอาชนะมันได้สองครั้งตั้งแต่แรก ดูเหมือนว่าปัญหานี้เหมาะกับ APL และ co มากกว่าภาษาแบบกองซ้อน
Martin Ender

2
อย่างน้อยก็ง่ายกว่าที่จะเขียนl:I,,_f{f{_2$=@2$+I,(=|\I=S?S}N}บนผ้าเช็ดปากมากกว่า↑{∊2↑¨⍵↑¨I}¨↓(+∨⌽)∘.=⍨⍳⍴I←⍞... หัวเราะหึๆ
vaxquis

มีคนอื่นจัดการเอาชนะฉันด้วย CJam และฉันไม่สามารถทำให้โปรแกรมของฉันสั้นลงได้ดังนั้น CJam จึงเอาชนะฉันในที่สุด (แต่ Pyth ได้รับมงกุฎ) (นั่นคือ @vaxquis, APL นั้นอ่านง่ายกว่าภาษาอื่น ๆ ส่วนใหญ่ที่ใช้ในที่นี้แน่นอนเมื่อคุณรู้จักตัวละคร 60 ตัวหรือมากกว่านั้นและแน่นอนเมื่อเทียบกับ Pyth หรือ CJam หรือ แม้แต่ J. )
marinus

3

C, 105

สองวิธีที่แตกต่างกันเล็กน้อยในการทำมัน

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

หากคุณต้องการเพิ่มช่องว่างให้แทนที่putchar(ด้วยprintf(" %c",ตัวอักษรพิเศษ 5 ตัว


3

J - 36 30 ไบต์:

แก้ไข: 6 ตัวอักษรสั้นหน่วยกิตไป @algorithmshark

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

เช่น:

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

โบนัส: ทำงานร่วมกับสตริงที่มีความยาวได้:

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

3

Prolog - 240 ไบต์

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

ภาวนา:

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

อ่านได้:

:- 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 ไบต์

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

ลองออนไลน์!

บรรทัดที่ 1 อ่านสตริงอินพุตแยกออกเป็นตัวอักษรจัดเก็บความยาวและสร้างเมทริกซ์ด้วยคำบนเส้นทแยงมุมหลัก - ตัวอักษรของคำจะถูกวางลงบนเมทริกซ์เอกลักษณ์ (และทำซ้ำตามค่าเริ่มต้นเพื่อให้ตรงกับความยาว) 1 ถูกเก็บรักษาไว้ส่วนอื่นถูกแทนที่ด้วยช่องว่าง

บรรทัดที่ 2 พิมพ์เมทริกซ์ที่เกิดขึ้นจากองค์ประกอบของเมทริกซ์แนวทแยงมุมหรือเวอร์ชันที่มิเรอร์ในแนวนอน

−2 + 1 = −1 ไบต์ขอบคุณJayCe

by4 ไบต์ขอบคุณGiuseppe


1
หวาน! และคำอธิบายที่ดีคุณสามารถบันทึก 2 ไบต์
JayCe

1
ดูเขาคำตอบอื่น ๆ และคำถาม - ดูเหมือนว่าเมทริกซ์ควรมีขนาดใหญ่ขึ้น (พื้นที่เพิ่มเติม) - ผลลัพธ์ไม่ควรเป็นเมทริกซ์
จตุรัส

@ JayCe ขอบคุณสำหรับ 2 ไบต์! และขอบคุณสำหรับความคิดเห็นเกี่ยวกับการจัดรูปแบบคุณอาจจะถูก (แม้ว่ากฎอาจจะชัดเจนเกี่ยวกับเรื่องนี้) โชคดีที่ทุกอย่างที่ต้องการคือการเว้นช่องว่างในตัวคั่นในขณะที่พิมพ์
Robert Hacken

89 bytes ใช้pmaxและ inline งานเพิ่มเติมบางส่วน
จูเซปเป้

@iuseppe ขอบคุณ! น่าเศร้าที่ยังคงไม่พอที่จะเอาชนะJ.Doe 's วิธีการแก้ปัญหา
โรเบิร์ตฮัคเค่น

2

C # ( 214) 212)

(ไม่ดีอย่างแน่นอน) เวอร์ชัน Golfed:

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

เวอร์ชันที่ไม่ถูกปรับแต่ง:

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

ยินดีต้อนรับคำแนะนำเคล็ดลับกลอุบายหรือคำพูดใด ๆ เนื่องจากเป็นความพยายามครั้งแรกของฉันที่ CodeGolf ฉันแค่อยากลองแม้ว่าฉันรู้ว่าความยาว C # ไบต์ของฉันจะไม่ได้ใกล้เคียงกับการแก้ปัญหาที่ดีที่สุดสองเท่า;)

แล้วคุณนับจำนวนไบต์ของคุณได้อย่างไร .Lengthฉันเพียงแค่โพสต์ดังกล่าวข้างต้นเป็นอย่างรวดเร็วดูหน้าต่างและทำ ฉันสามารถเขียนโปรแกรมเล็ก ๆ เพื่อนับจำนวนไบต์ให้ฉันได้ แต่ฉันคิดว่ามันมีวิธีที่ง่ายกว่าที่ฉันยังไม่รู้


for(;i < l;i++)คุณสามารถบันทึกไบต์ที่สองโดยการลบช่องว่างใน
เบต้า

นอกจากนี้ฉันใช้สิ่งนี้เพื่อนับจำนวนไบต์
เบต้า

@BetaDecay อ่าดีฉันต้องมองข้ามสิ่งเหล่านั้น และขอบคุณสำหรับลิงค์!
InvisiblePanda

2

JavaScript (ES6) - 185 177 175 170 ไบต์

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

วางสิ่งนี้ไว้ในคอนโซล Firefox และเรียกใช้เป็น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

2

Mathematica, 149 ไบต์

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

อินพุตถูกส่งผ่านเป็นพารามิเตอร์ไปยังฟังก์ชัน ฟังก์ชันส่งคืนสตริงเอาต์พุต มีการขึ้นบรรทัดใหม่ที่ท้ายของเอาต์พุต

คำอธิบาย: เราสร้างเมทริกซ์ทแยงมุมด้วยสตริงจากนั้นเราสร้างสำเนาของมันพลิกแนวตั้งโดยใช้Reverse@#เพื่อย้อนกลับแถว จากนั้นเรามีเมทริกซ์ที่สามของขนาดเดียวกันที่มีเพียง 32 (พื้นที่ ASCII) เราใช้MapThreadเพื่อให้ได้องค์ประกอบที่ชาญฉลาดของ 3 เมทริกซ์เหล่านี้ สุดท้ายเราจะRiffleเว้นช่องว่างเข้าไปในแต่ละแถวขึ้นAppendบรรทัดใหม่ที่ส่วนท้ายและFlattenผลลัพธ์


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

สิ่งนี้อาจไม่ได้รวบรวมเป็น C ++ ดังนั้นฉันหวังว่าฉันไม่ได้ละเมิดกฎ :)


1. การส่งออกผิดปกติ ควรมีช่องว่างระหว่างตัวอักษร 2. i=0และj=0ไม่จำเป็นเนื่องจากตัวแปรโกลบอลถูกกำหนดค่าเริ่มต้นเป็นศูนย์ 3. คุณสามารถใช้แทนmain(l,v)char**v; main(int l,char**v)4. หากคุณอัปเดตiเป็นi+=puts("")คุณสามารถกำจัดวงเล็บปีกกาของวงนอกได้
Dennis

2

Perl - 90

อาจเป็นไปได้ที่จะบีบอักขระเพิ่มจากนี้:

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

89+ สำหรับ1-n

ทำงานด้วย:

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

เอาท์พุท:

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

2

T-SQL: 180

การรับอินพุตจากตัวแปร @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

สิ่งนี้บรรจุอักขระเดี่ยวใน / decrementing จากจุดเริ่มต้นและสิ้นสุดลงในสตริงของช่องว่าง

ผลการทดสอบ

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

ขาออก:

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


2

JavaScript (Node.js) , 81 ไบต์

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

แก้ไข : -1 ขอบคุณ Joe King ฉันไม่เห็น TIO ให้วางโดยตรงที่ฟอร์แมตไว้ล่วงหน้าสำหรับ CG

ลองออนไลน์!


btw รหัสส่วนเกินในการเรียกใช้รหัสใน TIO สามารถไปที่ส่วนท้ายของโปรแกรม สิ่งนี้จะช่วยกำหนดจำนวนไบต์ที่ถูกต้องและใช้รูปแบบคำตอบ PPCG อัตโนมัติได้อย่างราบรื่นยิ่งขึ้น เช่นลองออนไลน์!
โจคิง

-i-1สามารถ+~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);
}

บันทึกตัวอักษรที่มีค่า t+=i==j?s[i]:i==n-j-1?s[n-i-1]:"";11
sampathsris

คุณสามารถลบบรรทัดใหม่เหล่านั้นได้หรือไม่
Zacharý


1

ไม่ว่าจะนานแค่ไหนก็ต้องมีคำตอบเสมอ ...

Java - 289 234 ไบต์

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

เอาท์พุททำเสร็จแล้วคือ:

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

เพิ่มimport java.util.Scannerโค้ดด้านในเพราะฉันจำไม่ได้ว่าการนำเข้านับเป็นจำนวนไบต์หรือไม่ ...ประณามฉันดูดสิ่งนี้จริงๆ


2
นำเข้านับ ส่วนหนึ่งเป็นเพราะไวยากรณ์การนำเข้าและนามแฝงของ Python: from math import floor as fซึ่งเป็นสูตรโกงเล็กน้อย

คุณควรบันทึกอักขระจำนวนมากโดยรวมการSystem.out.printโทรทั้งหมดเข้าด้วยกันโดยใช้โอเปอร์เรเตอร์สองสามตัว
DLosc

@DLosc คุณช่วยยกตัวอย่างให้ฉันได้ไหม
Rodolfo Dias

1
ใช่คำตอบของ Geobitsเป็นตัวอย่างที่สมบูรณ์แบบ - ดูเนื้อหาของการSystem.out.printโทรในตอนท้าย
DLosc

1
@RodolfoDias อย่ารู้สึกอย่างนั้น ไม่กี่กอล์ฟครั้งแรกของฉันใน Java นั้นแย่มากและฉันยังสามารถโกนอันที่ดีออก "การแก้ไขครั้งแรก" ของฉันถ้าฉันดูยากพอ;)
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");};}}

หรือเป็น "หลัก () เท่านั้น":

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");};}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.