Alinear el texto a un bloque


10

Tarea

Su tarea es escribir un programa completo, que alineará la entrada dada a un bloque de tamaño dado.

Entrada:

40
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Salida:

Lorem  ipsum dolor sit amet, consectetur
adipiscing  elit,  sed do eiusmod tempor
incididunt  ut  labore  et  dolore magna
aliqua.  Ut  enim  ad minim veniam, quis
nostrud   exercitation  ullamco  laboris
nisi ut aliquip ex ea commodo consequat.
Duis  aute  irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu
fugiat  nulla  pariatur.  Excepteur sint
occaecat cupidatat non proident, sunt in
culpa  qui  officia deserunt mollit anim
id est laborum.
                <-- note the linebreak

Detalles de entrada

  • Tienes que escribir todo el programa ejecutable / interpretable.
  • Puede suponer que la entrada contiene solo caracteres ASCII imprimibles y no contiene tabulación \t.
  • La entrada puede contener saltos de línea. Si no es así, que se dan como \n, \ro \r\nen función de lo que espera. Sin embargo, están unidos en todo el aporte.
  • La entrada se puede dar en STDIN, o como argumentos de línea de comando. Puede usar ambos si se ajusta a sus necesidades (por ejemplo, lea el tamaño del bloque de los argumentos del comando e ingrese como stdin). Sin embargo, no puede codificar ninguna parte de la entrada a su programa.
  • Puede suponer que el tamaño del bloque se da como un > 0número positivo ( ) válido .
  • El salto de línea en la entrada se trata de la misma manera que un espacio (por lo tanto, separador de palabras)
  • Si la entrada contiene múltiples espacios concurrentes, se tratan como uno.

Detalles de salida

  • La salida debe formatearse en un bloque de tamaño determinado. El formateo se realiza agregando espacios entre palabras.
  • El número de espacios entre palabras en una línea tiene que ser igual para esa línea. Si no es posible, se deben agregar espacios adicionales uno por uno después de las palabras que comienzan desde la izquierda.
  • Si la palabra es más larga que el tamaño de bloque dado, se mantendrá sola en una sola línea (y excederá el tamaño de bloque).
  • Si la salida debe contener solo una palabra, se alineará a la izquierda.
  • La última línea de la salida debe estar alineada a la izquierda, con solo un espacio entre las palabras. La última línea de la salida tiene que terminar con el salto de línea final.

La respuesta, con el menor número de bytes después de un tiempo, gana.
Si necesita información adicional, deje un comentario.

Casos de prueba

Input:
10
Lorem ipsum dolor sit amet,
consectetur adipiscing elit, sed do eiusmod tempor

Output:
Lorem
ipsum
dolor  sit
amet,
consectetur
adipiscing
elit,  sed
do eiusmod
tempor

Input:
20
Lorem     ipsum

dolor  sit amet,

Output:
Lorem   ipsum  dolor
sit amet,

Input:
1
Lorem ipsum dolor sit amet

Output:
Lorem
ipsum
dolor
sit
amet

Relacionado. (Finalmente, un segundo desafío para mi etiqueta de tipografía que ya se eliminó automáticamente;))
Martin Ender

@ MartinBüttner No sabía que tal etiqueta existe.
Zereges

@ Vɪʜᴀɴ Debe escribir todo el programa ejecutable / interpretable.
Dennis


@ppperry Interesante, por alguna razón, evitó mis habilidades de búsqueda
Zereges

Respuestas:



1

Ruby, 179 caracteres

n=gets.to_i
s=t=''
$<.read.split.map{|w|if(t+w).size>=n
0while t.size<n&&(1..n).any?{|i|t.sub!(/[^ ]#{' '*i}(?=[^ ])/){|x|x+' '}}
s+=t+?\n
t=w
else
t+=' '+w
t.strip!
end}
puts s,t

Demasiado tiempo...

Versión semi-sin golf:

n = gets.to_i
s = t = ''
$<.read.split.map{|w|
    if (t + w).size >= n
        0 while t.size < n && (1..n).any?{|i|t.sub!(/[^ ]#{' '*i}(?=[^ ])/){|x|x+' '}}
        s += t + ?\n
        t = w
    else
        t += ' ' + w
        t.strip!  # this is only necessary because of the very first word >:(
    end
}
puts s,t

0

CJam, 87 bytes

l~:LS*qNSerS%{(2$1$a+_S*,L>{;a\}{\;@;\}?}h;S*a]1>{I1>{LIs,-I,(md1b\aI,(*.+Sf*I.\}I?N}fI

Esto aún debería ser golfable. Pruébelo en línea en el intérprete de CJam .


0

Retina , 133 bytes

\s+

+`((1)*1 )((?<-2>.)*\S|\S+) 
:$3<LF>$1
m+`^(?=.(.)+$[^<TB>]*^(?>(?<-1>1)+)1)((.*):(\S+ +)|(\S+ +)(.*):)
$3$4$5 :$6
+`:|<LF>1+| (?= .*$)
<empty>

El <empty>representa una línea final vacía. Para ejecutar el código, coloque cada línea en un archivo separado, reemplácela <LF>con caracteres de salto de línea (0x0A) y <TB>con una pestaña (0x09). Agregaré una explicación cuando termine de jugar al golf.

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.