พิมพ์สตริงด้วยคำแนวตั้ง


12

งานของคุณคือการใส่สตริงของตัวอักษร ASCII และส่งออกสตริงเป็นชุดของคำในแนวตั้งคั่นด้วยช่องว่าง ตัวอย่างที่แสดงด้านล่าง:

รับสาย:

Hello, World! My name is Foo.

ผลลัพธ์ควรเป็น:

H W M n i F
e o y a s o
l r   m   o
l l   e   .
o d
, !

จะได้รับคะแนนโบนัส 10 คะแนนหากโปรแกรมของคุณจัดการสตริงที่ต้องปิดเทอร์มินัลอย่างถูกต้องซึ่งเราจะตั้งไว้ที่ 80 อักขระ

50 คะแนนหากโปรแกรมของคุณสามารถย้อนกลับได้!


ค่อนข้างคล้ายกับไขว้หน้าของข้อความ
จัดการ

3
@ การทำงาน: ฉันคิดว่ามันเป็น มันไม่เหมือนกัน - และฉันอาจโต้แย้งว่าปัญหาของฉันง่ายขึ้นเล็กน้อย
Foo Barrigno

มันไม่เหมือนกัน 100% แต่ใกล้พอที่จะนับว่าซ้ำ: การลดเพื่อให้เหมือนกันคือเพียงแทนที่แต่ละช่องว่างด้วยบรรทัดใหม่สองบรรทัด
Peter Taylor

1
@PeterTaylor: ไม่มาก ปัญหาของฉันไม่มีข้อกำหนดที่จะต้องเคารพบรรทัดใหม่ในสตริงดั้งเดิม ปัญหานั้นต้องการให้มีการแปลงบรรทัดใหม่เป็นช่องว่างและช่องว่างจะถูกแปลงเป็นสองบรรทัดใหม่ มันไม่ได้เป็นการลดลงเล็กน้อย
Foo Barrigno

คำตอบ:


10

J, 15

|:>'\S+| 'rxall

การใช้งาน:

   |:>'\S+| 'rxall 'Hello, World! My name is Foo.'
H W M n i F
e o y a s o
l r   m   o
l l   e   .
o d        
, !        

5

Javascript - 228 172 145 126

A=prompt().split(" "),B="",N=A;for(y=0;y<N.length;y++){for(i=0;i<N.length;i++){if(A[i][y]){B+=A[i][y];}else{B+=" ";}}B+="\n";}

รหัสกอล์ฟครั้งแรกของฉัน :)


มันยอดเยี่ยมสำหรับความพยายามครั้งแรกของคุณ!
Foo Barrigno

คุณควรพยายามทำให้รหัสของคุณสั้นที่สุดเท่าที่จะเป็นไปได้เช่นลบช่องว่างและ"Input ?"ไม่ส่งผลกระทบต่อการทำงานของโปรแกรม แต่อย่างใด
mniip

แก้ไขข้อบกพร่อง ควรทำงานตามที่คาดไว้ :)
Wolle Vanillebär Lutz

1
ทำงานอย่างถูกต้องในขณะนี้ แต่สิ่งเล็กน้อย: ไม่จำเป็นสำหรับตัวแปร N, เก็บอาเรย์lengthแทนการถามสองครั้ง, วงเล็บปีกกาไม่มีจุดหมาย, เซมิโคลอนที่ไม่จำเป็นบางอัน A=prompt().split(" "),B="";for(y=0;y<(l=A.length);y++){for(i=0;i<l;i++)if(A[i][y])B+=A[i][y];else B+="_";B+="\n"}alert(B). (ในมาตรฐานจาวาสคริปต์สำหรับคำถามเกี่ยวกับเมตาของIOความคิดเห็นที่ตกลงกันส่วนใหญ่คือการพึ่งพาเอาท์พุทโดยนัยของ REPL ไม่ควรพิจารณาว่าถูกต้อง)
manatwork

1
(ยังไม่ทดลอง) if(A[i][y]){B+=A[i][y];}else{B+=" ";}=>B+=(x=A[i][y])?x:" "
daniero

5

APL, 22

{⍉⊃⍵⊂⍨1+0,+\2≠/⍵=' '}

คำอธิบาย

{              ⍵=' '}   A. check which chars are spaces           
            2≠/         B. of that vector, which consecutive pairs are different  
          +\            C. compute the partial sums                           
      1+0,              D. insert 0 at the front and add 1 to every item
   ⍵⊂⍨                     use this vector to split the original string
 ⍉⊃                        disclose into a matrix and transpose

    'W o w   S u c h   D o g e'
