Imprime una cadena con palabras verticales

12

Su tarea es tomar una cadena de entrada de caracteres ascii y generar la cadena como una serie de palabras verticales separadas por espacios. A continuación se muestra un ejemplo:

Dada la cadena:

Hello, World! My name is Foo.

la salida debe ser:

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

Se otorgarán 10 puntos de bonificación si su programa maneja correctamente las cadenas que necesitan envolver la terminal, que estableceremos en 80 caracteres.

¡50 puntos si su programa también puede hacer lo contrario!

Foo Barrigno
fuente
Muy similar a Transponer una página de texto .
manatwork
3
@manatwork: supongo que sí. Sin embargo, no es idéntico, y podría argumentar que mi problema es un poco más fácil.
Foo Barrigno
No es 100% idéntico, pero está lo suficientemente cerca como para contarlo como un duplicado: la reducción para hacerlo idéntico es simplemente reemplazar cada espacio con dos líneas nuevas.
Peter Taylor
1
@PeterTaylor: No del todo. Mi problema no tiene ningún requisito para respetar las nuevas líneas en la cadena original. Ese problema requiere que las nuevas líneas se conviertan en espacios y los espacios se conviertan en dos nuevas líneas. No es una reducción trivial.
Foo Barrigno

Respuestas:

10

J, 15

|:>'\S+| 'rxall

Uso:

   |:>'\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        
, !        
grc
fuente
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";}

Mi primer código de golf :)

Wolle Vanillebär Lutz
fuente
¡Es genial para tu primer intento!
Foo Barrigno
Debe intentar hacer su código lo más corto posible, por ejemplo, eliminar espacios, tampoco "Input ?"afecta realmente el comportamiento del programa, elimínelo también.
mniip
Errores arreglados. Debería funcionar como se espera :)
Wolle Vanillebär Lutz
1
Funciona correctamente ahora. Pero algunas cosas menores: no necesita la variable N, almacene la matriz en lengthlugar de pedirla dos veces, algunas llaves sin sentido, algunos puntos y coma innecesarios. 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). (En las Normas de JavaScript para IO pregunta meta la opinión sobre todo acordado fue que depender de salida implícita de REPL no debe considerarse correcta.)
manatwork
1
(no probado) if(A[i][y]){B+=A[i][y];}else{B+=" ";}=>B+=(x=A[i][y])?x:" "
daniero
5

APL, 22

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

Explicación

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

Ejemplo

      {⍉⊃⍵⊂⍨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        
, !        
Tobia
fuente
3

Ruby, 91 87

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

¡Hurra, vencí a Perl! :RE

Rubí, 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

Simplemente detecta nuevas líneas y aplica un manejo especial si se detectan.

Ejecútalo como

ruby transposegolf.rb < transposegolfinput.txt
Pomo de la puerta
fuente
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);

Con la cadena de ejemplo definida:

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

Puede copiar la segunda declaración en la consola de su navegador.

No minificado:

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

Enlace JsFiddle: http://jsfiddle.net/FzMvK/

Mi primer post de código de golf: P

RononDex
fuente
Muy bien hecho
Foo Barrigno
@FooBarrigno respuesta actualizada para apoyar reversa
RononDex
@FooBarrigno Respuesta actualizada, eliminó el soporte inverso y cambió la lógica por completo para reducir el conteo de bytes
RononDex
Inteligente, me gusta. ¿No puedes simplemente cambiar a float:rightmarcha atrás?
Danny
2
Depende de lo que significa "revertir". Si la primera letra debe estar en la parte inferior, entonces no funcionará. Si simplemente está invirtiendo las palabras, entonces debería funcionar sí
RononDex
2

Perl - 92 97

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

Hace el trabajo de una manera bastante directa.

mniip
fuente
No hay necesidad de paréntesis alrededor de las expresiones de modificadores de enunciados .
manatwork
Tenga en cuenta que, whilecomo se usa aquí, también se modifica la instrucción.
manatwork
¿Lo es? ¿No es un do{}while()bucle?
mniip
No dono tiene nada más, solo un bloque. El whilees una cosa separada.
manatwork
2

K, 33

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

