Dikey kelimeler içeren bir dize yazdırma


12

Senin görevin ascii karakter giriş dizesini almak ve dizeyi boşluklarla ayrılmış bir dizi dikey kelime olarak çıktısını almaktır. Aşağıda bir örnek gösterilmiştir:

Dize verildiğinde:

Hello, World! My name is Foo.

çıktı:

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

Programınız, 80 karakter olarak ayarlayacağımız terminali sarması gereken dizeleri doğru bir şekilde ele alırsa 10 bonus puanı verilir.

Programınız tersi de yapabilirse 50 puan!



3
@manatwork: Sanırım öyle. Yine de aynı değil - ve sorunumun biraz daha kolay olduğunu iddia edebilirim.
Foo Barrigno

% 100 özdeş değil, ancak kopya olarak sayılacak kadar yakın: aynı hale getirmek için azaltma, her alanı iki yeni satırla değiştiriyor.
Peter Taylor

1
@PeterTaylor: Pek değil. Benim sorunum orijinal dize satırsonu saygı için herhangi bir gereksinimi yoktur. Bu sorun, yeni satırların boşluklara ve boşlukların iki yeni satıra dönüştürülmesini gerektirir. Bu önemsiz bir azalma değil.
Foo Barrigno

Yanıtlar:


10

J, 15

|:>'\S+| 'rxall

Kullanımı:

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

İlk kodum golf :)


İlk denemeniz için harika!
Foo Barrigno

Kodunuzu olabildiğince kısa yapmaya çalışmalısınız, örneğin boşlukları kaldırın, ayrıca "Input ?"programın davranışını gerçekten etkilemez, kaldırın.
mniip

Sabit Hatalar. Beklendiği gibi çalışmalı :)
Wolle Vanillebär Lutz

1
Şimdi doğru çalışıyor. Ancak bazı küçük şeyler: N değişkenine gerek yok, diziyi lengthiki kez sormak yerine saklayın , bazı anlamsız parantezler, bazı gereksiz noktalı virgüller. 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 meta sorusu için JavaScript Standartları'nda çoğunlukla üzerinde
anlaşılan fikir REPL'in

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

5

APL, 22

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

açıklama

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

Misal

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

Yakut, 91 87

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

Yaşasın, Perl'i yendim! : D

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

Yalnızca yeni satırları algılar ve algılanırsa özel işlem uygular.

Gibi çalıştır

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

Tanımlanan örnek dize ile:

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

İkinci ifadeyi tarayıcı konsolunuza kopyalayabilirsiniz.

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 Bağlantısı: http://jsfiddle.net/FzMvK/

İlk kodum golf postası: P


Çok güzel bitti
Foo Barrigno

@FooBarrigno, ters destek için cevabı güncelledi
RononDex

@FooBarrigno Güncelleme yanıtı, ters destek kaldırıldı ve bayt sayısını azaltmak için mantığı tamamen değiştirdi
RononDex

Zeki, hoşuma gitti. Sadece float:righttersine geçemez misin?
Danny

2
"Geri" nin ne anlama geldiğine bağlıdır. İlk harfin altta olması gerekiyorsa işe yaramaz. Sadece kelimeleri tersine çeviriyorsa, evet çalışması gerekir
RononDex

2

Perl - 92 97

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

İşi oldukça basit bir şekilde yapar.


İfade değiştiricilerin ifadeleri etrafında parantez gerekmez .
manatwork

O Not whileolarak burada kullanılan da deyim değiştirici olduğunu.
manatwork

Bu mu? Bir do{}while()döngü değil mi?
mniip

Hayır! dokendisinin başka bir şeyi yok, sadece bir blok. whileAyrı bir şeydir.
manatwork

2

K, 33

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

Örnek giriş ve çıkış:

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

Are "orada olması gerekiyordu?
Dr. belisarius

@belisarius Dizeler k ile temsil edilir. Özellikle stdout'a yazmak istiyorsanız, {-1@" "/:',:''x@'/:!max@#:'x:" "\:x;}(37 karakter) ile yapabilirsiniz , bu da çıktıyı üretemez"
tmartin

