In một chuỗi với các từ dọc


12

Nhiệm vụ của bạn là lấy một chuỗi đầu vào gồm các ký tự ascii và xuất chuỗi dưới dạng một chuỗi các từ dọc được phân tách bằng dấu cách. Một ví dụ đã được biểu diễn ở dưới:

Cho chuỗi:

Hello, World! My name is Foo.

đầu ra phải là:

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

10 điểm thưởng sẽ được trao nếu chương trình của bạn xử lý chính xác các chuỗi cần quấn quanh thiết bị đầu cuối, chúng tôi sẽ đặt ở mức 80 ký tự.

50 điểm nếu chương trình của bạn cũng có thể làm ngược lại!



3
@manatwork: Tôi cho là vậy. Mặc dù nó không giống nhau - và tôi có thể tranh luận vấn đề của tôi dễ dàng hơn một chút.
Foo Barrigno

Nó không giống nhau 100%, nhưng nó đủ gần để được coi là một bản sao: việc giảm để làm cho nó giống hệt nhau chỉ là thay thế mỗi không gian bằng hai dòng mới.
Peter Taylor

1
@PeterTaylor: Không hoàn toàn. Vấn đề của tôi không có yêu cầu phải tôn trọng các dòng mới trong chuỗi ban đầu. Vấn đề đó đòi hỏi các dòng mới phải được chuyển đổi thành không gian và không gian được chuyển đổi thành hai dòng mới. Nó không hẳn là một sự giảm thiểu tầm thường.
Foo Barrigno

Câu trả lời:


10

J, 15

|:>'\S+| 'rxall

Sử dụng:

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

Golf mã đầu tiên của tôi :)


Nó tuyệt vời cho nỗ lực đầu tiên của bạn!
Foo Barrigno

Bạn nên cố gắng làm cho mã của mình càng ngắn càng tốt, ví dụ, xóa các khoảng trắng, cũng "Input ?"không thực sự ảnh hưởng đến hành vi của chương trình, hãy xóa nó đi.
mniip

Lỗi cố định. Nên làm việc như mong đợi :)
Wolle Vanillebär Lutz

1
Hoạt động chính xác ngay bây giờ. Nhưng một số điều nhỏ: không cần biến N, lưu trữ mảng lengththay vì yêu cầu hai lần, một số dấu ngoặc vô nghĩa, một số dấu chấm phẩy không cần thiết. 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). (Trong tiêu chuẩn JavaScript cho câu hỏi meta IO , ý kiến ​​chủ yếu được thống nhất là việc dựa vào đầu ra ngầm của REPL không nên được coi là chính xác.)
manatwork 21/214

1
(chưa được kiểm tra) if(A[i][y]){B+=A[i][y];}else{B+=" ";}=>B+=(x=A[i][y])?x:" "
daniero

5

APL, 22

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

Giải trình

{              ⍵=' '}   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