Ejemplo de entrada y salida:

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        "
", !        "
tmartin
fuente
¿Se "supone que están allí?
Dr. belisario
@belisarius Así se representan las cadenas en k. Si específicamente desea escribir en stdout, puede hacerlo con {-1@" "/:',:''x@'/:!max@#:'x:" "\:x;}(37 caracteres), lo que produciría la salida sin"
tmartin
44
Bueno, creo que la salida debería ser la requerida, a pesar del idioma
Dr. belisario
2

Pitón:

Una línea de código para procesar la picadura:

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())))
Kevin
fuente
2

Python 2.7, 108 103

Estoy seguro de que esto se puede jugar más, pero aquí hay una solución inicial en 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

Mejoras:

  • split ("") => split ()
  • eliminado algunos espacios adicionales
Scleaver
fuente
¡Buen trabajo! Si comienza con un i=mciclo y baja a 0, puede afeitar otros 3 caracteres para obtener incluso 100.
DLosc
2

F #, 187

let o=Console.ReadLine()
let s=o.Split(' ')
let m=s|>Seq.map String.length|>Seq.max
for l=0 to m-1 do
 for w in s|>Seq.map(fun x->x.PadRight(m,' ').[l])do printf"%c "w
 printfn"%s"""
m0sa
fuente
2

Rubí, 63

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

El algoritmo es muy sencillo; solo golf. El código tiene una longitud de 61 bytes, más 2 bytes para las -naopciones que necesita para funcionar. De ruby -h:

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

Ejecución de muestra:

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

Alguien más ya lo ha hecho mejor, pero bien podría tirar esto. Agrega espacios a cada palabra en la entrada hasta que tenga la misma longitud que la más larga (para evitar errores de índice en la siguiente parte), luego imprime la cletra de cada palabra mientras cva de 0 a la longitud de cada cadena.

Se me ocurrió una forma mucho mejor de hacer esto y recorté 25 bytes. En lugar de rellenar cadenas con espacios para evitar el error de índice, ¡manejo el error directamente! Siempre que no hay nada para impresión, se imprime un solo espacio en su lugar con try:print w[c],, except:print' ',. También recordé que no necesito un espacio entre una declaración de impresión y un literal de cadena, que guardó un byte.

Tenga en cuenta que Python 2 le permite mezclar pestañas y espacios y los considera niveles separados de sangría. El intérprete Markdown de SE reemplaza un carácter de tabulación con cuatro espacios, pero cada línea de este programa, excepto la primera, tiene exactamente un byte de sangría.

El formateo fue bastante fácil, ya que print 'something',imprime 'something 'más que 'something\n'. Hice eso para cada personaje, y usé una printdeclaración vacía para obtener la nueva línea donde la necesitaba.

metro subterráneo
fuente
2

C, 111 110 95 90 bytes

Esta solución utiliza códigos de control VT-100 para mover el cursor en el terminal.

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