A.   0 0 0 1 0 0 0 0 1 0 0 0 0
B.    0 0 1 1 0 0 0 1 1 0 0 0
C.    0 0 1 2 2 2 2 3 4 4 4 4
D.  1 1 1 2 3 3 3 3 4 5 5 5 5

ตัวอย่าง

      {⍉⊃⍵⊂⍨1+0,+\2≠/⍵=' '} 'Hello, World! My name is Foo.'
H W M n i F
e o y a s o
l r   m   o
l l   e   .
o d        
, !        

3

ทับทิม, 91 87

s=gets.split
puts s.map{|x|x.ljust(s.map(&:size).max,' ').split''}.transpose.map &:join

ไชโยฉันชนะ Perl! : D

Ruby, 150 - 50 bonus = 100

s=$<.read
n=s.index"
"
s=s.split n ?'
':' '
o=s.map{|x|x.ljust(s.map(&:size).max,' ').split''}.transpose.map &:join
puts n ?o.map(&:strip).join(' '):o

มันจะตรวจจับหาบรรทัดใหม่และใช้การจัดการพิเศษหากตรวจพบ

เรียกใช้เหมือนกัน

ruby transposegolf.rb < transposegolfinput.txt

3

จาวาสคริ 184 149 123

var a=s.split(" "),b="",c;for(c in a)b+="<div style='float:left'>"+a[c].split("").join("<br>")+"</div>";document.write(b);

ด้วยสตริงตัวอย่างที่กำหนด:

var s = "Hello, World! My name is Foo.";
var a=s.split(" "),b="",c;for(c in a)b+="<div style='float:left'>"+a[c].split("").join("<br>")+"</div>";document.write(b);

คุณสามารถคัดลอกคำสั่งที่สองไปยังคอนโซลของเบราว์เซอร์

Unminified:

var res = "Hello, World! My name is Foo.";
var t=res.split(" ");
var s ="";
for (var word in t){
    s+="<div style='float:left'>" + t[word].split("").join("<br />") + "</div>";
}
document.write(s);

ลิงก์ JsFiddle: http://jsfiddle.net/FzMvK/

รหัสโพสต์กอล์ฟครั้งแรกของฉัน: P


ทำได้ดีมาก
Foo Barrigno

@FooBarrigno อัปเดตคำตอบเพื่อรองรับการย้อนกลับ
RononDex

@FooBarrigno อัปเดตคำตอบลบการสนับสนุนกลับและเปลี่ยนลอจิกอย่างสมบูรณ์เพื่อลดจำนวนไบต์
RononDex

ฉลาดฉันชอบมัน คุณเปลี่ยนเป็นfloat:rightย้อนกลับไม่ได้ใช่ไหม
แดนนี่

2
ขึ้นอยู่กับสิ่งที่ "ย้อนกลับ" หมายถึง ถ้าตัวอักษรตัวแรกควรอยู่ด้านล่างมันจะไม่ทำงาน หากมันเป็นเพียงการย้อนกลับของคำก็ควรทำงานใช่
RononDex

2

Perl - 92 97

$_=<>;chop;@x=split$";do{print((substr$_,$q,1or$").$")for@x;$q++,print$/}while/@{['\S'x$q]}/

ทำงานได้อย่างตรงไปตรงมา


ไม่จำเป็นต้องใส่วงเล็บล้อมรอบนิพจน์ตัวดัดแปลงคำสั่ง
จัดการ

โปรดทราบว่าwhileตามที่ใช้ที่นี่เป็นตัวดัดแปลงข้อความ
จัดการ

ใช่ไหม? มันไม่ได้เป็นdo{}while()วง?
mniip

Nope doตัวเองมีอะไรอย่างอื่นเพียงบล็อก whileเป็นสิ่งที่แยกจากกัน
จัดการ

2

K, 33

