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!



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

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


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

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

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


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.


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

¿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())))

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

¡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"""

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

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.


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

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.


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)

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)


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

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


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

Salida:

$ ./transpose.sh ¡Hola, mundo! Me llamo Foo
HWM ni F
eoyaso
lrmo
lle.
sobredosis       
,!       
PS 

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


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!


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

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

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

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

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?


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

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

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             
 ,  !
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.