4
Bence, dil ne olursa olsun çıktı gerekli olmalı
Dr. belisarius

2

Python:

Sokmayı işlemek için bir kod satırı:

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

Eminim bu daha fazla golf olabilir, ama burada python için ilk çözüm.

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

İyileştirmeler:

  • split ("") => split ()
  • fazladan boşluk kaldı

İyi iş! Eğer başlarsanız i=mve döngü aşağı 0'a, bir hatta 100 için başka 3 karakter tıraş edebilirsiniz
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' '}

Algoritma çok basittir; sadece golf. Kod 61 bayt uzunluğunda, -naçalışması gereken seçenekler için 2 bayttır . Gönderen ruby -h:

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

Örnek çalışma:

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

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

Başka biri zaten daha iyisini yaptı, ama ben de kusabilirim. En uzun olanla aynı olana kadar (bir sonraki bölüm için dizin hatalarından kaçınmak için) girişteki her kelimeye boşluk ekler, ardından cher sözcüğün th harfini c0'dan her dizenin uzunluğuna giderken yazdırır .

Bunu yapmanın çok daha iyi bir yolunu buldum ve 25 bayt kestim. Dizin hatasını önlemek için dizeleri boşluklarla doldurmak yerine, hatayı doğrudan ele alıyorum! Baskı bir şey yok olduğunda, ben onun yerine tek bir boşluk baskı try:print w[c],, except:print' ',. Ben de bir baskı deyimi ve bir bayt kurtardı bir dize değişmez arasında bir boşluk gerek olmadığını hatırladı.

Python 2'nin sekmeleri ve boşlukları karıştırmanıza izin verdiğini ve bunları ayrı girinti düzeyleri olarak değerlendirdiğini unutmayın. SE'nin Markdown yorumlayıcısı bir sekme karakterini dört boşlukla değiştirir, ancak bu programın ilk satırı dışındaki her satırında tam olarak bir bayt girintisi vardır.

Biçimlendirme oldukça kolaydı, çünkü print 'something',yazdırmak 'something 'yerine 'something\n'. Bunu her karakter için yaptım printve satırsonu ihtiyacım olan yere ulaşmak için boş bir ifade kullandım .


2

Cı, 111 110 95 90 bayt

Bu çözüm, imleci terminalde hareket ettirmek için VT-100 kontrol kodlarını kullanır

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

