Wydrukuj ciąg z pionowymi słowami


12

Twoim zadaniem jest pobranie ciągu znaków ascii i wyprowadzenie ciągu jako szeregu pionowych słów oddzielonych spacjami. Przykład jest pokazany poniżej:

Biorąc pod uwagę ciąg:

Hello, World! My name is Foo.

wyjście powinno być:

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

10 punktów bonusowych zostanie przyznanych, jeśli twój program poprawnie obsługuje ciągi, które muszą owijać terminal, które ustawimy na 80 znaków.

50 punktów, jeśli twój program może również zrobić odwrotnie!


Całkiem podobny do Transponuj stronę tekstu .
manatwork

3
@manatwork: Chyba tak. Nie jest jednak identyczny - i mogę argumentować, że mój problem jest trochę łatwiejszy.
Foo Barrigno

Nie jest w 100% identyczny, ale jest wystarczająco blisko, aby liczyć się jako duplikat: redukcja, aby uczynić go identycznym, polega na zastąpieniu każdej spacji dwoma znakami nowej linii.
Peter Taylor

1
@PeterTaylor: Niezupełnie. Mój problem nie wymaga przestrzegania nowych linii w oryginalnym łańcuchu. Ten problem wymaga przekształcenia nowych linii w spacje i spacji w dwie nowe linie. To nie jest całkiem trywialna redukcja.
Foo Barrigno

Odpowiedzi:


10

J, 15

|:>'\S+| 'rxall

Stosowanie:

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

Mój pierwszy golf golfowy :)


Jest świetny na pierwszą próbę!
Foo Barrigno

Powinieneś postarać się, aby Twój kod był jak najkrótszy, na przykład usuń spacje, "Input ?"tak naprawdę nie wpływa na zachowanie programu, również go usuń.
mniip

Naprawione błędy. Powinien działać zgodnie z oczekiwaniami :)
Wolle Vanillebär Lutz

