Cetak string dengan kata-kata vertikal


12

Tugas Anda adalah mengambil string input karakter ascii dan output string sebagai serangkaian kata-kata vertikal yang dipisahkan oleh spasi. Contohnya ditunjukkan di bawah ini:

Diberikan string:

Hello, World! My name is Foo.

output harus:

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

10 poin bonus akan diberikan jika program Anda dengan benar menangani string yang perlu mengelilingi terminal, yang akan kita atur pada 80 karakter.

50 poin jika program Anda juga dapat melakukan yang sebaliknya!


Cukup mirip dengan Transpose halaman teks .
manatwork

3
@Manatwork: Saya rasa begitu. Itu tidak identik - dan saya mungkin berpendapat masalah saya sedikit lebih mudah.
Foo Barrigno

Ini tidak 100% identik, tetapi cukup dekat untuk dihitung sebagai duplikat: pengurangan untuk membuatnya identik hanya mengganti setiap ruang dengan dua baris baru.
Peter Taylor

1
@PeterTaylor: Tidak cukup. Masalah saya tidak memiliki persyaratan untuk menghormati baris baru dalam string asli. Masalah itu mengharuskan baris baru dikonversi menjadi spasi, dan spasi diubah menjadi dua baris baru. Itu bukan pengurangan yang sepele.
Foo Barrigno

Jawaban:


10

J, 15

|:>'\S+| 'rxall

Pemakaian:

   |:>'\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 kode pertama saya :)


Ini bagus untuk upaya pertama Anda!
Foo Barrigno

Anda harus berusaha membuat kode sesingkat mungkin, misalnya, menghapus spasi, juga "Input ?"tidak terlalu memengaruhi perilaku program, juga menghapusnya.
mniip

Memperbaiki Bug. Harus bekerja seperti yang diharapkan :)
Wolle Vanillebär Lutz

1
Bekerja dengan benar sekarang. Tetapi beberapa hal kecil: tidak perlu untuk variabel N, simpan array lengthbukan meminta dua kali, beberapa kawat gigi tanpa titik, beberapa titik koma yang tidak perlu. 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). (Dalam Standar JavaScript untuk pertanyaan meta IO , pendapat yang paling banyak disepakati adalah bahwa mengandalkan output implisit REPL tidak boleh dianggap benar.)
manatwork

1
(belum diuji) if(A[i][y]){B+=A[i][y];}else{B+=" ";}=>B+=(x=A[i][y])?x:" "
daniero

5

APL, 22

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

Penjelasan

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

Contoh

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

Hore, aku mengalahkan 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

Itu hanya mendeteksi untuk baris baru, dan menerapkan penanganan khusus jika terdeteksi.

Jalankan seperti

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

Dengan contoh string yang ditentukan:

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

Anda dapat menyalin pernyataan kedua ke konsol browser Anda.

Tidak dijinakkan:

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 Link: http://jsfiddle.net/FzMvK/

Posting golf kode pertama saya: P


Dilakukan dengan sangat baik
Foo Barrigno

@FooBarrigno memperbarui jawaban untuk mendukung pembalikan
RononDex

@FooBarrigno Jawaban yang diperbarui, menghapus dukungan terbalik, dan mengubah logika sepenuhnya untuk mengurangi jumlah byte
RononDex

Pintar, saya suka itu. Tidak bisakah Anda mengubah menjadi float:rightterbalik?
Danny

2
Tergantung apa artinya "membalikkan". Jika huruf pertama harus di bawah maka tidak akan berfungsi. Jika itu hanya membalikkan kata-kata, maka itu akan berhasil ya
RononDex

2

Perl - 92 97

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

Melakukan pekerjaan dengan cara yang sangat mudah.


Tidak perlu tanda kurung di sekitar ekspresi pengubah pernyataan.
manatwork

Perhatikan bahwa whileseperti yang digunakan di sini juga pengubah pernyataan.
manatwork

Apakah itu? Apakah ini bukan do{}while()loop?
mniip

Nggak. dosendiri tidak ada yang lain, hanya satu blok. Itu whileadalah hal yang terpisah.
manatwork

2

K, 33

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

Contoh input dan output:

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

