Given a width and a block of
text containing possible hyphen-
ation points, format it fully-
justified (in monospace).
Totalmente justificado significa que está alineado a la izquierda y a la derecha, y se logra aumentando el espacio entre las palabras hasta que encaje cada línea.
Relacionado:
- Justifica un texto agregando espacios
- Alinear el texto a un bloque
- Y de alguna manera, esto puede considerarse el siguiente paso en el procesamiento de texto # 1: guión (que parece que nunca se ha publicado).
Entrada
Puede tomar la entrada en cualquier formato que desee. Se le dará:
- Un ancho objetivo (en caracteres), en el rango de 5-100 (inclusive);
- Un bloque de texto que contiene palabras posiblemente con guiones. Esto podría ser una cadena separada por espacios, un conjunto de palabras o un conjunto de conjuntos de fragmentos de palabras (o cualquier otra representación de datos que desee).
Una entrada típica podría ser:
Width: 25
Text: There's no bu-si-ne-ss lik-e s-h-o-w busine-ss, n-o bus-iness I know.
Donde los guiones denotan posibles puntos de separación de sílabas, y los espacios denotan límites de palabras. Una posible representación alternativa del texto:
[["There's"], ["no"], ["bu", "si", "ne", "ss"], ["lik", "e"], (etc.)]
Salida
El texto de entrada con espacios agregados entre palabras, líneas nuevas en el ancho de la columna y puntos de separación silábica elegidos para justificarlo completamente al ancho de la columna. Para las funciones, se puede devolver una matriz de cadenas (una para cada línea) en lugar de usar la separación de nueva línea.
Una posible salida para la entrada anterior podría ser:
There's no business like
show business, no bus-
iness I know.
Tenga en cuenta que todos los guiones se han eliminado, excepto el que está en el "bus-iness" final, que se mantiene para mostrar que la palabra se ajusta a la siguiente línea y se eligió para garantizar que la segunda línea contenga la mayor cantidad de texto posible.
Reglas
Dentro de cada línea, el número de espacios entre las palabras no puede variar en más de 1, pero el lugar donde inserte los espacios adicionales depende de usted:
hello hi foo bar <-- not permitted (1,1,5) hello hi foo bar <-- not permitted (2,1,4) hello hi foo bar <-- OK (2,2,3) hello hi foo bar <-- OK (2,3,2) hello hi foo bar <-- OK (3,2,2)
Ninguna línea puede comenzar o terminar con espacios (excepto la última línea, que puede terminar con espacios).
La última línea debe dejarse justificada, conteniendo espacios individuales entre cada palabra. Puede ir seguido de espacios en blanco arbitrarios / una nueva línea si lo desea, pero esto no es obligatorio.
Las palabras consistirán en AZ, az, 0-9 y puntuación simple (
.,'()&
)Puede suponer que ningún fragmento de palabra será más largo que el ancho objetivo, y siempre será posible llenar líneas de acuerdo con las reglas (es decir, habrá al menos 2 fragmentos de palabra en cada línea, o un fragmento de 1 palabra que llene la línea perfectamente)
Debe elegir puntos de separación silábica que maximicen el número de caracteres de palabras en líneas anteriores (es decir, las palabras deben consumirse con avidez por líneas), por ejemplo:
This is an input stri-ng with hyph-en-at-ion poi-nts. This is an input stri- <-- not permitted ng with hyphenation points. This is an input string with hyph- <-- not permitted enation points. This is an input string with hyphen- <-- OK ation points.
El código más corto en bytes gana
Ejemplos
Width: 20
Text: The q-uick brown fox ju-mp-s ove-r t-h-e lazy dog.
The quick brown fox
jumps over the lazy
dog.
Width: 32
Text: Given a width and a block of text cont-ain-ing pos-sible hyphen-ation points, for-mat it ful-ly-just-ified (in mono-space).
Given a width and a block of
text containing possible hyphen-
ation points, format it fully-
justified (in monospace).
Width: 80
Text: Pro-gram-ming Puz-zles & Code Golf is a ques-tion and ans-wer site for pro-gram-ming puz-zle enth-usi-asts and code golf-ers. It's built and run by you as part of the St-ack Exch-ange net-work of Q&A sites. With your help, we're work-ing to-g-et-her to build a lib-rary of pro-gram-ming puz-zles and their sol-ut-ions.
Programming Puzzles & Code Golf is a question and answer site for programming
puzzle enthusiasts and code golfers. It's built and run by you as part of the
Stack Exchange network of Q&A sites. With your help, we're working together to
build a library of programming puzzles and their solutions.
Width: 20
Text: Pro-gram-ming Puz-zles & Code Golf is a ques-tion and ans-wer site for pro-gram-ming puz-zle enth-usi-asts and code golf-ers. It's built and run by you as part of the St-ack Exch-ange net-work of Q&A sites. With your help, we're work-ing to-g-et-her to build a lib-rary of pro-gram-ming puz-zles and their sol-ut-ions.
Programming Puzzles
& Code Golf is a
question and answer
site for programming
puzzle enthusiasts
and code golfers.
It's built and run
by you as part of
the Stack Exchange
network of Q&A
sites. With your
help, we're working
together to build a
library of program-
ming puzzles and
their solutions.
Width: 5
Text: a b c d e f g h i j k l mm nn oo p-p qq rr ss t u vv ww x yy z
a b c
d e f
g h i
j k l
mm nn
oo pp
qq rr
ss t
u vv
ww x
yy z
Width: 10
Text: It's the bl-ack be-ast of Araghhhhh-hhh-h-hhh-h-h-h-hh!
It's the
black be-
ast of
Araghhhhh-
hhhhhhhhh-
hhh!
fuente
anybod-y
con un ancho de 7, ¿podemos elegir la salida deanybody
oanybod-\ny
?Respuestas:
JavaScript (ES6), 218 bytes
Toma argumentos en sintaxis de curry (
f(width)(text)
) y la entrada de texto está en el formato de matriz doble descrito en el desafío. Las cadenas se convierten a ese formato a través de.split` `.map(a=>a.split`-`))
. Además, las nuevas líneas son nuevas líneas literales dentro de las cadenas de plantilla.Sin golf y reorganizado
La idea aquí era pasar por cada parte de la cadena completa y construir cada línea una parte a la vez. Una vez que se completa una línea, aumenta el espacio entre palabras de izquierda a derecha hasta que se colocan todos los espacios adicionales.
Fragmento de prueba
fuente
GNU sed
-r
, 621 bytesToma la entrada como dos líneas: el ancho como un número unario primero y la cadena como segundo.
Estoy seguro de que esto se podría jugar mucho más, pero ya le he dedicado demasiado tiempo.
Pruébalo en línea!
Explicación
El programa funciona en dos fases: 1. Dividir y 2. Justificar. Para lo siguiente, supongamos que nuestra entrada es:
Preparar
Primero leemos la entrada, moviendo la primera línea (el ancho como un número unario) al espacio de espera (
x
), luego agregamos la siguiente línea (N
) y luego una copia del ancho del espacio de espera (G
) al espacio del patrón. ComoN
nos dejó con un líder,\n
lo reemplazamos!@
, que usaremos como cursores en la Fase 1.Ahora el contenido del espacio de retención es
1111111111111
(y no cambiará de ahora en adelante) y el espacio del patrón es (en el formato dell
comando "imprimir sin ambigüedades" de sed ):Fase 1
En la Fase 1, el
@
cursor principal avanza un carácter a la vez, y para cada personaje1
se elimina un "contador" al final del espacio del patrón. En otras palabras,@foo\n111$
,f@oo\n11$
,fo@o\n1$
, etc.El
!
cursor se arrastra detrás del@
cursor, marcando lugares que podríamos romper si el contador llega a 0 en el medio de la línea. Un par de rondas se vería así:Aquí hay un patrón que reconocemos: un espacio seguido inmediatamente por el
@
cursor. Como el contador es mayor que 0, avanzamos el marcador de ruptura, luego seguimos avanzando el cursor principal:Aquí hay otro patrón:
-@
y todavía tenemos 7 en el contador, así que avanzamos el cursor de nuevo y seguimos avanzando:Aquí hay un patrón diferente: un guión que precede inmediatamente al cursor de ruptura y otro que precede al cursor principal. Eliminamos el primer guión, avanzamos el cursor de ruptura y, como eliminamos un carácter, agregamos 1 al contador.
Seguimos avanzando el cursor principal:
Similar a antes, pero esta vez el cursor principal precede a un espacio en lugar de seguir un guión. Eliminamos el guión, pero como también avanzamos el cursor principal, tampoco incrementamos ni disminuimos el contador.
Finalmente, nuestro contador ha llegado a cero. Como el carácter después del cursor principal es un espacio, insertamos una nueva línea y colocamos ambos cursores inmediatamente después. Luego reponemos el contador (
G
) y comenzamos de nuevo.La fase 1 continúa, avanzando los cursores y haciendo coincidir varios patrones, hasta que el
@
cursor llega al final de la cadena.Al final de la Fase 1, nuestro espacio de patrón se ve así:
O:
Fase 2
En la Fase 2 usamos
%
como cursor y usamos el contador de manera similar, comenzando así:Primero, contamos los caracteres en la primera línea avanzando el cursor y eliminando 1s del contador, después de lo cual tenemos;
Como el contador es 0, no hacemos nada más en esta línea. La segunda línea también tiene el mismo número de caracteres que el contador, así que pasemos a la tercera línea:
El contador es mayor que 0, por lo que movemos el cursor de regreso al comienzo de la línea. Luego encontramos la primera serie de espacios y agregamos un espacio, decrementando el contador.
El contador es mayor que 0; dado que el cursor ya está en la última (única) ejecución de espacios en la línea, lo movemos de regreso al comienzo de la línea y lo hacemos nuevamente:
Ahora el contador es 0, entonces movemos el cursor al comienzo de la siguiente línea. Repetimos esto para cada línea excepto la última. ¡Ese es el final de la fase 2 y el final del programa! El resultado final es:
fuente
gsed (GNU sed) 4.4
me salegsed: -e expression #1, char 16: ":" lacks a label
. ¿Puedes agregar una nota sobre exactamente cómo lo estás invocando? (Estoy usandoprintf "%s\n%s" "$1" "$2" | gsed -r '<code here>';
)-r
bandera, por lo que el enlace de TiO anterior va a la página bash.!
(aunque como me perdí!
de la lista de posibles caracteres especiales, yo no sostendrá eso contra eso).JavaScript (ES6), 147 bytes
Toma entrada como
(width)(text)
.Pruébalo en línea!
Comentado
fuente
APL (Dyalog Unicode) ,
129 123 121 118 111 109 107 104 10095 bytes SBCSPruébalo en línea!
fuente
Stax ,
5150 bytesEjecutar y depurarlo
fuente
Python 2 , 343 bytes
Pruébalo en línea!
fuente
print'\n'.join(L[:-1])
lugar defor e in L[:-1]:print e