^[dizisi burada görüntülenemiyor tek ASCII ESC karakteri için bir yer tutucudur.

  • ^[7 geçerli işaretçi konumunu kaydeder
  • ^[8 imleç konumunu kaydedilen konuma geri yükler
  • ^[[2C 2 adım sağa taşır
  • ^[[B 1 adım aşağı taşır

düzenlemek 1:^[[D (1 adım sol) VT-100 kod geri alma ile ikame (şekilde gösterilmiştir ^H, burada ancak bir ASCII karakter olan); ayrıca "boşluklarla ayrılmış" talimatını unuttum, şimdi düzeltildi

düzenleme 2:

7 karakter bir kullanarak kaydedilen foryerine döngü whileve 32yerine ' ':

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

Bir tane daha azını arayarak 8 karakter daha kaydedildi printf: üçlü ?:operatör artık printfparametrelerde kullanılıyor

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

düzenleme 3:

sDoğrudan argvaka ile çalışan , yerel değişken kurtuldu v. Bu tamamen iğrenç. Ama 4 karakter kurtardı. Ayrıca değiştirilen ==ile ^ve bu nedenle devreye ?:1 daha kömürü kaydetmek için, işlenen.

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

kullanım

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

Golfsiz sürüm (ilk sürüm)

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

Golfsiz sürüm (son sürüm)

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
Bu golf oyunu, Befunge'ye kuşkuyla benziyor . :)
DLosc

2

Ben bu soruya cevap çok uzun zaman önce. Aslında siteye yaptığım ilk katkılardan biriydi. Geçenlerde tekrar karşılaştım ve biraz utandım. 112 bayt ?! Kabul edilemez. Bu yüzden başka bir şans verdim:

Python 3-92 bayt

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

İlk cevabı gönderdiğimden bu yana 109 gün içinde uzun bir yol kat ettiğimi düşünüyorum. Python 3'ü 2.7 1'in üzerinde kullanmak gibi bir şey bile bana olmazdı. Bu kod 100 baytın altına indiğinde, ruhum nihayet dinlenebilir ve öbür dünyaya geçebilirim.

açıklama

s=input().split()

Bu satırdan bir satır alır stdinve boşluk karakterlerine bölerek bir liste oluşturur. Girdide olması muhtemel tek boşluk boşluklardır, bu nedenle bu satır bir kelime listesi alır.

İkinci satırı içeriden dışarı çıkaralım:

                                           max(map(len,s))

mapargüman olarak bir işlevi ve bir yinelemeyi alır. İşlevi yinelemenin her öğesine uygular ve sonuçların yeni bir yinelemesini döndürür. Burada, her giriş kelimesinin uzunlukları ile bir yinelenebilir oluşturun. maxmaksimum değeri yinelemeden alır. Bu bize girdideki en uzun kelimeyi getirir.

                                  [a.ljust(              )for a in s]

Liste kavrayışı şuna benzer map. Bir yinelenebilir öğenin her öğesine bir şey yapar ve sonuçları bir liste döndürür. Girişteki her kelime için that_word.ljust(bazı kodlar yaparım ). ljust"sola yasla" ifadesinin kısaltmasıdır. Bir tamsayıyı argüman olarak alır ve bu uzunluğa kadar dizeye boşluk ekler.

                             zip(*                                    )

Bu temiz bir numara. Bu bağlamda, *"bu yinelenebilir öğeyi birden çok argüman olarak aç" anlamına gelir. Bu şekilde, bir matrisi (ör. -> ) aktarmakzip için kullanılabilir . Tek kısıtlama, matristeki tüm satırların aynı uzunlukta olması ya da tüm satırlardaki öğelerin aynı uzunlukta olması gerektiğidir.zip(*[(1,2),(3,4)])[(1,3),(2,4)]

                map(' '.join,                                          )

Ne yaptığını zaten biliyoruz map. Buradaki tek yeni şey join, bir dizi dizgiyi alıp bağlı olduğu sınırlayıcıyı kullanarak tek bir dize haline getiriyor. Örneğin, 'a'.join(['I', 'can', 'play', 'the', 'saxophone'])2 olur Iacanaplayatheasaxophone.

print('\n'.join(                                                        ))

Bu join, bir dizi dizeyi alır ve bunları yeni satırlarla ayırır. Kalan tek şey etmektir printiçin stdoutve biz bu kadar!

Şimdi hep beraber:

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

Girişteki en uzun kelimenin uzunluğunu bulun, aynı uzunluğa kadar her kelimeye boşluk ekleyin, zip(*3 numara ile transpoze edin, joinher karakteri boşluklu bir satırda ayırmak için kullanın , joinyine her satırı bir satırsonu ile ayırmak için, ve yazdırın! 92 baytlık bir programdaki giriş olmayan tek satır için fena değil.


1. print()Parantez içinde harcanan fazladan karakter , raw_input()-> ' den bıraktığım 4 karakterden daha ağır basar input().
2. Aslında saksafon çalamıyorum.
3. ). Rica ederim.


2
Bunun neden CW olduğu hakkında hiçbir fikrim yok. Yanlışlıkla düğmeye basmış olabilirdim. Oh iyi.
undergroundmonorail

Değişebilirsin print("\n".join(...))için *map(print,...),. Çevrimiçi deneyin!
Jo King

2

05AB1E , skor 8 -20 -21 ( 30 29 bayt - 50 prim):

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

Çevrimiçi deneyin (düzenli tek satır giriş).
Çevrimiçi deneyin (çok satırlı ters giriş).

Açıklama:

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

Orijinal 8 baytlık cevap:

#ζεSðý}»

Çevrimiçi deneyin.

Açıklama:

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

Açıkçası Mathematica bunun için en iyisi değil:

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

Mathematica grafikleri

Not ^T(devrik) sadece bir karakterdir (şimdi doğru karakter kodunu bulamıyorum)


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

Örneklem

hello, world! this is code golf

hwticg
eohsoo
lri dl
lls ef
od    
,! 

1

GolfScript [41 bayt]

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

Nasıl çalışır:

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

Online demoyu burada görebilirsiniz .

PS: Bu benim ilk GolfScript kodum, bu yüzden beni kesinlikle yargılama;)


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

Çıktı:

$ ./transpose.sh Merhaba Dünya! Benim adım Foo.
HWM ni F
eoyaso
lrmo
lle.
od       
,!       
$ 

Güncelleme önerisi: komut ikamesi için geri dönüşler amortismana tabi tutulur. Yapıyı kullanmak $()artık komut ikamesi için yaygın bir yöntemdir.
Yokai

@Yokai - Bu kod golf - burada kod uzunluğu için optimize ediyoruz ve standartlara / en iyi uygulamalara uygunluk için değil. codegolf.stackexchange.com/a/25572/11259
Digital Trauma

Komutun değiştirilmesi için norm değiştiğinden beri bir güncelleme öneriyorum. Yapmanıza gerek yok. Bu sadece bir öneriydi. Yine de sayıya sadece tek bir yeni karakter ekleyecektir.
Yokai

1

APL: 18

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

Açıklama:

a ← '', dizenin önüne bir boşluk koyun ve bir

'' = boşluk bul, boole üretir

1 the ¨a⊂⍨, booleanın 1'leri olduğu yerden başlayarak alt dizeleri oluşturur ve her birinin ilk öğesini bırakır (böylece boşluk)

Rix ↑ Ortaya çıkan alt dizelerden matris yapın ve köşegen boyunca ters çevirin


1

R , 81 bayt

eHer iki scançağrıda, karşılaştırmalı çağrı ve olarak kullanılabilen yeni bir satır kaydederek bir bayt kaydedin cat.

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

Çevrimiçi deneyin!


1

K (ok) , 26 bayt

Çözüm:

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

Çevrimiçi deneyin!

Açıklama:

`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 alın. Listelerin tersine çevrilmesi, istediğim sırada pop çalışması yapmak için gerekliydi, ancak bu savurgan görünüyordu. Ve eğlence için tek bir kavrayışta birleşmeye çalıştığımda, pop işleri mahvetti.

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 alın. Basit liste indekslemesine geçtim. Yine de, özellikle boşlukların ve yeni çizgilerin dolgusu tıknaz görünüyor.

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 atın - @grc sayesinde

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]için kısaltılabilir map(len,w), .split(' ')için .split(), ve .join([...])karşı .join(...).
grc

Kodunuzu çok fazla ayrıntıya girmedim, bu yüzden bu işe yaramayabilir, ancak: "Listelerin tersine çevrilmesi, istediğim sırada pop çalışması yapmak için gerekliydi" v.pop(0)yerine ilk öğeyi pop yapmak için kullanamazdınız sonuncusu?
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

golfed:

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

Açıklaması:

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

Misal:

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

0

JavaScript, 139 (console.log çıktısı ile 156)

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

Bence bu alabildiğim kadar golf. Ben sadece daha kısa kelimelerde mevcut değilse, bölünür, en büyük kelimeyi bulup ona göre transpozisyonu yaparım. Daha önce gönderilen JavaScript yanıtından daha fazla, ancak bu yanıt işe yaramıyor gibi görünüyor mu?


0

Japt -R , 5 bayt

¸y¬m¸

Dene


açıklama

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

0

Pyth, 8 bayt

jbjL\ Cc

Çevrimiçi deneyin!

Oldukça basit. Tırnak içine alınmış girdileri alır, yani"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
Cen kısa girişin uzunluğuna kısalır, bu işe yaramaz . İşte 8 baytlık hızlı bir düzeltme.
hakr14

0

APL (NARS), 79 karakter, 158 bayt

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

Ölçek:

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

Eski fonksiyonun çıktısı mükemmel değil:

  {⍪¨(' '≠⍵)⊂,⍵}'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             
 ,  !
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.