{" "/:',:''x@'/:!max@#:'x:" "\:x}

ตัวอย่างอินพุตและเอาต์พุต:

k){" "/:',:''x@'/:!max@#:'x:" "\:x}"Hello, World! My name is Foo."
"H W M n i F"
"e o y a s o"
"l r   m   o"
"l l   e   ."
"o d        "
", !        "

คือ"ควรจะมี?
ดร. เบลิซาเรียส

@belisarius มันเป็นวิธีการแสดงสตริงใน k หากคุณต้องการเขียนถึง stdout โดยเฉพาะคุณสามารถทำได้ด้วย{-1@" "/:',:''x@'/:!max@#:'x:" "\:x;}(37 ตัวอักษร) ซึ่งจะให้ผลลัพธ์โดยไม่ต้องใช้"
tmartin

4
ดีฉันคิดว่าผลลัพธ์ควรเป็นสิ่งที่จำเป็นต้องใช้แม้จะมีภาษา
ดร. belisarius

2

งูหลาม:

โค้ดหนึ่งบรรทัดเพื่อดำเนินการต่อย:

import sys
m = "Hello, World! My name is Foo."

map(lambda y: sys.stdout.write(' '.join(y)+'\n'), zip(*map(lambda x: x.ljust(max(map(len,m.split()))), m.split())))

2

Python 2.7 108 103

ฉันแน่ใจว่านี่สามารถเล่นกอล์ฟได้มากกว่านี้ แต่นี่เป็นวิธีแก้ปัญหาเบื้องต้นในภาษาไพ ธ อน

w=raw_input().split();m=max(map(len,w));i=0
while i<m:print" ".join(map(lambda x:x.ljust(m)[i],w));i+=1

การปรับปรุง:

  • แยก ("") => แยก ()
  • ลบช่องว่างบางส่วนออก

งานที่ดี! หากคุณเริ่มต้นด้วยการi=mวนซ้ำไป
เรื่อย ๆ

2

F #, 187

let o=Console.ReadLine()
let s=o.Split(' ')
let m=s|>Seq.map String.length|>Seq.max
for l=0 to m-1 do
 for w in s|>Seq.map(fun x->x.PadRight(m,' ').[l])do printf"%c "w
 printfn"%s"""

2

ทับทิม, 63

$F.map(&:size).max.times{|i|puts$F.map{|s|s[i]||' '}.join' '}

ขั้นตอนวิธีนั้นตรงไปตรงมามาก golfed เท่านั้น รหัสมีความยาว 61 ไบต์บวก 2 ไบต์สำหรับ-naตัวเลือกที่จำเป็นในการทำงาน จากruby -h:

-n   assume 'while gets(); ... end' loop around your script
-a   autosplit mode with -n or -p (splits $_ into $F)

วิ่งตัวอย่าง:

$ echo 'This sentence is false' | ruby -na cols.rb
T s i f
h e s a
i n   l
s t   s
  e   e
  n    
  c    
  e

2

Python 2.7 - 137 112 ไบต์

s=raw_input().split()
for c in range(max(map(len,s))):
 for w in s:
    try:print w[c],
    except:print' ',
 print''

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

ฉันคิดวิธีที่ดีกว่าในการทำเช่นนี้และตัด 25 ไบต์ แทนที่จะใช้ช่องว่างในการเว้นช่องว่างเพื่อหลีกเลี่ยงข้อผิดพลาดของดัชนีฉันจัดการข้อผิดพลาดโดยตรง! เมื่อใดก็ตามที่มีอะไรที่จะพิมพ์พิมพ์พื้นที่เดียวในสถานที่ที่มี,try:print w[c], except:print' ',ฉันยังจำได้ว่าฉันไม่ต้องการช่องว่างระหว่างคำสั่งพิมพ์และตัวอักษรสตริงซึ่งบันทึกหนึ่งไบต์

โปรดทราบว่า Python 2 ช่วยให้คุณสามารถผสมแท็บและช่องว่างและพิจารณาระดับการเยื้องแยกกัน Markdown ล่ามของแทนที่ตัวละครแท็บที่มีสี่ช่องว่าง แต่ทุกบรรทัดของโปรแกรมนี้ยกเว้นคนแรกที่มีการเยื้องหนึ่งไบต์

การจัดรูปแบบเป็นเรื่องง่ายสวยตั้งแต่print 'something',พิมพ์มากกว่า'something ' 'something\n'ฉันทำอย่างนั้นสำหรับตัวละครแต่ละตัวและใช้printคำสั่งเปล่าเพื่อรับบรรทัดใหม่ที่ฉันต้องการ


2

C, 111 110 95 90 ไบต์

วิธีนี้ใช้รหัสควบคุม VT-100 เพื่อเลื่อนเคอร์เซอร์บนเทอร์มินัล

main(int _,char**v){char*s=*++v;printf("^[7");while(*s)' '==*s?(s++,printf("^[8^[[2C^[7")):printf("%c^[[B^H",*s++);}

^[ลำดับเป็นตัวยึดสำหรับอักขระ ASCII ESC เดียวที่ไม่สามารถแสดงที่นี่

  • ^[7 บันทึกตำแหน่งตัวชี้ปัจจุบัน
  • ^[8 กู้คืนตำแหน่งเคอร์เซอร์ไปยังตำแหน่งที่บันทึก
  • ^[[2C เลื่อนไปทางขวา 2 ขั้น
  • ^[[B ลดขั้น 1 ลง

แก้ไข 1:^[[D (ขั้นตอนที่ 1 จากซ้าย) VT-100 รหัสได้ถูกแทนที่โดย Backspace (แสดงให้เห็นว่า^Hที่นี่ แต่เป็นเพียงหนึ่งถ่าน ASCII); ยังลืมคำสั่ง "คั่นด้วยช่องว่าง" ตอนนี้แก้ไขแล้ว

แก้ไข 2:

7 ตัวอักษรที่บันทึกไว้โดยใช้forห่วงแทนwhileและ32แทน' ':

main(int _,char**v){printf("^[7");for(char*s=*++v;*s;s++)32==*s?printf("^[8^[[2C^[7"):printf("%c^[[B^H",*s);}

บันทึกอีก 8 ตัวอักษรโดยการเรียกใช้น้อยกว่าหนึ่งตัวprintf: ?:ผู้ประกอบการที่ประกอบไปด้วยตอนนี้ใช้ในprintfพารามิเตอร์

main(int _,char**v){printf("^[7");for(char*s=*++v;*s;s++)printf(32==*s?"^[8^[[2C^[7":"%c^[[B^H",*s);}

แก้ไข 3:

ได้กำจัดของตัวแปรท้องถิ่นs, การทำงานโดยตรงกับอาคาargv vมันน่าเกลียดอย่างสิ้นเชิง แต่บันทึกไว้ 4 ตัวอักษร ถูกแทนที่==ด้วย^ดังนั้นจึงเปลี่ยนตัว?:ถูกดำเนินการเพื่อประหยัด 1 char เพิ่มเติม

main(int c,char**v){printf("^[7");for(v++;**v;)printf(32^*(*v)++?"%c^[[B^H":"^[8^[[2C^[7",**v);}

การใช้

$ gcc transpose.c -o transpose --std=c99
$ ./transpose 'Hello, World! My name is Foo.'
H W M n i F
e o y a s o
l r   m   o
l l   e   .
o d
, !

เวอร์ชันที่ไม่ตีกอล์ฟ (เวอร์ชันแรก)

main (int _,char**v) {
    char*s=*++v; // init s with the address of the first letter
    printf("^[7"); // save the current cursor position
    while(*s) 
        ' '==*s ? ( /* if current char is a space */
            s++,printf("^[8^[[2C^[7") /* return to the saved location, move right, save position */
        ) : /* kind of else */
            printf("%c^[[B^H",*s++); /* print the current char, move down, move left */
}

เวอร์ชันที่ไม่ตีกอล์ฟ (เวอร์ชันล่าสุด)

main(int c,char**v) {
    printf("^[7");
    for(v++;**v;) /* v++: make v point to argv[1] */
        printf(     
            32^*(*v)++? /* test if **v is different from ' ', and make *v point to
                           the next char */
                "%c^[[B^H":         
                "^[8^[[2C^[7",      
            **v); /* this undefined behaviour (using *v and (*v)++ in the same expression)
                     works as "expected" with gcc 4.7.2 */
} 

1
ว่ารุ่นยกเลิกแข็งแรงเล่นกอล์ฟดูหวาดระแวงเช่นBefunge :)
DLosc

2

ฉันตอบคำถามนี้มานานแล้ว มันเป็นหนึ่งในการมีส่วนร่วมครั้งแรกของฉันในเว็บไซต์จริงๆแล้ว ฉันเพิ่งเจอมันอีกครั้งและรู้สึกอาย 112 ไบต์! รับไม่ได้ ดังนั้นฉันจึงถ่ายอีกครั้ง:

Python 3 - 92 ไบต์

s=input().split()
print('\n'.join(map(' '.join,zip(*[a.ljust(max(map(len,s)))for a in s]))))

ใน 109 วันนับตั้งแต่ที่ฉันโพสต์คำตอบแรกนั้นฉันชอบที่จะคิดว่าฉันมาไกล แม้แต่บางอย่างเช่นการใช้ Python 3 ที่มากกว่า 2.7 1จะไม่เกิดขึ้นกับฉัน ด้วยรหัสนี้ลงไปต่ำกว่า 100 ไบต์จิตวิญญาณของฉันสามารถพักผ่อนได้ในที่สุด

คำอธิบาย

s=input().split()

สิ่งนี้รับบรรทัดจากstdinและสร้างรายการโดยแยกออกเป็นอักขระช่องว่าง ช่องว่างเดียวที่น่าจะอยู่ในอินพุตคือช่องว่างดังนั้นบรรทัดนี้จะได้รับรายการคำ

ลองเอาบรรทัดที่สองจากด้านในออก:

                                           max(map(len,s))

mapใช้ฟังก์ชั่นและ iterable เป็นข้อโต้แย้ง มันใช้ฟังก์ชั่นกับแต่ละองค์ประกอบของ iterable และส่งกลับ iterable ใหม่ของผลลัพธ์ ที่นี่ฉันสร้าง iterable ที่มีความยาวของแต่ละคำที่ป้อน maxรับค่าสูงสุดจาก iterable นี่ทำให้เราได้คำที่ยาวที่สุดในอินพุต

                                  [a.ljust(              )for a in s]

mapความเข้าใจในรายชื่อจะคล้ายกับ มันทำบางสิ่งบางอย่างกับทุกองค์ประกอบของ iterable และส่งกลับรายการผลลัพธ์ คำในการป้อนข้อมูลทุกฉันทำบางรหัสthat_word.ljust( ย่อมาจาก "left justify" มันต้องใช้จำนวนเต็มเป็นอาร์กิวเมนต์และเพิ่มช่องว่างให้กับสตริงจนกว่าจะมีความยาว)ljust

                             zip(*                                    )

นี่เป็นกลลวงที่เรียบร้อย ในบริบทนี้*หมายถึง "unzip iterable นี้เป็นหลายอาร์กิวเมนต์" วิธีนี้zipสามารถใช้ในการแปลงเมทริกซ์ (เช่นzip(*[(1,2),(3,4)])-> [(1,3),(2,4)]) ข้อ จำกัด เพียงอย่างเดียวคือแถวทั้งหมดในเมทริกซ์จะต้องมีความยาวเท่ากันหรือองค์ประกอบจากทุกแถว แต่ที่สั้นที่สุดจะถูกตัดออกเพื่อให้ตรง

                map(' '.join,                                          )

เรารู้แล้วว่าmapทำอะไร สิ่งใหม่เพียงอย่างเดียวที่นี่คือjoinซึ่งใช้การวนซ้ำของสตริงและทำให้เป็นสตริงเดี่ยวโดยใช้ตัวคั่นที่เชื่อมต่อ ยกตัวอย่างเช่น'a'.join(['I', 'can', 'play', 'the', 'saxophone'])2Iacanaplayatheasaxophoneกลายเป็น

print('\n'.join(                                                        ))

การดำเนินการนี้joinจะใช้สตริงจำนวนหนึ่งและคั่นด้วยบรรทัดใหม่ สิ่งที่เหลือคือการprintไปstdoutและเรากำลังทำ!

ด้วยกันทั้งหมด:

print('\n'.join(map(' '.join,zip(*[a.ljust(max(map(len,s)))for a in s]))))

ค้นหาความยาวของคำที่ยาวที่สุดจากอินพุตต่อท้ายช่องว่างทุกคำจนกว่าจะมีความยาวเท่ากันแปลงด้วยzip(*3เคล็ดลับใช้joinเพื่อแยกอักขระแต่ละตัวในแถวที่มีช่องว่างjoinอีกครั้งเพื่อแยกแต่ละบรรทัดด้วยบรรทัดใหม่ และพิมพ์! ไม่เลวสำหรับสายที่ไม่จัดการอินพุตในโปรแกรม 92 ไบต์


1. ตัวละครพิเศษที่ใช้ในprint()วงเล็บ 's จะนิเวศโดย 4 ตัวละครผมลดลงจาก->raw_input() 2. ฉันเล่นแซ็กโซโฟนไม่ได้จริง ๆ 3 . ไม่เป็นไรinput()

)


2
ฉันไม่รู้ว่าทำไมนี่คือ CW ฉันอาจกดปุ่มโดยไม่ตั้งใจ โอ้ดี
undergroundmonorail

คุณสามารถเปลี่ยนไปprint("\n".join(...)) ลองออนไลน์! *map(print,...),
Jo King

2

05AB1Eคะแนน8 -20 -21 ( 30 29 ไบต์ - 50 โบนัส):

|Dgi#ζεSðý}»}ë¹ε2ô€¬}ζJεðÜ}ðý

ลองออนไลน์ (อินพุตบรรทัดเดียวแบบปกติ)
ลองออนไลน์ (อินพุตแบบย้อนกลับหลายบรรทัด)

คำอธิบาย:

|                     # Take the input split on newlines:
                      #  i.e. 'This is a test' → ['This is a test']
                      #  i.e. 'T i a t\nh s   e\ni     s\ns     t'
                      #    → ['T i a t','h s   e','i     s','s     t']
 Dg                   #  Duplicate this list, and take the length
                      #   i.e. ['This is a test'] → 1
                      #   i.e. ['T i a t','h s   e','i     s','s     t'] → 4
   i         }        # If the length is exactly 1:
    ¹                 #  Take the input again 
     #                #  Split the input-string by spaces
                      #   i.e. 'This is a test' → ['This','is','a','test']
      ζ               #  Zip with space-filler: Swap all rows and columns
                      #   i.e. ['This','is','a','test'] → ['Tiat','hs e','i  s','s  t']
       ε   }          #  For each item:
        S             #   Convert the item to a list of characters
                      #    i.e. 'Tiat' → ['T','i','a','t']
         ðý           #   Join them by a single space
                      #    i.e. ['T','i','a','t'] → 'T i a t'
            »         #  Join the result by newlines (and output implicitly)
    ë                 # Else:
     ε    }           #  For each item:
      2ô              #   Split it into chunks of two characters
                      #    i.e. 'h s   e' → ['h ','s ','  ','e']
        €¬            #   Take the head (first character) of each:
                      #    i.e. ['h ','s ','  ','e'] → ['h','s',' ','e']
           ζ          #  Zip with space-filler: Swap all rows and columns
                      #   i.e. [['T','i','a','t'],['h','s',' ','e'],['i',' ',' ','s'],['s',' ',' ','t']]
                      #     → [['T','h','i','s'],['i','s',' ',' '],['a',' ',' ',' '],['t','e','s','t']]
            J         #  Join each inner list to a single string
                      #   i.e. [['T','h','i','s'],['i','s',' ',' '],['a',' ',' ',' '],['t','e','s','t']]
                      #     → ['This','is  ','a   ','test']
             ε  }     #  For each item:
              ðÜ      #   Remove any trailing spaces
                      #    i.e. 'is  ' → 'is'
                 ðý   #  Join the items by a single space (and output implicitly)

คำตอบ 8 ไบต์เดิม:

#ζεSðý}»

ลองออนไลน์

คำอธิบาย:

#           # Split the input-string by spaces
            #  i.e. 'This is a test' → ['This','is','a','test']
 ζ          # Zip with space-filler: Swap all rows and columns
            #  i.e. ['This','is','a','test'] → ['Tiat','hs e','i  s','s  t']
  ε   }     # For each item:
   S        #  Convert the item to a list of characters
            #   i.e. 'Tiat' → ['T','i','a','t']
    ðý      #  Join them by a single space
            #   i.e. ['T','i','a','t'] → 'T i a t'
       »    # Join the result by newlines (and output implicitly)

1

Mathematica 49

Mathematica ชัดเจนไม่ดีที่สุดสำหรับอันนี้:

Grid[PadRight@Characters@StringSplit@s^T]/. 0->" "

กราฟิกทางคณิตศาสตร์

หมายเหตุ^T(transpose) เป็นถ่านตัวเดียว (ฉันไม่สามารถหารหัสถ่านที่ถูกต้องได้ในตอนนี้)


1

Javascript, 141

a=prompt().split(' '),c=0,d=a.map(function(a){b=a.length;c=c<b?b:c});for(j=0;j<c;j++){b='';for(i in a)b+=a[i][j]?a[i][j]:' ';console.log(b);}

ตัวอย่าง

hello, world! this is code golf

hwticg
eohsoo
lri dl
lls ef
od    
,! 

1

GolfScript [41 ไบต์]

' '%:x{.,x{,}%$-1=-abs' '*+}%zip{' '*}%n*

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

' '%:x          split text into words and store array in 'x'
{               for each word in the array:
    .,              from word's length
    x{,}%$-1=-      substract the length of the longest word in 'x'
    abs             get absolute value (maybe there is a shorter way?)
    ' '*+           add corresponding number of spaces
}%
zip{' '*}%      transpose array of words and add spaces between letters
n*              join words with a new line character

คุณอาจจะเห็นการสาธิตออนไลน์ที่นี่

PS:นี่เป็นรหัส GolfScript แรกของฉันดังนั้นอย่าตัดสินฉันอย่างเคร่งครัด;)



1

Bash + coreutils, 54

eval paste `printf " <(fold -w1<<<%s)" $@`|expand -t2

เอาท์พุท:

$ ./transpose.sh สวัสดีโลก! ฉันชื่อฟู
HWM ni F
eoyaso
lrmo
lle
od       
,!       
$ 

คำแนะนำสำหรับการอัปเดต: backticks สำหรับการทดแทนคำสั่งถูกคิดค่าเสื่อมราคา การใช้$()โครงสร้างตอนนี้เป็นวิธีการทั่วไปสำหรับการทดแทนคำสั่ง
Yokai

@Yokai - นี่คือรหัสกอล์ฟ - ที่นี่เรากำลังปรับให้เหมาะสมสำหรับความยาวของรหัสไม่ใช่สำหรับมาตรฐาน / แนวปฏิบัติที่ดีที่สุด codegolf.stackexchange.com/a/25572/11259
บาดเจ็บทางดิจิตอล

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

1

APL: 18

⍉↑1↓¨a⊂⍨' '=a←' ',

คำอธิบาย:

← '' ใส่ช่องว่างด้านหน้าของสตริงและกำหนดให้กับ

'' = ค้นหาช่องว่างสร้างบูลีน

1 ⊂⍨¨a⊂⍨สร้างสตริงเริ่มต้นโดยที่บูลีนมี 1 และวางองค์ประกอบแรกของแต่ละรายการ (ดังนั้นพื้นที่)

↑↑ทำเมทริกซ์ออกจากวัสดุพิมพ์ที่ได้และกลับด้านตามแนวทแยงมุม


1

R , 81 ไบต์

บันทึกไบต์ขึ้นบรรทัดใหม่โดยการจัดเก็บเป็นeซึ่งสามารถนำมาใช้ทั้งในการโทรสายเปรียบเทียบและscancat

w=scan(,e,t=scan(,e<-"
"));while(any((s=substr(w,F<-F+1,F))>e))cat(pmax(" ",s),e)

ลองออนไลน์!


1

K (oK) 26 ไบต์

วิธีการแก้:

`0:{" "/'+(|/#:'x)$x}@" "\

ลองออนไลน์!

คำอธิบาย:

`0:{" "/'+(|/#:'x)$x}@" "\ / the solution
                      " "\ / split input on whitespace
   {                }@     / apply (@) lambda
                  $x       / pad ($) input (x)
          (      )         / do this together
             #:'x          / count (#:) each (')
           |/              / max
         +                 / transpose / flip
    " "/'                  / join each with whitespace
`0:                        / print to stdout

0

Python 2.7 - 119 106

ใช้เวลา 1 - 166. การกลับรายการจำเป็นต้องใช้เพื่อให้ป๊อปทำงานตามลำดับที่ฉันต้องการ แต่ดูเหมือนว่าจะสิ้นเปลือง และเมื่อฉันพยายามที่จะรวมเข้าเป็นหนึ่งเดียวเพื่อความสนุกป๊อปทำให้เรื่องวุ่นวายขึ้น

w=raw_input().split(' ');l=max([len(l) for l in w]);
q=[list(p)[::-1]for p in w]+[['\n']*l]
t=[' '+(v.pop() if v else' ')for i in range(l)for v in q]
print ''.join(t)

ใช้เวลา 2 - 119 ดังนั้นฉันจึงเปลี่ยนเป็นการทำดัชนีรายการแบบง่าย ยังคงดูเหมือนว่า clunky โดยเฉพาะอย่างยิ่งการเว้นช่องว่างและบรรทัดใหม่

w=raw_input().split(' ');l=max([len(l)for l in w]);print''.join([' '+(v+' '*l)[i]for i in range(l)for v in w+['\n'*l]])

ใช้เวลา 3 - ขอบคุณ @grc

w=raw_input().split();l=max(map(len,w));print''.join(' '+(v+' '*l)[i]for i in range(l)for v in w+['\n'*l])

2
[len(l)for l in w]สามารถลงไปmap(len,w), .split(' ')การ.split()และการ.join([...]) .join(...)
grc

ฉันไม่ได้ลงรายละเอียดรหัสของคุณมากเกินไปดังนั้นนี่อาจไม่ทำงาน แต่: "จำเป็นต้องมีการสลับรายการเพื่อให้ป๊อปทำงานตามลำดับที่ฉันต้องการ" คุณไม่สามารถใช้v.pop(0)เพื่อดึงองค์ประกอบแรกแทนที่จะเป็น อันสุดท้าย?
undergroundmonorail

0

Python 3, 124

a=input().split()
l=max(map(len,a))
print("\n".join(" ".join(c[i] for c in [i+" "*(l-len(i)) for i in a]) for i in range(l)))

0

Haskell, 112

แข็งแรงเล่นกอล์ฟ:

import Data.List
r s=unlines$transpose$p$words s
p w=m(\s->s++replicate(maximum(m l w)-l s)' ')w
m=map
l=length

อธิบาย:

import Data.List

-- Break on spaces, then pad, then transpose, then join with newlines
r s=unlines$transpose$p$words s

-- Pads each String in a list of String to have the same length as the longest String
p w=m(\s->s++replicate(maximum(m l w)-l s)' ')w

-- Aliases to save space
m=map
l=length

ตัวอย่าง:

*Main Data.List> putStrLn $ r "Hello Doge"
HD
eo
lg
le
o

0

JavaScript, 139 (156 พร้อมเอาต์พุต console.log)

s=" ",b="",a=prompt().split(s),l=0;for(var i in a){m=a[i].length;l=(l<m)?m:l;}for(i=0;i<l;i++){for(var j in a)b+=((x=a[j][i])?x:s)+s;b+="\n"}console.log(b);

ฉันคิดว่านี่เป็นกอล์ฟที่ฉันจะได้รับ ฉันเพิ่งแยกค้นหาคำที่ใหญ่ที่สุดและแปลงตามนั้นเพิ่มช่องว่างถ้าอักขระไม่มีอยู่ในคำที่สั้นกว่า มากกว่าคำตอบ JavaScript ที่ส่งไปก่อนหน้านี้ แต่คำตอบนั้นดูเหมือนจะไม่ทำงานเหรอ?



0

Pyth, 8 ไบต์

jbjL\ Cc

ลองออนไลน์!

ค่อนข้างตรงไปตรงมา รับอินพุตที่อยู่ในเครื่องหมายคำพูดเช่น"Hello World"

jbjL\ CcQ
---------
       cQ    Chop the input Q on spaces
      C      Matrix transpose
  jL\        Join each element by spaces,
             i.e. interleave spaces between the characters of each element
jb           Join by newlines

1
Cตัดทอนความยาวของรายการที่สั้นที่สุดดังนั้นนี้ไม่ได้ทำงาน นี่คือการแก้ไขอย่างรวดเร็วซึ่งก็คือ 8 ไบต์
hakr14

0

APL (NARS), 79 ตัวอักษร, 158 ไบต์

{m←⌈/↑∘⍴¨z←(' '≠⍵)⊂,⍵⋄v←∊m{⍵\⍨∊(k⍴1)(0⍴⍨⍺-k←↑⍴⍵)}¨z⋄((2×↑⍴z)⍴1 0)\[2]⍉(↑⍴z)m⍴v}

ทดสอบ:

  f←{m←⌈/↑∘⍴¨z←(' '≠⍵)⊂,⍵⋄v←∊m{⍵\⍨∊(k⍴1)(0⍴⍨⍺-k←↑⍴⍵)}¨z⋄((2×↑⍴z)⍴1 0)\[2]⍉(↑⍴z)m⍴v}
  f 'Hello, World! My name is Foo.'
H W M n i F 
e o y a s o 
l r   m   o 
l l   e   . 
o d         
, !         

ฟังก์ชั่นเก่ามีเอาต์พุตไม่สมบูรณ์:

  {⍪¨(' '≠⍵)⊂,⍵}'Hello, World! My name is Foo.'
 H  W  M  n  i  F 
 e  o  y  a  s  o 
 l  r     m     o 
 l  l     e     . 
 o  d             
 ,  !
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.