la ^[secuencia es un marcador de posición para el único carácter ASCII ESC, que no se puede mostrar aquí.

  • ^[7 guarda la posición actual del puntero
  • ^[8 restaura la posición del cursor a la posición guardada
  • ^[[2C se mueve 2 pasos a la derecha
  • ^[[B se mueve 1 paso hacia abajo

edición 1: el ^[[Dcódigo VT-100 (1 paso hacia la izquierda) ha sido reemplazado por un retroceso (mostrado como ^Haquí, pero es solo un carácter ASCII); También olvidé la instrucción "separados por espacios", ahora corregida

editar 2:

7 caracteres guardados usando un forbucle en lugar de while, y en 32lugar de ' ':

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

8 caracteres más guardados llamando a uno menos printf: el ?:operador ternario ahora se usa en los printfparámetros

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

editar 3:

Se deshizo de la variable local s, trabajando directamente con argvaka v. Esto es totalmente horrible. Pero salvó 4 caracteres. También reemplazado ==con ^y por lo tanto cambiado los ?:operandos, para salvar a 1 carácter más.

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

Uso

$ 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ón sin golf (primera versión)

main (int _,char**v) {
    char*s=*++v; // init s with the address of the first letter
    printf("^[7"); // save the current cursor position
    while(*s) 
        ' '==*s ? ( /* if current char is a space */
            s++,printf("^[8^[[2C^[7") /* return to the saved location, move right, save position */
        ) : /* kind of else */
            printf("%c^[[B^H",*s++); /* print the current char, move down, move left */
}

Versión sin golf (última versión)

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 */
} 
Coaumdio
fuente
1
Esa versión sin golf se parece sospechosamente a Befunge . :)
DLosc
2

Me respondieron a esta pregunta hace mucho tiempo. Fue una de mis primeras contribuciones al sitio, en realidad. Hace poco me encontré de nuevo y estaba un poco avergonzado. ¿112 bytes? Inaceptable. Entonces le di otra oportunidad:

Python 3 - 92 bytes

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

En los 109 días desde que publiqué esa primera respuesta, me gusta pensar que he recorrido un largo camino. Incluso algo como usar Python 3 sobre 2.7 1 no se me habría ocurrido. Con este código reducido a menos de 100 bytes, mi alma finalmente puede descansar y puedo proceder a la otra vida.

Explicación

s=input().split()

Esto obtiene una línea stdiny crea una lista dividiéndola en espacios en blanco. El único espacio en blanco que probablemente esté en la entrada es espacios, por lo que esta línea obtiene una lista de palabras.

Tomemos la segunda línea de adentro hacia afuera:

                                           max(map(len,s))

maptoma una función y un iterable como argumentos. Aplica la función a cada elemento del iterable y devuelve un nuevo iterable de los resultados. Aquí, creo un iterable con las longitudes de cada palabra de entrada. maxobtiene el valor máximo de un iterable. Esto nos da la palabra más larga en la entrada.

                                  [a.ljust(              )for a in s]

Una lista de comprensión es similar a map. Hace algo a cada elemento de un iterable, y devuelve una lista de los resultados. Por cada palabra en la entrada, hago that_word.ljust(un código ). ljustes la abreviatura de "justificar a la izquierda". Toma un entero como argumento y agrega espacios a la cadena hasta que sea tan largo.

                             zip(*                                    )

Este es un buen truco. En este contexto, *significa "descomprimir este iterable como argumentos múltiples". De esta manera, zipse puede utilizar para transponer una matriz (por ejemplo, zip(*[(1,2),(3,4)])-> [(1,3),(2,4)]). La única restricción es que todas las filas de la matriz deben tener la misma longitud, o elementos de todas las filas, pero las más cortas se cortan para que coincidan.

                map(' '.join,                                          )

Ya sabemos lo que maphace. Lo único nuevo aquí es join, que toma un iterativo de cadenas y lo convierte en una sola cadena usando el delimitador al que está unido. Por ejemplo, 'a'.join(['I', 'can', 'play', 'the', 'saxophone'])2 se convierte Iacanaplayatheasaxophone.

print('\n'.join(                                                        ))

Esto jointoma un montón de cadenas y las separa por nuevas líneas. ¡Todo lo que queda es printhacerlo stdouty listo!

Todos juntos ahora:

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

Encuentre la longitud de la palabra más larga desde la entrada, agregue espacios a cada palabra hasta que tengan la misma longitud, transponga con el truco zip(*3 , use joinpara separar cada carácter en una fila con espacios, joinnuevamente para separar cada fila con una nueva línea, e imprimir! No está mal para la única línea que no maneja entradas en un programa de 92 bytes.


1. Los print()4 caracteres extraídos de raw_input()-> superan los caracteres adicionales gastados en paréntesis input().
2. No puedo tocar el saxofón.
3 ).. De nada.

metro subterráneo
fuente
2
No tengo idea de por qué esto es CW. Podría haber presionado el botón por accidente. Oh bien.
undergroundmonorail
Puedes cambiar print("\n".join(...))a *map(print,...),. Pruébalo en línea!
Jo King
2

05AB1E , la puntuación de 8 -20 -21 ( 30 29 bytes - 50 de bonificación):

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

Pruébelo en línea (entrada regular de una sola línea).
Pruébelo en línea (entrada inversa de varias líneas).

Explicación:

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

Respuesta original de 8 bytes:

#ζεSðý}»

Pruébalo en línea.

Explicación:

#           # 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)
Kevin Cruijssen
fuente
1

Mathematica 49

Claramente, Mathematica no es el mejor para este:

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

Gráficos de Mathematica

Nota ^T(transposición) es solo un carácter (no puedo encontrar el código de carácter correcto ahora)

Dr. belisario
fuente
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);}

Muestra

hello, world! this is code golf

hwticg
eohsoo
lri dl
lls ef
od    
,! 
Danny
fuente
1

GolfScript [41 bytes]

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

Cómo funciona:

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

Puede ver la demostración en línea aquí .

PD: Este es mi primer código GolfScript, así que no me juzgues estrictamente;)

Visión
fuente
1

R, 116

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

Bash + coreutils, 54

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

Salida:

$ ./transpose.sh ¡Hola, mundo! Me llamo Foo
HWM ni F
eoyaso
lrmo
lle.
sobredosis       
,!       
PS 
Trauma digital
fuente
Sugerencia para una actualización: los backticks para la sustitución de comandos se deprecian. Usar la $()construcción es ahora el método común para la sustitución de comandos.
Yokai
@Yokai: este es el código de golf: aquí estamos optimizando la longitud del código y no el cumplimiento de los estándares / mejores prácticas. codegolf.stackexchange.com/a/25572/11259
Trauma digital
Pensé que, dado que la norma había cambiado para la sustitución de comandos, sugeriría una actualización. No tienes que hacerlo Era solo una sugerencia. De todos modos, solo agregaría un nuevo personaje al conteo.
Yokai
1

APL: 18

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

Explicación:

a ← '', ponga un espacio delante de la cadena y asigne a un

'' = buscar espacios, produce un booleano

1 ↓ ¨a⊂⍨ crea subcadenas que comienzan donde el booleano tiene 1 y suelta el primer elemento de cada una (entonces el espacio)

↑ ↑ Haga una matriz con las subcadenas resultantes e inviértala a lo largo de la diagonal

Moris Zucca
fuente
1

R , 81 bytes

Guarde un byte almacenando una nueva línea como e, que se puede usar en ambas scanllamadas, la llamada de comparación y cat.

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

Pruébalo en línea!

J.Doe
fuente
1

K (oK) , 26 bytes

Solución:

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

Pruébalo en línea!

Explicación:

`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
callejero
fuente
0

Python 2.7 - 119 106

Tome 1 - 166. La inversión de las listas era necesaria para que el pop funcionara en el orden que quería, pero esto parecía un desperdicio. Y cuando traté de combinar una sola comprensión para divertirme, el pop arruinó las cosas.

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)

Tome 2 - 119. Así que cambié a una simple indexación de listas. Sin embargo, todavía parece torpe, especialmente el relleno de espacios y nuevas líneas.

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

Toma 3 - gracias a @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])
psion5mx
fuente
2
[len(l)for l in w]se puede acortar a map(len,w), .split(' ')a .split()y .join([...])a .join(...).
grc
No he revisado su código con demasiados detalles, por lo que esto podría no funcionar, pero: "La inversión de las listas era necesaria para que el pop funcionara en el orden que quería". ¿No podría usar v.pop(0)para hacer estallar el primer elemento en lugar del ¿el último?
undergroundmonorail
0

Pitón 3, 124

a=input().split()
l=max(map(len,a))
print("\n".join(" ".join(c[i] for c in [i+" "*(l-len(i)) for i in a]) for i in range(l)))
gcq
fuente
0

Haskell, 112

Golfizado:

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

Explicado:

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

Ejemplo:

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

JavaScript, 139 (156 con salida de 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);

Creo que esto es lo más golfizado posible. Simplemente me divido, encuentro la palabra más grande y la transpongo en consecuencia, agregando espacios si el carácter no existe en las palabras más cortas. ¿Más que la respuesta JavaScript enviada anteriormente, pero esa respuesta no parece funcionar?

Mate
fuente
0

Japt -R , 5 bytes

¸y¬m¸

Intentalo


Explicación

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

Pyth, 8 bytes

jbjL\ Cc

Pruébalo en línea!

Muy claro. Toma la entrada entre comillas, es decir"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
RK.
fuente
1
Cse trunca a la longitud de la entrada más corta, por lo que esto no funciona . Aquí hay una solución rápida que también es de 8 bytes.
hakr14
0

APL (NARS), 79 caracteres, 158 bytes

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

prueba:

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

La función anterior tiene salida no perfecta:

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