Drucken Sie eine Zeichenfolge mit vertikalen Wörtern


12

Ihre Aufgabe ist es, eine Eingabezeichenfolge von ASCII-Zeichen zu nehmen und die Zeichenfolge als eine Reihe vertikaler Wörter auszugeben, die durch Leerzeichen getrennt sind. Ein Beispiel ist unten gezeigt:

Angesichts der Zeichenfolge:

Hello, World! My name is Foo.

Die Ausgabe sollte sein:

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

10 Bonuspunkte werden gutgeschrieben, wenn Ihr Programm Zeichenfolgen korrekt verarbeitet, die das Terminal umschließen müssen. Dies wird auf 80 Zeichen festgelegt.

50 Punkte, wenn Ihr Programm auch das Gegenteil kann!


Ganz ähnlich wie beim Transponieren einer Textseite .
Manatwork

3
@manatwork: Ich nehme an es ist. Es ist jedoch nicht identisch - und ich könnte argumentieren, dass mein Problem ein wenig einfacher ist.
Foo Barrigno

Es ist nicht zu 100% identisch, aber nahe genug, um als Duplikat zu gelten: Die Reduzierung, um es identisch zu machen, ersetzt einfach jedes Leerzeichen durch zwei Zeilenumbrüche.
Peter Taylor

1
@ PeterTaylor: Nicht ganz. Mein Problem besteht nicht darin, Zeilenumbrüche in der ursprünglichen Zeichenfolge zu berücksichtigen. Für dieses Problem müssen neue Zeilen in Leerzeichen und Leerzeichen in zwei neue Zeilen konvertiert werden. Es ist keine triviale Reduktion.
Foo Barrigno

Antworten:


10

J, 15

|:>'\S+| 'rxall

Verwendung:

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

Mein erster Code Golf :)


Es ist großartig für Ihren ersten Versuch!
Foo Barrigno

Sie sollten versuchen, Ihren Code so kurz wie möglich zu halten, z. B. Leerzeichen entfernen, "Input ?"das Verhalten des Programms auch nicht wirklich beeinflussen und es auch entfernen.
Mittwoch,

Behobene Fehler. Sollte wie erwartet funktionieren :)
Wolle Vanillebär Lutz