Thí dụ

      {⍉⊃⍵⊂⍨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

Ruby, 91 87

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

Hoan hô, tôi đánh bại Perl! : D

Ruby, 150 - 50 tiền thưởng = 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

Nó chỉ phát hiện các dòng mới và áp dụng xử lý đặc biệt nếu chúng được phát hiện.

Chạy nó như

ruby transposegolf.rb < transposegolfinput.txt

3

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

Với chuỗi ví dụ được xác định:

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

Bạn có thể sao chép câu lệnh thứ hai vào bảng điều khiển trình duyệt.

Chưa hoàn thành:

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

Liên kết JsFiddle: http://jsfiddle.net/FzMvK/

Mã bài golf đầu tiên của tôi: P


Thực hiện rất độc đáo
Foo Barrigno

@FooBarrigno cập nhật câu trả lời để hỗ trợ đảo ngược
RononDex

@FooBarrigno Câu trả lời được cập nhật, loại bỏ hỗ trợ ngược và thay đổi hoàn toàn logic để giảm số byte
RononDex

Thông minh, tôi thích nó. Bạn có thể thay đổi để float:rightđảo ngược?
Danny

2
Phụ thuộc vào "đảo ngược" nghĩa là gì. Nếu chữ cái đầu tiên ở dưới cùng thì nó sẽ không hoạt động. Nếu nó chỉ đơn giản là đảo ngược các từ, thì nó sẽ hoạt động đúng
RononDex

2

Perl - 92 97

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

Liệu công việc một cách khá đơn giản.


Không cần dấu ngoặc quanh biểu thức của bộ sửa đổi câu lệnh .
manatwork

Lưu ý rằng whilenhư được sử dụng ở đây cũng là sửa đổi câu lệnh.
manatwork

Là nó? Nó không phải là một do{}while()vòng lặp?
mniip

Không. dobản thân nó không có gì khác, chỉ là một khối. Đây whilelà một điều riêng biệt.
manatwork

2

K, 33

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

Ví dụ đầu vào và đầu ra:

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        "
", !        "

Được "cho là ở đó?
Tiến sĩ belisarius

@belisarius Đó là cách các chuỗi được biểu thị bằng k. Nếu bạn đặc biệt muốn viết vào thiết bị xuất chuẩn thì bạn có thể với {-1@" "/:',:''x@'/:!max@#:'x:" "\:x;}(37 ký tự), sẽ tạo ra đầu ra mà không có"
tmartin

4
Chà, tôi nghĩ đầu ra phải là thứ bắt buộc, bất chấp ngôn ngữ
Tiến sĩ belisarius

2

Con trăn

Một dòng mã để xử lý sting:

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

Tôi chắc chắn rằng điều này có thể được đánh gôn nhiều hơn, nhưng đây là một giải pháp ban đầu trong python.

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

Cải tiến:

  • chia ("") => chia ()
  • loại bỏ một số không gian thừa

Công việc tốt! Nếu bạn bắt đầu bằng i=mvà lặp xuống 0, bạn có thể cạo 3 ký tự khác trong 100.
DLosc

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

Ruby, 63

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

Thuật toán rất đơn giản; chỉ chơi golf. Mã dài 61 byte, cộng với 2 byte cho các -natùy chọn mà nó cần để hoạt động. Từruby -h :

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

Chạy mẫu:

$ 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 byte

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

Một số người khác đã làm điều đó tốt hơn, nhưng tôi cũng có thể ném nó lên. Thêm khoảng trắng cho mỗi từ trong đầu vào cho đến khi nó có cùng độ dài với từ dài nhất (để tránh lỗi chỉ mục cho phần tiếp theo), sau đó in cchữ cái của mỗi từ trong khi cđi từ 0 đến độ dài của mỗi chuỗi.

Tôi đã nghĩ ra một cách tốt hơn để làm điều này và cắt ra 25 byte. Thay vì đệm chuỗi có khoảng trắng để tránh lỗi chỉ mục, tôi xử lý lỗi trực tiếp! Bất cứ khi nào không có gì để in, tôi in một khoảng trống ở vị trí của nó bằngtry:print w[c], , except:print' ',. Tôi cũng nhớ rằng tôi không cần khoảng trắng giữa câu lệnh in và chuỗi ký tự, đã lưu một byte.

Lưu ý rằng Python 2 cho phép bạn trộn các tab và khoảng trắng và xem xét chúng ở các mức thụt đầu dòng riêng biệt. Trình thông dịch Markdown của SE thay thế một ký tự tab bằng bốn khoảng trắng, nhưng mỗi dòng của chương trình này ngoại trừ dòng đầu tiên có chính xác một byte thụt lề.

Định dạng là khá dễ dàng, vì print 'something',in 'something 'hơn là 'something\n'. Tôi đã làm điều đó cho mỗi nhân vật và sử dụng một printcâu lệnh trống để có được dòng mới nơi tôi cần.


2

C, 111 110 95 90 byte

Giải pháp này sử dụng mã điều khiển VT-100 để di chuyển con trỏ trên thiết bị đầu cuối

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

các ^[chuỗi là một giữ chỗ cho ký tự ASCII ESC duy nhất, mà không thể được hiển thị ở đây.

  • ^[7 lưu vị trí con trỏ hiện tại
  • ^[8 Khôi phục vị trí con trỏ về vị trí đã lưu
  • ^[[2C di chuyển đúng 2 bước
  • ^[[B di chuyển xuống 1 bước

chỉnh sửa 1: các ^[[D(1 bước bên trái) VT-100 mã đã được thay thế bằng một backspace (hiển thị như ^Hở đây, nhưng chỉ là một ASCII char); cũng quên hướng dẫn "ngăn cách bởi dấu cách", hiện đã được sửa

chỉnh sửa 2:

7 ký tự được lưu bằng cách sử dụng forvòng lặp thay vì while32thay vì ' ':

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

Thêm 8 ký tự được lưu bằng cách gọi thêm một ký tự printf: toán ?:tử ternary hiện được sử dụng trong các printftham số

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

chỉnh sửa 3:

Đã thoát khỏi biến cục bộ s, làm việc trực tiếp với argvaka v. Điều này là hoàn toàn gớm ghiếc. Nhưng lưu được 4 ký tự. Cũng được thay thế ==bằng ^và do đó đã chuyển đổi ?:toán hạng, để tiết kiệm thêm 1 char.

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

Sử dụng

$ 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
, !

Phiên bản không chơi gôn (phiên bản đầu tiên)

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 */
}

Phiên bản không chơi gôn (phiên bản cuối)

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
Phiên bản không chơi gôn đó trông giống như Befunge . :)
DLosc

2

Tôi đã trả lời câu hỏi này từ lâu. Đó là một trong những đóng góp đầu tiên của tôi cho trang web, thực sự. Gần đây tôi đã đi qua nó một lần nữa và đã rất xấu hổ. 112 byte?! Không thể chấp nhận được. Vì vậy, tôi đã cho nó một shot khác:

Python 3 - 92 byte

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

Trong 109 ngày kể từ khi tôi đăng câu trả lời đầu tiên đó, tôi muốn nghĩ rằng mình đã đi được một chặng đường dài. Thậm chí một cái gì đó như sử dụng Python 3 trên 2.7 1 cũng sẽ không xảy ra với tôi. Với mã này được giảm xuống dưới 100 byte, cuối cùng linh hồn tôi có thể nghỉ ngơi và tôi có thể tiến về thế giới bên kia.

Giải trình

s=input().split()

Điều này nhận được một dòng từ stdinvà tạo một danh sách bằng cách chia nó ở các ký tự khoảng trắng. Khoảng trắng duy nhất có khả năng nằm trong đầu vào là khoảng trắng, vì vậy dòng này nhận được danh sách các từ.

Hãy lấy dòng thứ hai từ trong ra ngoài:

                                           max(map(len,s))

maplấy một hàm và một lần lặp làm đối số. Nó áp dụng hàm cho từng phần tử của iterable và trả về một iterable mới của các kết quả. Ở đây, tôi tạo một lần lặp với độ dài của mỗi từ đầu vào. maxđược giá trị tối đa từ một lần lặp. Điều này cho chúng ta từ dài nhất trong đầu vào.

                                  [a.ljust(              )for a in s]

Một sự hiểu biết danh sách là tương tự như map. Nó làm một cái gì đó cho mọi phần tử của một lần lặp và trả về một danh sách kết quả. Đối với mỗi từ trong đầu vào, tôi làm that_word.ljust(một số mã ). ljustlà viết tắt của "trái biện minh". Nó lấy một số nguyên làm đối số và thêm khoảng trắng vào chuỗi cho đến khi nó dài.

                             zip(*                                    )

Đây là một mẹo gọn gàng. Trong ngữ cảnh này, *có nghĩa là "giải nén iterable này dưới dạng nhiều đối số". Bằng cách này, zipcó thể được sử dụng để hoán chuyển một ma trận (ví dụ zip(*[(1,2),(3,4)])-> [(1,3),(2,4)]). Hạn chế duy nhất là tất cả các hàng trong ma trận phải có cùng độ dài hoặc các phần tử từ tất cả các hàng nhưng ngắn nhất được cắt bỏ để khớp.

                map(' '.join,                                          )

Chúng tôi đã biết những gì mapkhông. Điều mới duy nhất ở đây là join, có một chuỗi lặp và biến nó thành một chuỗi bằng cách sử dụng dấu phân cách mà nó được gắn vào. Ví dụ, 'a'.join(['I', 'can', 'play', 'the', 'saxophone'])2 trở thành Iacanaplayatheasaxophone.

print('\n'.join(                                                        ))

Điều này joincó một loạt các chuỗi và tách chúng theo dòng mới. Tất cả chỉ còn lại là printđể stdoutvà chúng ta đã hoàn thành!

Bây giờ tất cả cùng nhau:

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

Tìm độ dài của từ dài nhất từ ​​đầu vào, nối khoảng trắng vào mỗi từ cho đến khi chúng có cùng độ dài, hoán đổi với zip(*3 mẹo, sử dụng joinđể phân tách từng ký tự trong một hàng với khoảng trắng, joinmột lần nữa để tách từng hàng với một dòng mới, và in! Không tệ cho dòng xử lý không đầu vào duy nhất trong chương trình 92 byte.


1. Các ký tự phụ dành cho print()dấu ngoặc đơn vượt trội hơn 4 ký tự tôi thả từ raw_input()-> input().
2. Tôi thực sự không thể chơi saxophone.
3 ).. Không có gì.


2
Tôi không biết tại sao đây là CW. Tôi có thể đã vô tình nhấn nút. Ồ tốt
undergroundmonorail

Bạn có thể thay đổi print("\n".join(...))thành *map(print,...),. Hãy thử trực tuyến!
Jo King

2

05AB1E , điểm 8 -20 -21 ( 30 29 byte - 50 điểm thưởng):

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

Hãy thử trực tuyến (đầu vào một dòng thông thường).
Hãy thử trực tuyến (đầu vào đảo ngược nhiều dòng).

Giải trình:

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

Câu trả lời 8 byte gốc:

#ζεSðý}»

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

Giải trình:

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

Toán học 49

Rõ ràng Mathicala không phải là tốt nhất cho cái này:

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

Đồ họa toán học

Lưu ý ^T(hoán vị) chỉ là một char (Tôi không thể tìm đúng mã char ngay bây giờ)


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

Mẫu vật

hello, world! this is code golf

hwticg
eohsoo
lri dl
lls ef
od    
,! 

1

GolfScript [41 byte]

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

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

' '%: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

Bạn có thể xem bản demo trực tuyến tại đây .

PS: Đây là mã GolfScript đầu tiên của tôi từ trước đến giờ, vì vậy đừng phán xét tôi nghiêm túc;)


1

R, 116

z=t(plyr::rbind.fill.matrix(lapply(strsplit(scan(,""),""),t)));z[is.na(z)]=" ";invisible(apply(cbind(z,"\n"),1,cat))

1

Bash + coreutils, 54

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

Đầu ra:

$ ./transpose.sh Xin chào, Thế giới! Tôi tên là Foo
CTM ni F
eoyada
lrmo
lle
od       
!       
$ 

Đề xuất cho một bản cập nhật: backticks để thay thế lệnh bị khấu hao. Sử dụng $()cấu trúc bây giờ là phương pháp phổ biến để thay thế lệnh.
Yokai

@Yokai - Đây là môn đánh gôn - ở đây chúng tôi đang tối ưu hóa độ dài mã và không tuân thủ các tiêu chuẩn / thực hành tốt nhất. codegolf.stackexchange.com/a/25572/11259
Chấn thương kỹ thuật số

Tôi hình dung vì định mức đã thay đổi để thay thế lệnh, tôi sẽ đề xuất một bản cập nhật. Bạn không cần phải làm vậy. Nó đã chỉ là một sự gợi ý thôi mà. Nó sẽ chỉ thêm một ký tự mới vào dù sao đi nữa.
Yokai

1

APL: 18

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

Giải trình:

a ← '', đặt một khoảng trắng ở phía trước chuỗi và gán cho

'' = tìm khoảng trắng, tạo boolean

1 ↓ a⊂⍨ tạo các chuỗi con bắt đầu trong đó boolean có 1 và thả phần tử đầu tiên của mỗi phần tử (vì vậy khoảng trắng)

Tạo ma trận ra khỏi các chuỗi con kết quả và đảo ngược nó dọc theo đường chéo


1

R , 81 byte

Lưu một byte bằng cách lưu trữ một dòng mới dưới dạng e, có thể được sử dụng trong cả hai scancuộc gọi, cuộc gọi so sánh và cat.

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

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


1

K (oK) , 26 byte

Giải pháp:

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

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

Giải trình:

`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

Mất 1 - 166. Việc đảo ngược danh sách là cần thiết để khiến pop hoạt động theo thứ tự tôi muốn, nhưng điều này có vẻ lãng phí. Và khi tôi cố gắng kết hợp thành một sự hiểu biết duy nhất cho vui, pop đã làm mọi thứ rối tung lên.

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)

Mất 2 - 119. Vì vậy, tôi đã thay đổi thành lập chỉ mục danh sách đơn giản. Mặc dù vậy vẫn có vẻ lộn xộn, đặc biệt là phần đệm của không gian và các dòng mới.

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

Mất 3 - cảm ơn @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]có thể được rút ngắn xuống còn map(len,w), .split(' ')để .split(), và .join([...])để .join(...).
grc

Tôi đã không kiểm tra mã của bạn quá nhiều chi tiết nên điều này có thể không hoạt động, nhưng: "Việc đảo ngược danh sách là cần thiết để làm cho pop hoạt động theo thứ tự tôi muốn" Bạn không thể sử dụng v.pop(0)để bật phần tử đầu tiên thay vì cái cuối cùng?
undergroundmonorail

0

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

Chơi gôn

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

Giải thích:

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

Thí dụ:

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

0

JavaScript, 139 (156 với đầu ra 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);

Tôi nghĩ rằng đây là golf như tôi có thể nhận được nó. Tôi chỉ phân tách, tìm từ lớn nhất và hoán vị tương ứng, thêm khoảng trắng nếu char không tồn tại trong các từ ngắn hơn. Nhiều hơn câu trả lời JavaScript đã gửi trước đó, nhưng câu trả lời đó dường như không hoạt động?


0

Japt -R , 5 byte

¸y¬m¸

Thử nó


Giải trình

¸         :Split on spaces
 y        :Transpose
  ¬       :Split columns
   m      :Map rows
    ¸     :  Join with spaces
          :Implicitly join with newlines and output

0

Bình thường, 8 byte

jbjL\ Cc

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

Khá đơn giản. Đưa đầu vào kèm theo dấu ngoặc kép, nghĩa là"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
Ccắt ngắn theo chiều dài của mục ngắn nhất, vì vậy điều này không hoạt động . Đây là một sửa chữa nhanh chóng mà cũng là 8 byte.
hakr14

0

APL (NARS), 79 ký tự, 158 byte

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

kiểm tra:

  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         
, !         

Hàm cũ có đầu ra không hoàn hảo:

  {⍪¨(' '≠⍵)⊂,⍵}'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             
 ,  !
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.