1
Działa teraz poprawnie. Ale kilka drobnych rzeczy: nie ma potrzeby zmiennej N, przechowuj tablicę lengthzamiast pytać dwa razy, kilka bezsensownych nawiasów klamrowych, kilka niepotrzebnych średników. 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). (W meta-pytaniach JavaScript dla meta- IO najczęściej uzgodnioną opinią było to, że poleganie na dorozumianych
wynikach

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

5

APL, 22

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

Wyjaśnienie

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

Przykład

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

Brawo, pokonałem Perla! :RE

Rubinowy, premia 150-50 = 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

Po prostu wykrywa nowe linie i stosuje specjalną obsługę, jeśli zostaną wykryte.

Uruchom to jak

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

Przy zdefiniowanym ciągu przykładowym:

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

Możesz skopiować drugą instrukcję do konsoli przeglądarki.

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

Mój pierwszy kod do golfa: P


Bardzo ładnie wykonane
Foo Barrigno

@FooBarrigno zaktualizowana odpowiedź do obsługi rewersu
RononDex

@FooBarrigno Zaktualizowano odpowiedź, całkowicie usunięto obsługę wsteczną i całkowicie zmieniono logikę, aby zmniejszyć liczbę bajtów
RononDex

Sprytne, podoba mi się. Nie możesz po prostu zmienić float:rightna odwrotną?
Danny

2
Zależy, co znaczy „rewers”. Jeśli pierwsza litera powinna znajdować się na dole, to nie zadziała. Jeśli po prostu odwraca słowa, to powinno działać tak
RononDex

2

Perl - 92 97

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

Wykonuje pracę w dość prosty sposób.


Nie ma potrzeby nawiasów wokół wyrażeń modyfikatorów instrukcji .
manatwork

Zauważ, że whiletutaj użyty jest również modyfikator instrukcji.
manatwork

Czy to jest Czy to nie jest do{}while()pętla?
mniip

Nie. dosam w sobie nie ma nic więcej, tylko blok. To whilejest osobna sprawa.
manatwork

2

K, 33

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

Przykładowe dane wejściowe i wyjściowe:

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

Czy "mają tam być?
Dr Belisarius

@belisarius To, jak ciągi są reprezentowane w k. Jeśli chcesz napisać na standardowe wyjście, możesz użyć {-1@" "/:',:''x@'/:!max@#:'x:" "\:x;}(37 znaków), co dałoby wynik bez"
tmartin

4
Cóż, myślę, że wynik powinien być wymagany, niezależnie od języka
dr belisarius

2

Pyton:

Jeden wiersz kodu do przetworzenia żądła:

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

Jestem pewien, że można więcej grać w golfa, ale oto wstępne rozwiązanie w pythonie.

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

Ulepszenia:

  • split ("") => split ()
  • usunięto dodatkowe spacje

Dobra robota! Jeśli zaczniesz od i=mi
powrócisz

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

Algorytm jest bardzo prosty; tylko grał w golfa. Kod ma 61 bajtów plus 2 bajty dla -naopcji, które musi działać. Od ruby -h:

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

Przykładowy przebieg:

$ 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 bajtów

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

Ktoś inny już to zrobił lepiej, ale równie dobrze mogę to rzucić. Dodaje spacje do każdego słowa na wejściu, dopóki nie będzie takiej samej długości jak najdłuższe (aby uniknąć błędów indeksu dla następnej części), a następnie drukuje cth literę każdego słowa, podczas gdy cprzechodzi od 0 do długości każdego łańcucha.

Wymyśliłem znacznie lepszy sposób na zrobienie tego i wyciąłem 25 bajtów. Zamiast dopełniać ciągi znaków spacjami, aby uniknąć błędu indeksu, obsługuję błąd bezpośrednio! Ilekroć nie ma nic do druku, drukować pojedyncze miejsca w jego miejsce z try:print w[c],, except:print' ',. Przypomniałem sobie również, że nie potrzebuję spacji między instrukcją print a literałem łańcuchowym, co pozwoliło zaoszczędzić jeden bajt.

Zauważ, że Python 2 pozwala łączyć tabulatory i spacje i uważa je za osobne poziomy wcięcia. Interpreter Markdown SE zastępuje znak tabulacji czterema spacjami, ale każda linia tego programu, z wyjątkiem pierwszej, ma dokładnie jeden bajt wcięcia.

Formatowanie było dość łatwe, ponieważ print 'something',wydruki 'something 'zamiast 'something\n'. Zrobiłem to dla każdej postaci i użyłem pustej printinstrukcji, aby uzyskać nowy wiersz tam, gdzie go potrzebowałem.


2

C, 111 110 95 90 bajtów

To rozwiązanie wykorzystuje kody sterujące VT-100 do przesuwania kursora na terminalu

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

^[sekwencja jest symbolem zastępczym dla pojedynczego znaku ASCII ESC, które nie mogą być wyświetlane tutaj.

  • ^[7 zapisuje bieżącą pozycję wskaźnika
  • ^[8 przywraca pozycję kursora do zapisanej pozycji
  • ^[[2C przesuwa się o 2 kroki w prawo
  • ^[[B przesuwa się o 1 stopień w dół

edit 1:^[[D (1 krok w lewo) VT-100 kod został zastąpiony przez backspace (pokazane jako ^Htutaj, ale jest tylko jeden znak ASCII); również zapomniałem instrukcji „oddzielone spacjami”, teraz naprawionej

edycja 2:

7 znaków zapisanych przy użyciu forpętli zamiast whilei 32zamiast ' ':

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

8 kolejnych znaków zapisanych przez wywołanie o jeden mniej printf: ?:operator printfparametrów trójargumentowych jest teraz używany w parametrach

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

edycja 3:

Pozbyłem się zmiennej lokalnej s, działając bezpośrednio z argvaka v. To jest całkowicie ohydne. Ale zapisałem 4 znaki. Otrzymuje również ==z ^i dlatego włącza się ?:argumenty, aby zapisać 1 char.

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

Stosowanie

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

Wersja bez gry w golfa (pierwsza wersja)

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

Wersja bez gry w golfa (ostatnia wersja)

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
Ta wersja bez gry w golfa wygląda podejrzanie jak Befunge . :)
DLosc

2

ja odpowiedział na to pytanie już dawno temu. Właściwie był to jeden z moich pierwszych wpisów na stronie. Niedawno zetknąłem się z tym ponownie i byłem trochę zawstydzony. 112 bajtów ?! Gorszący. Więc dałem mu kolejny strzał:

Python 3 - 92 bajty

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

W ciągu 109 dni od opublikowania pierwszej odpowiedzi lubię myśleć, że przeszedłem długą drogę. Nawet coś w stylu używania Pythona 3 powyżej wersji 2.7 1 nie przyszło mi do głowy. Z tym kodem golfowym poniżej 100 bajtów moja dusza może w końcu odpocząć i mogę przejść do życia pozagrobowego.

Wyjaśnienie

s=input().split()

To dostaje linię od stdin i tworzy listę, dzieląc ją na znaki spacji. Jedyną białą spacją, która może znajdować się na wejściu, są spacje, więc ten wiersz zawiera listę słów.

Weźmy drugą linię od środka:

                                           max(map(len,s))

mapprzyjmuje funkcję i iterowalną argumentację. Stosuje funkcję do każdego elementu iterowalnego i zwraca nową iterowalność wyników. Tutaj tworzę iterowalną długość każdego słowa wejściowego. maxpobiera maksymalną wartość z iterowalnego. To daje nam najdłuższe słowo na wejściu.

                                  [a.ljust(              )for a in s]

Zrozumienie listy jest podobne do map. Robi coś z każdym elementem iterowalnym i zwraca listę wyników. Dla każdego słowa na wejściu robię that_word.ljust(trochę kodu ). ljustjest skrótem od „left justify”. Jako argument przyjmuje liczbę całkowitą i dodaje spacje do łańcucha, dopóki nie będzie on tak długi.

                             zip(*                                    )

To fajna sztuczka. W tym kontekście *oznacza „rozpakuj to iterowalne jako wiele argumentów”. W ten sposób zipmożna użyć do transponowania macierzy (np. zip(*[(1,2),(3,4)])-> [(1,3),(2,4)]). Jedynym ograniczeniem jest to, że wszystkie wiersze w macierzy muszą mieć tę samą długość lub elementy ze wszystkich rzędów, ale najkrótsze są odcinane, aby pasowały.

                map(' '.join,                                          )

Wiemy już, co maprobi. Jedyną nową rzeczą jest to join, że pobiera iterowalne ciągi znaków i czyni z nich pojedynczy ciąg znaków, używając ogranicznika, do którego jest dołączony. Na przykład 'a'.join(['I', 'can', 'play', 'the', 'saxophone'])2 staje się Iacanaplayatheasaxophone.

print('\n'.join(                                                        ))

To joinzajmuje kilka ciągów znaków i rozdziela je znakami nowej linii. Pozostało printtylkostdout i skończymy!

Teraz wszyscy razem:

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

Znajdź długość najdłuższego słowa z wprowadzanego tekstu, dodaj spacje do każdego słowa, aż będą one tej samej długości, transponuj za pomocą zip(*3 lewy, użyj, joinaby oddzielić każdy znak w wierszu spacjami, joinponownie, aby oddzielić każdy wiersz nową linią, i wydrukuj! Nieźle jak na jedyną linię nieobsługującą wprowadzania w programie 92-bajtowym.


1. Dodatkowe znaki wydane w print()nawiasach są przeważone przez 4 znaki, z których upuszczam raw_input()-> input().
2. Nie mogę grać na saksofonie.
3 ). Nie ma za co.


2
Nie mam pojęcia, dlaczego to jest CW. Mogłem przypadkowo nacisnąć przycisk. No cóż.
undergroundmonorail

Możesz zmienić print("\n".join(...))na *map(print,...),. Wypróbuj online!
Jo King,

2

05AB1E , wynik 8 -20 -21 ( 30 29 bajtów - 50 premii)

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

Wypróbuj online (zwykłe wprowadzanie pojedynczej linii).
Wypróbuj online (odwrócone wejście wieloliniowe).

Wyjaśnienie:

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

Oryginalna 8-bajtowa odpowiedź:

#ζεSðý}»

Wypróbuj online.

Wyjaśnienie:

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

Najwyraźniej Mathematica nie jest najlepsza w tym przypadku:

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

Grafika matematyczna

Uwaga ^T(transpozycja) to tylko jeden znak (teraz nie mogę znaleźć odpowiedniego kodu)


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

Próba

hello, world! this is code golf

hwticg
eohsoo
lri dl
lls ef
od    
,! 

1

GolfScript [41 bajtów]

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

Jak to działa:

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

Można zobaczyć demo online tutaj .

PS: To mój pierwszy kod GolfScript w historii, więc nie oceniaj mnie ściśle;)


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

Wynik:

$ ./transpose.sh Witaj, świecie! Mam na imię Foo.
HWM ni F.
eoyaso
lrmo
lle.
od       
,!       
$ 

Sugestia dotycząca aktualizacji: zwrotki w celu zastąpienia poleceń są nieaktualne. Używanie $()konstrukcji jest obecnie powszechną metodą zastępowania poleceń.
Yokai

@Yokai - To jest golf golfowy - tutaj optymalizujemy długość kodu, a nie zgodność ze standardami / najlepszymi praktykami. codegolf.stackexchange.com/a/25572/11259
Digital Trauma

Pomyślałem, że odkąd zmieniła się norma dotycząca zastępowania poleceń, sugerowałbym aktualizację. Nie musisz To była tylko sugestia. I tak dodałby tylko jedną nową postać do liczby.
Yokai,

1

APL: 18

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

Wyjaśnienie:

a ← '', umieść spację przed ciągiem i przypisz do

'' = znajdź spacje, tworzy wartość logiczną

1 ↓ ¨a⊂⍨ tworzy podciągi zaczynające się tam, gdzie wartość logiczna ma jedynki i upuszcza pierwszy element każdego (więc spację)

⍉ ↑ Wykonaj macierz z powstałych podciągów i odwróć ją wzdłuż przekątnej


1

R , 81 bajtów

Zapisz bajt, przechowując znak nowej linii jako e, który może być używany w obu scanpołączeniach, w porównaniu i cat.

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

Wypróbuj online!


1

K (oK) , 26 bajtów

Rozwiązanie:

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

Wypróbuj online!

Wyjaśnienie:

`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

Weź 1 - 166. Cofanie list było potrzebne, aby pop działał w pożądanej przeze mnie kolejności, ale wydawało się to marnotrawstwem. A kiedy próbowałem połączyć w jedno rozumienie dla zabawy, pop popsuł wszystko.

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)

Weźmy 2 - 119. Zmieniłem więc na proste indeksowanie list. Nadal jednak wydaje się niezgrabny, zwłaszcza wypełnienie spacjami i nowe linie.

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

Weź 3 - dzięki @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]można skrócić do map(len,w), .split(' ')do .split()i .join([...])do .join(...).
grc

I nie poszły na kodzie w zbyt wiele szczegółów, więc to może nie działać, ale: „cofania list był potrzebny, aby pop pracę w kolejności chciałem” nie można użyć v.pop(0)do pop pierwszy element zamiast ostatni?
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

Gra w golfa:

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

Wyjaśnione:

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

Przykład:

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

0

JavaScript, 139 (156 z wyjściem 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);

Myślę, że jest tak golfowy, jak tylko mogę. Po prostu dzielę, znajduję największe słowo i odpowiednio transponuję, dodając spacje, jeśli znak nie istnieje w krótszych słowach. Więcej niż poprzednio przesłana odpowiedź JavaScript, ale ta odpowiedź nie działa?


0

Japt -R , 5 bajtów

¸y¬m¸

Spróbuj


Wyjaśnienie

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

0

Pyth, 8 bajtów

jbjL\ Cc

Wypróbuj online!

Całkiem proste. Pobiera dane wejściowe ujęte w cudzysłów, tj"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
Culega skróceniu do długości najkrótszego wpisu, więc to nie działa . Oto szybka poprawka, która również ma 8 bajtów.
hakr14

0

APL (NARS), 79 znaków, 158 bajtów

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

test:

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

Stara funkcja ma wyjście nie idealne:

  {⍪¨(' '≠⍵)⊂,⍵}'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             
 ,  !
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.