1
Funktioniert jetzt korrekt. Aber ein paar Kleinigkeiten: Sie brauchen keine Variable N, speichern das Array, lengthanstatt es zweimal zu fragen, einige sinnlose Klammern, einige unnötige Semikolons. 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). (In der Meta-Frage zu JavaScript-Standards für
E / A

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

5

APL, 22

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

Erläuterung

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

Beispiel

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

Hurra, ich habe Perl besiegt! : D

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

Es erkennt nur Zeilenumbrüche und wendet eine spezielle Behandlung an, wenn sie erkannt werden.

Führen Sie es wie

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

Mit der Beispielzeichenfolge definiert:

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

Sie können die zweite Anweisung in die Konsole Ihres Browsers kopieren.

Nicht abgeschlossen:

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/

Mein erster Code Golfpost: P


Sehr schön gemacht
Foo Barrigno

@FooBarrigno aktualisierte Antwort zur Unterstützung der Umkehrung
RononDex

@FooBarrigno Die Antwort wurde aktualisiert, die umgekehrte Unterstützung wurde entfernt und die Logik wurde vollständig geändert, um die Anzahl der Bytes zu verringern
RononDex

Clever, ich mag es. Kannst du nicht einfach float:rightfür den Rückwärtsgang wechseln ?
Danny

2
Kommt darauf an, was "umgekehrt" bedeutet. Wenn der erste Buchstabe unten sein sollte, funktioniert es nicht. Wenn es einfach ist, die Wörter umzukehren, dann sollte es ja funktionieren
RononDex

2

Perl - 92 97

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

Erledigt die Arbeit auf ziemlich einfache Weise.


Die Ausdrücke der Anweisungsmodifikatoren müssen nicht in Klammern gesetzt werden .
Manatwork

Beachten Sie, dass whilehier auch der Anweisungsmodifikator verwendet wird.
Manatwork

Ist es? Ist es keine do{}while()Schleife?
Mittwoch,

Nee. doselbst hat nichts anderes, nur einen Block. Das whileist eine separate Sache.
Manatwork

2

K, 33

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

Beispiel Ein- und Ausgabe:

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

Sollen die "da sein?
Dr. Belisarius

@belisarius So werden Strings in k dargestellt. Wenn Sie gezielt nach stdout schreiben möchten, können Sie mit {-1@" "/:',:''x@'/:!max@#:'x:" "\:x;}(37 Zeichen), was die Ausgabe ohne"
tmartin

4
Nun, ich denke, die Ausgabe sollte die erforderliche sein, ungeachtet der Sprache
Dr. Belisarius

2

Python:

Eine Codezeile, um den Stich zu verarbeiten:

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

Ich bin mir sicher, dass man mehr Golf spielen kann, aber hier ist eine erste Lösung in 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

Verbesserungen:

  • split ("") => split ()
  • einige zusätzliche Leerzeichen entfernt

Gut gemacht! Wenn Sie mit i=m0 beginnen und eine Schleife bis 0
ausführen

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

Rubin, 63

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

Der Algorithmus ist sehr einfach; nur golfen. Der Code ist 61 Bytes lang, plus 2 Bytes für die -naOptionen, die er benötigt, um zu funktionieren. Von ruby -h:

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

Probelauf:

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

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

Jemand anderes hat es schon besser gemacht, aber ich könnte es genauso gut auf den Tisch legen. Fügt Leerzeichen zu jedem Wort in der Eingabe hinzu, bis es die gleiche Länge wie das längste hat (um Indexfehler für den nächsten Teil zu vermeiden), und druckt dann den cachten Buchstaben jedes Wortes ausc von 0 bis zur Länge jeder Zeichenfolge gegangen wird.

Ich habe mir einen viel besseren Weg ausgedacht und 25 Bytes herausgeschnitten. Anstatt Zeichenfolgen mit Leerzeichen aufzufüllen, um den Indexfehler zu vermeiden, behandle ich den Fehler direkt! Wann immer es nichts zu drucken gibt, drucke ich ein einzelnes Leerzeichen an seiner Stelle mit try:print w[c],,except:print' ', . Ich erinnerte mich auch, dass ich zwischen einer print-Anweisung und einem String-Literal kein Leerzeichen brauche, wodurch ein Byte gespart wurde.

Beachten Sie, dass Sie in Python 2 Tabulatoren und Leerzeichen mischen können und sie als separate Einzugsebenen betrachten. Der Markdown-Interpreter von SE ersetzt ein Tabulatorzeichen durch vier Leerzeichen, aber jede Zeile dieses Programms mit Ausnahme der ersten enthält genau ein Byte Einrückung.

Die Formatierung war ziemlich einfach, da print 'something',Drucke 'something 'eher als 'something\n'. Ich habe das für jedes Zeichen gemacht und eine leere printAnweisung verwendet, um die neue Zeile dort zu platzieren, wo ich sie brauchte.


2

C 111 110 95 90 Bytes

Diese Lösung verwendet VT-100-Steuercodes, um den Cursor auf dem Terminal zu bewegen

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

Die ^[Sequenz ist ein Platzhalter für das einzelne ASCII-ESC-Zeichen, das hier nicht angezeigt werden kann.

  • ^[7 speichert die aktuelle Zeigerposition
  • ^[8 Setzt die Cursorposition auf die gespeicherte Position zurück
  • ^[[2C bewegt sich 2 Schritte nach rechts
  • ^[[B bewegt sich 1 Schritt nach unten

edit 1: Der ^[[DVT-100-Code (1 Schritt links) wurde durch ein Backspace ersetzt (wie ^Hhier gezeigt , jedoch nur ein ASCII-Zeichen). habe auch die Anweisung "durch Leerzeichen getrennt" vergessen, die jetzt behoben ist

2 bearbeiten:

7 Zeichen, die durch Verwenden einer forSchleife anstelle von whileund 32anstelle von gespeichert wurden ' ':

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

8 weitere Zeichen werden durch Aufrufen eines weniger gespeichert printf: Der ternäre ?:Operator wird jetzt in den printfParametern verwendet

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

3 bearbeiten:

Wurde die lokale Variable los sund arbeitete direkt mit argvaka v. Das ist total abscheulich. Aber 4 Zeichen gespart. Ersetzt ==mit ^und ?:vertauscht daher die Operanden, um 1 Zeichen mehr zu sparen.

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

Verwendung

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

Ungolf-Version (erste Version)

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

Ungolf-Version (letzte Version)

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
Diese Version ohne Golf sieht verdächtig aus wie Befunge . :)
DLosc

2

Ich habe diese Frage vor langer Zeit beantwortet . Eigentlich war es einer meiner ersten Beiträge auf der Website. Ich bin kürzlich wieder darauf gestoßen und war irgendwie verlegen. 112 Bytes ?! Inakzeptabel. Also habe ich es nochmal probiert:

Python 3 - 92 Bytes

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

In den 109 Tagen, seit ich diese erste Antwort gepostet habe, denke ich, dass ich einen langen Weg zurückgelegt habe. Sogar so etwas wie Python 3 über 2.7 1 wäre mir nicht eingefallen. Mit diesem Code, der auf unter 100 Bytes reduziert ist, kann sich meine Seele endlich ausruhen und ich kann ins Jenseits vordringen.

Erläuterung

s=input().split()

Dadurch wird eine Zeile abgerufen stdinund eine Liste erstellt, indem diese in Leerzeichen aufgeteilt wird. Das einzige Leerzeichen in der Eingabe ist ein Leerzeichen. In dieser Zeile wird eine Liste mit Wörtern angezeigt.

Nehmen wir die zweite Zeile von innen nach außen:

                                           max(map(len,s))

mapNimmt eine Funktion und eine Iteration als Argumente. Es wendet die Funktion auf jedes Element der Iteration an und gibt eine neue Iteration der Ergebnisse zurück. Hier erstelle ich eine Iterable mit den Längen der einzelnen Eingabewörter. maxRuft den Maximalwert aus einem iterablen Wert ab. Dies bringt uns das längste Wort in der Eingabe.

                                  [a.ljust(              )for a in s]

Ein Listenverständnis ist ähnlich wie map. Mit jedem Element einer Iteration wird etwas ausgeführt, und es wird eine Liste mit den Ergebnissen zurückgegeben. Für jedes Wort in der Eingabe mache ich that_word.ljust(einen Code ). ljustist die Abkürzung für "left justify". Es nimmt eine Ganzzahl als Argument und fügt der Zeichenfolge Leerzeichen hinzu, bis sie so lang ist.

                             zip(*                                    )

Dies ist ein ordentlicher Trick. In diesem Zusammenhang *bedeutet "Entpacken Sie diese iterable als mehrere Argumente". Auf diese Weise zipkann eine Matrix transponiert werden (zB zip(*[(1,2),(3,4)])-> [(1,3),(2,4)]). Die einzige Einschränkung besteht darin, dass alle Zeilen in der Matrix gleich lang sein müssen oder Elemente aus allen Zeilen, aber die kürzesten, entsprechend abgeschnitten werden.

                map(' '.join,                                          )

Wir wissen schon was map. Das einzig Neue hier ist join, dass eine Folge von Strings iteriert und mit dem Trennzeichen, an das sie angehängt ist, zu einem einzelnen String wird. Zum Beispiel 'a'.join(['I', 'can', 'play', 'the', 'saxophone'])2 wird Iacanaplayatheasaxophone.

print('\n'.join(                                                        ))

Dies joinnimmt eine Reihe von Zeichenfolgen und trennt sie durch Zeilenumbrüche. Alles, was bleibt, ist printzu stdoutund wir sind fertig!

Jetzt alle zusammen:

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

Finden Sie die Länge des längsten Wortes aus der Eingabe, fügen Sie Leerzeichen an jedes Wort an, bis es die gleiche Länge hat, transponieren Sie mit dem zip(*3- Trick, jointrennen Sie jedes Zeichen in einer Zeile mit Leerzeichen, joinund trennen Sie jede Zeile mit einer neuen Zeile. und drucken! Nicht schlecht für die einzige nicht eingabebehandelnde Zeile in einem 92-Byte-Programm.


1. Die zusätzlichen Zeichen in print()Klammern werden durch die 4 Zeichen, die ich aus raw_input()-> entferne, aufgewogen input().
2. Ich kann eigentlich kein Saxophon spielen.
3. ). Bitte.


2
Ich habe keine Ahnung, warum das CW ist. Möglicherweise habe ich versehentlich auf den Knopf gedrückt. Naja.
undergroundmonorail

Sie können ändern , print("\n".join(...))zu *map(print,...),. Probieren Sie es online!
Jo King

2

05AB1E , Ergebnis 8 -20 -21 ( 30 29 Bytes - 50 Bonus):

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

Probieren Sie es online aus (normale einzeilige Eingabe).
Probieren Sie es online aus (mehrzeiliger invertierter Eingang).

Erläuterung:

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

Ursprüngliche 8-Byte-Antwort:

#ζεSðý}»

Probieren Sie es online aus.

Erläuterung:

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

Offensichtlich ist Mathematica nicht das Beste für dieses:

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

Mathematica-Grafiken

Hinweis ^T(transponieren) ist nur ein Zeichen (ich kann jetzt nicht den richtigen Zeichencode finden)


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

Stichprobe

hello, world! this is code golf

hwticg
eohsoo
lri dl
lls ef
od    
,! 

1

GolfScript [41 Bytes]

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

Wie es funktioniert:

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

Sie können die Online-Demo hier sehen .

PS: Dies ist mein erster GolfScript-Code, also verurteile mich nicht streng;)


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

Ausgabe:

$ ./transpose.sh Hallo, Welt! Ich heiße Foo.
HWM ni F
eoyaso
lrmo
lle.
od       
,!       
$ 

Vorschlag für ein Update: Backticks für die Befehlsersetzung werden abgeschrieben. Die Verwendung des $()Konstrukts ist jetzt die übliche Methode für die Befehlssubstitution.
Yokai

@Yokai - Dies ist Code-Golf - hier optimieren wir die Codelänge und nicht die Einhaltung von Standards / Best Practices. codegolf.stackexchange.com/a/25572/11259
Digitales Trauma

Ich dachte, da sich die Norm für die Befehlsersetzung geändert hat, würde ich ein Update vorschlagen. Das musst du nicht. Es war nur ein Vorschlag. Es würde sowieso nur ein einziges neues Zeichen zur Zählung hinzugefügt.
Yokai

1

APL: 18

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

Erläuterung:

a ← '', setze ein Leerzeichen vor die Zeichenkette und ordne a zu

'' = finde Leerzeichen, erzeugt einen Booleschen Wert

1 ↓ ¨a⊂⍨ Erstelle Teilstrings, die dort beginnen, wo der Boolesche Wert 1 hat und lösche das erste Element von jedem (also das Leerzeichen).

⍉ ↑ Machen Sie eine Matrix aus den resultierenden Teilzeichenfolgen und kehren Sie sie entlang der Diagonale um


1

R , 81 Bytes

Speichern Sie ein Byte, indem Sie eine neue Zeile als speichern e, die in beiden scanAufrufen, dem Vergleichsaufruf und dem Vergleichsaufruf verwendet werden kann cat.

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

Probieren Sie es online!


1

K (oK) , 26 Bytes

Lösung:

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

Probieren Sie es online!

Erläuterung:

`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

Nehmen Sie 1 - 166. Das Umkehren der Listen war erforderlich, damit Pop in der von mir gewünschten Reihenfolge funktioniert, aber das schien verschwenderisch. Und als ich versuchte, mich zum Spaß zu einem einzigen Verständnis zusammenzuschließen, hat der Pop alles vermasselt.

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)

Nehmen Sie 2 - 119. Also wechselte ich zur einfachen Listenindizierung. Scheint jedoch immer noch klobig zu sein, insbesondere das Auffüllen von Leerzeichen und neuen Zeilen.

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

Nimm 3 - danke an @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]zu können verkürzt werden map(len,w), .split(' ')auf .split()und .join([...])zu .join(...).
Grc

„Die Umkehrung der Listen wurde benötigt Pop Arbeit in der Reihenfolge machen Ich wollte“ Könnten Sie nicht verwenden: Ich habe nicht über den Code in zu viele Details , so könnte dies nicht der Arbeit, aber gegangen , v.pop(0)um Pop das erste Element anstelle des Letzter?
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 gespielt:

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

Erklärt:

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

Beispiel:

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

0

JavaScript, 139 (156 mit console.log-Ausgabe)

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

Ich denke, das ist so gut wie ich es kriegen kann. Ich habe gerade geteilt, das größte Wort gefunden und entsprechend transponiert und Leerzeichen hinzugefügt, wenn das Zeichen in den kürzeren Wörtern nicht vorhanden ist. Mehr als die zuvor übermittelte JavaScript-Antwort, aber diese Antwort scheint nicht zu funktionieren?


0

Japt -R , 5 Bytes

¸y¬m¸

Versuch es


Erläuterung

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

0

Pyth, 8 Bytes

jbjL\ Cc

Probieren Sie es online!

Ziemlich einfach. Nimmt Eingaben in Anführungszeichen, dh"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
Cschneidet auf die Länge des kürzesten Eintrags ab, dies funktioniert also nicht . Hier ist eine schnelle Lösung, die ebenfalls 8 Bytes umfasst.
hakr14

0

APL (NARS), 79 Zeichen, 158 Byte

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

Prüfung:

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

Die alte Funktion hat nicht perfekt ausgegeben:

  {⍪¨(' '≠⍵)⊂,⍵}'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             
 ,  !
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.