Apakah yang "seharusnya ada di sana?
Dr. belisarius

@belisarius Begitulah string direpresentasikan dalam k. Jika Anda secara khusus ingin menulis ke stdout maka Anda dapat dengan {-1@" "/:',:''x@'/:!max@#:'x:" "\:x;}(37 karakter), yang akan menghasilkan output tanpa"
tmartin

4
Yah, saya pikir output harus yang diperlukan, terlepas dari bahasanya
Dr. belisarius

2

Python:

Satu baris kode untuk memproses sengatan:

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

Saya yakin ini bisa bermain golf lebih banyak, tapi inilah solusi awal dengan 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

Perbaikan:

  • split ("") => split ()
  • menghapus beberapa ruang ekstra

Pekerjaan yang baik! Jika Anda mulai dengan i=mdan
beralih

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

Algoritma ini sangat mudah; hanya bermain golf. Kode panjangnya 61 byte, ditambah 2 byte untuk -naopsi yang perlu dikerjakan. Dari ruby -h:

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

Contoh dijalankan:

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

Orang lain sudah melakukannya dengan lebih baik, tetapi saya mungkin akan membuang ini. Menambahkan spasi ke setiap kata dalam input hingga panjangnya sama dengan yang terlama (untuk menghindari kesalahan indeks untuk bagian selanjutnya), lalu mencetak churuf ke-1 dari setiap kata sambil cberalih dari 0 ke panjang setiap string.

Saya datang dengan cara yang jauh lebih baik untuk melakukan ini dan memotong 25 byte. Daripada menambahkan string dengan spasi untuk menghindari kesalahan indeks, saya menangani kesalahan secara langsung! Setiap kali ada yang cetak, saya mencetak satu ruang di tempatnya dengan try:print w[c],, except:print' ',. Saya juga ingat bahwa saya tidak perlu spasi antara pernyataan cetak dan string literal, yang menghemat satu byte.

Perhatikan bahwa Python 2 memungkinkan Anda untuk mencampur tab dan spasi dan menganggapnya tingkat indentasi terpisah. Interpreter Markdown SE menggantikan karakter tab dengan empat spasi, tetapi setiap baris program ini kecuali yang pertama memiliki indentasi tepat satu byte.

Memformat cukup mudah, karena print 'something',mencetak 'something 'daripada 'something\n'. Saya melakukan itu untuk setiap karakter, dan menggunakan printpernyataan kosong untuk mendapatkan baris baru di mana saya membutuhkannya.


2

C, 111 110 95 90 byte

Solusi ini menggunakan kode kontrol VT-100 untuk memindahkan kursor pada terminal

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

yang ^[urutan adalah sebuah tempat untuk karakter ASCII ESC tunggal, yang tidak dapat ditampilkan di sini.

  • ^[7 menyimpan posisi pointer saat ini
  • ^[8 mengembalikan posisi kursor ke posisi yang disimpan
  • ^[[2C bergerak 2 langkah ke kanan
  • ^[[B bergerak 1 langkah ke bawah

mengedit 1: the ^[[D(1 langkah kiri) VT-100 kode telah digantikan oleh backspace (ditampilkan sebagai ^Hdi sini, tapi hanya satu ASCII char); juga lupa instruksi "dipisahkan oleh spasi", sekarang diperbaiki

edit 2:

7 karakter disimpan dengan menggunakan forloop sebagai ganti while, dan 32bukannya ' ':

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

8 chars lebih disimpan dengan memanggil satu kurang printf: ?:operator ternary sekarang digunakan dalam printfparameter

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

edit 3:

Singkirkan variabel lokal s, bekerja secara langsung dengan argvalias v. Ini benar-benar mengerikan. Tapi menyelamatkan 4 karakter. Juga diganti ==dengan ^dan karena itu mengganti ?:operan, untuk menyimpan 1 karakter lagi.

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

Pemakaian

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

Versi tidak golf (versi pertama)

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

Versi tidak golf (versi terakhir)

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
Versi un-golfed itu tampak mencurigakan seperti Befunge . :)
DLosc

2

Saya menjawab pertanyaan ini sejak lama. Sebenarnya itu adalah salah satu kontribusi pertama saya ke situs. Saya baru-baru menemukan itu lagi dan agak malu. 112 byte ?! Tidak bisa diterima Jadi saya mencoba lagi:

Python 3 - 92 byte

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

Dalam 109 hari sejak saya memposting jawaban pertama itu, saya suka berpikir saya telah menempuh jalan panjang. Bahkan sesuatu seperti menggunakan Python 3 lebih dari 2,7 1 tidak akan terpikir oleh saya. Dengan kode ini golf di bawah 100 byte, jiwaku akhirnya bisa beristirahat dan aku bisa melanjutkan ke akhirat.

Penjelasan

s=input().split()

Ini mendapat garis dari stdindan membuat daftar dengan membaginya di karakter spasi putih. Satu-satunya spasi yang mungkin ada di input adalah spasi, jadi baris ini mendapatkan daftar kata.

Mari kita ambil baris kedua dari dalam ke luar:

                                           max(map(len,s))

mapmengambil fungsi dan iterable sebagai argumen. Itu berlaku fungsi untuk setiap elemen iterable, dan mengembalikan iterable baru dari hasilnya. Di sini, saya membuat iterable dengan panjang setiap kata input. maxmendapatkan nilai maksimum dari iterable. Ini memberi kita kata terlama dalam input.

                                  [a.ljust(              )for a in s]

Pemahaman daftar mirip dengan map. Itu melakukan sesuatu untuk setiap elemen iterable, dan mengembalikan daftar hasilnya. Untuk setiap kata dalam input, saya melakukan that_word.ljust(beberapa kode ). ljustkependekan dari "just justify". Dibutuhkan integer sebagai argumen dan menambahkan spasi ke string sampai sepanjang.

                             zip(*                                    )

Ini trik yang rapi. Dalam konteks ini, *berarti "unzip iterable sebagai argumen berganda". Dengan cara ini, zipdapat digunakan untuk merefleksikan matriks (misalnya zip(*[(1,2),(3,4)])-> [(1,3),(2,4)]). Satu-satunya batasan adalah bahwa semua baris dalam matriks harus memiliki panjang yang sama, atau elemen dari semua baris tetapi yang terpendek terpotong agar sesuai.

                map(' '.join,                                          )

Kita sudah tahu apa mapartinya. Satu-satunya hal baru di sini adalah join, yang mengambil iterable dari string dan menjadikannya string tunggal menggunakan pembatas yang melekat padanya. Misalnya, 'a'.join(['I', 'can', 'play', 'the', 'saxophone'])2 menjadi Iacanaplayatheasaxophone.

print('\n'.join(                                                        ))

Ini joinmembutuhkan banyak string dan memisahkannya dengan baris baru. Yang tersisa hanyalah printuntuk stdoutdan kita selesai!

Semua bersama Sekarang:

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

Temukan panjang kata terlama dari input, tambahkan spasi ke setiap kata sampai panjangnya sama, transpos dengan zip(*3 trik, gunakan joinuntuk memisahkan setiap karakter dalam satu baris dengan spasi, joinlagi untuk memisahkan setiap baris dengan baris baru, dan cetak! Tidak buruk untuk satu-satunya jalur non-input-handling dalam program 92 byte.


1. Karakter tambahan yang dihabiskan di print()dalam tanda kurung tidak sebanding dengan 4 karakter yang saya jatuhkan dari raw_input()-> input().
2. Saya tidak bisa memainkan saksofon.
3 ).. Sama-sama.


2
Saya tidak tahu mengapa ini CW. Saya mungkin telah menekan tombol secara tidak sengaja. Baiklah.
undergroundmonorail

Anda bisa berubah print("\n".join(...))menjadi *map(print,...),. Cobalah online!
Jo King

2

05AB1E , skor 8 -20 -21 ( 30 29 byte - 50 bonus):

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

Cobalah online (input satu baris reguler).
Cobalah secara online (input multi-line terbalik).

Penjelasan:

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

Jawaban 8 byte asli:

#ζεSðý}»

Cobalah online.

Penjelasan:

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

Jelas Mathematica bukan yang terbaik untuk ini:

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

Grafik Mathematica

Note ^T(transpose) hanya satu char (saya tidak dapat menemukan kode char yang tepat sekarang)


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

Sampel

hello, world! this is code golf

hwticg
eohsoo
lri dl
lls ef
od    
,! 

1

GolfScript [41 byte]

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

Bagaimana itu bekerja:

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

Anda dapat melihat demo online di sini .

PS: Ini adalah kode GolfScript pertama saya, jadi jangan menilai saya dengan ketat;)


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

Keluaran:

$ ./transpose.sh Halo, Dunia! Nama saya Foo.
HWM ni F
eoyaso
lrmo
lle.
od       
,!       
$ 

Saran untuk pembaruan: backticks untuk substitusi perintah disusutkan. Menggunakan $()konstruk sekarang merupakan metode umum untuk substitusi perintah.
Yokai

@Yokai - Ini adalah kode-golf - di sini kami mengoptimalkan panjang kode dan bukan untuk kepatuhan standar / praktik terbaik. codegolf.stackexchange.com/a/25572/11259
Digital Trauma

Saya pikir karena norma telah berubah untuk penggantian perintah, saya akan menyarankan pembaruan. Anda tidak harus melakukannya. Itu hanya saran. Itu hanya akan menambahkan satu karakter baru ke hitungan anyways.
Yokai

1

APL: 18

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

Penjelasan:

a ← '', beri spasi di depan string dan tetapkan ke a

'' = temukan spasi, hasilkan boolean

1 ↓ ¨a⊂⍨ buat substring mulai dari mana boolean memiliki 1's dan drop elemen pertama masing-masing (jadi ruang)

⍉ ↑ Buat matriks dari substring yang dihasilkan, dan balikkan sepanjang diagonal


1

R , 81 byte

Simpan satu byte dengan menyimpan baris baru sebagai e, yang dapat digunakan di kedua scanpanggilan, panggilan perbandingan dan cat.

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

Cobalah online!


1

K (oK) , 26 byte

Larutan:

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

Cobalah online!

Penjelasan:

`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

Ambil 1 - 166. Pembalikan daftar diperlukan untuk membuat pop bekerja sesuai urutan yang saya inginkan, tetapi ini tampak sia-sia. Dan ketika saya mencoba menggabungkan menjadi satu pemahaman untuk bersenang-senang, pop mengacaukan segalanya.

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)

Ambil 2 - 119. Jadi saya mengubah ke pengindeksan daftar sederhana. Meski begitu, sepertinya masih kikuk, terutama lapisan ruang dan garis baru.

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

Ambil 3 - terima kasih ke @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]dapat disingkat menjadi map(len,w), .split(' ')ke .split(), dan .join([...])ke .join(...).
grc

Saya belum membahas kode Anda terlalu detail sehingga ini mungkin tidak berfungsi, tetapi: "Pembalikan daftar diperlukan untuk membuat pop bekerja sesuai urutan yang saya inginkan" Tidak bisakah Anda menggunakan v.pop(0)untuk mem-pop elemen pertama dan bukan terakhir?
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

Golf:

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

Dijelaskan:

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

Contoh:

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

0

JavaScript, 139 (156 dengan output 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);

Saya pikir ini golf seperti yang saya bisa dapatkan. Saya baru saja membagi, menemukan kata terbesar dan mengubah sesuai, menambahkan spasi jika karakter tidak ada dalam kata-kata yang lebih pendek. Lebih dari jawaban JavaScript yang dikirimkan sebelumnya, tetapi jawaban itu sepertinya tidak berfungsi?


0

Japt -R , 5 byte

¸y¬m¸

Cobalah


Penjelasan

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

0

Pyth, 8 byte

jbjL\ Cc

Cobalah online!

Cukup mudah. Mengambil input yang dilampirkan dalam tanda kutip, yaitu"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
Cmemotong sepanjang entri terpendek, jadi ini tidak berfungsi . Inilah perbaikan cepat yang juga 8 byte.
hakr14

0

APL (NARS), 79 karakter, 158 byte

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

uji:

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

Fungsi lama memiliki keluaran tidak sempurna:

  {⍪¨(' '≠⍵)⊂,⍵}'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             
 ,  !
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.