(Nota: esta es mi primera pregunta de código de golf, pero por lo que puedo decir, nadie más ha hecho exactamente esto, así que debería ser bueno).
Su tarea es hacer un programa o función que tome una cadena s
y un número entero n
, y devuelva o genere ese texto envuelto en varias líneas. Cada palabra debe estar totalmente en una línea; es decir, no hay palabras divididas en el medio. Cada línea puede tener una n
longitud máxima de caracteres y debe incluir tantas palabras como sea posible en cada línea.
Ejemplo:
s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eget erat lectus. Morbi mi mi, fringilla sed suscipit ullamcorper, tristique at mauris. Morbi non commodo nibh. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed at iaculis mauris. Praesent a sem augue. Nulla lectus sapien, auctor nec pharetra eu, tincidunt ac diam. Sed ligula arcu, aliquam quis velit aliquam, dictum varius erat."
n = 50
output:
Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Sed eget erat lectus. Morbi mi mi, fringilla
sed suscipit ullamcorper, tristique at mauris.
Morbi non commodo nibh. Pellentesque habitant
morbi tristique senectus et netus et malesuada
fames ac turpis egestas. Sed at iaculis mauris.
Praesent a sem augue. Nulla lectus sapien, auctor
nec pharetra eu, tincidunt ac diam. Sed ligula
arcu, aliquam quis velit aliquam, dictum varius
erat.
Su salida puede ser una matriz de cadenas o una sola cadena con saltos de línea. Además, puede asumir que las palabras no serán más largas que n
, así que no se preocupe por tratar casos extraños.
Se aplican las reglas estándar de E / S y se prohíben las lagunas estándar. Se permiten espacios finales.
Como se trata de código de golf , gana la solución de shortes en bytes.
Aquí hay un programa de ejemplo en Python que funcionaría.
fuente
n
es la longitud máxima de la línea, lamento que eso no esté claro. Voy a aclarar Además, las reglas ahora se han actualizado, por lo que una división simple no funciona.Respuestas:
Python 2 , 26 bytes
Pruébalo en línea!
Meh ... los complementos son aburridos ... en cambio, tenga una buena solución de 87 bytes aquí:
Pruébalo en línea!
Salidas de espacios finales.
fuente
PHP , 8 bytes
¡Es cierto que no es la solución más original, pero PHP tiene una función nativa que se adapta perfectamente a tus requisitos!
wordwrap
:Use así:
O Pruébelo en línea!
fuente
JavaScript (ES6),
75 7372 bytesToma entrada como
(string)(n)
.Pruébalo en línea!
Variables
La salida formateada se almacena en (en verde a continuación).o
La línea actualizada se define como la concatenación de:tu
Hay que insertar un salto de línea cada vez que el carácter -ésimo de se establece (0 indexados, en rojo abajo).norte tu
Ejemplo
Agregar "LOREM":00L01O02R03mi04METRO0506070809101112131415dieciséis
Agregar "IPSUM":00L01O02R03mi04METRO05∙06yo07PAGS08S09U10METRO1112131415dieciséis
Agregar "DOLOR":00L01O02R03mi04METRO05∙06yo07PAGS08S09U10METRO11∙12re13O14L15OdieciséisR
fuente
r+w+' '
?Perl 6 ,
4629 bytesPruébalo en línea!
Solución basada en expresiones regulares que toma la entrada curry, como
f(n)(s)
y devuelve una lista de líneas. Cada línea, excepto la última, tiene un espacio en blanco al finalExplicación:
fuente
Vim, 15 bytes / pulsaciones de teclas
¿Una pregunta de formato de texto? ¡Sé exactamente la herramienta para el trabajo! E incluso tiene mi nombre en las dos primeras pulsaciones: D
<C-r>
significa ctrl-r.Esto podría ser un poco más corto en V , pero prefiero responder en vainilla vim para obtener respuestas que realmente muestren cuán concisa puede ser vim para el desafío correcto. Y la diferencia es muy pequeña de todos modos.
Esto también podría ser lo siguiente para 15 bytes:
Pruébalo en línea!
fuente
DJ:
Este programa ha sido realizado por DJ, nuestro gato favorito con un diamante alrededor del cuello. [...]R ,
3627 bytesR tiene esto como un incorporado (
strwrap
), devolvemos un vector de líneas divididas.Pruébalo en línea!
fuente
Haskell , 70 bytes
fuente
Python 2 , 74 bytes
Pruébalo en línea!
fuente
Java (JDK) ,
4644 bytesBásicamente, una solución de expresiones regulares puras en Java, casi seguramente la más corta que he escrito.
¡Saludos a Kevin por ayudar a reducir aún más los bytes en la expresión regular!
Pruébalo en línea!
Usando una lamdba al curry, crea una expresión regular para emparejar con avidez los
n
caracteres seguidos de un espacio o un final de cadena. Luego reemplaza esos personajes con ellos mismos seguidos de una nueva línea.fuente
[ $]
realidad solo coincide con un espacio o$
si no recuerdo mal, en lugar del final de la cadena. Sin embargo, parece funcionar, por lo que parece que se puede reducir a un solo espacio para incluso menos bytes.$0
lugar de$1
.replaceAll
sea tan detallado!Mathematica, 16 bytes
Función incorporada Toma una cadena y un entero como entrada y devuelve una cadena como salida.
fuente
Powershell,
4083 bytesCaso de prueba con
n=80
agregado.Script de prueba:
Salida:
fuente
if
/else
con el falso ternarioreturn
en laelse
parte y una declaración en lathen
parte.C (gcc) , 68 bytes
Pruébalo en línea!
Gracias a ceilingcat , ahorre 2 bytes moviendo global
char*l
a parámetro.fuente
Japt , 20 bytes
Pruébalo en línea!
Gracias a Bubbler y Shaggy por su ayuda.
Explicación:
fuente
[X,Y].join(...)
.Retina 0.8.2 , 37 bytes
Pruébalo en línea! Toma
s
yn
en líneas separadas. Explicación:Convierte
n
a unario.Haga coincidir espacios que no sean espacios en blanco, luego mire hacia adelante
n
y cuente como$#1
. Luego regrese y use un grupo de equilibrio para hacer coincidir losn
caracteres seguidos de espacios en blanco.Salida de las coincidencias como una lista de líneas.
fuente
.{1,50}
y$0¶
, pero ¿dónde50
se recibe como entrada en su lugar?Carbón de leña , 19 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Toma entrada de
n
ys
en líneas separadas. Explicación:Entrada
n
.Mueva el cursor un cuadrado hacia la izquierda para equilibrar el movimiento derecho desde la primera iteración del bucle.
Divida la cadena en espacios y repita sobre las palabras.
Calcule si la siguiente palabra llegará al borde derecho.
Si no lo hace, mueva un cuadrado a la derecha.
Si entonces comenzará una nueva línea.
Salida de la palabra.
fuente
Rojo ,
125, 117, 114112 bytesPruébalo en línea!
fuente
05AB1E , 18 bytes
Pruébalo en línea.
Explicación:
fuente
Java 8, 135 bytes
Pruébalo en línea.
Explicación:
fuente
JavaScript, 40 bytes
Pruébalo en línea!
fuente
APL (Dyalog Unicode) , SBCS de 14 bytes
Función de infijo; argumento izquierdo es
n
, argumento derecho esn
.Pruébalo en línea!
⎕CY
c op y en la biblioteca dfns⋄
luegowrap
[c] usar la envoltura [n] función[c] código de esa función
[n] notas para esa función
Versión de golf de SBCS de
wrap
59 bytesPruébalo en línea!
{
...}
dfn;⍺
es argumento izquierdo (ancho),⍵
es argumento derecho (cadena)≢⍵
cuenta (número de caracteres) de cadena⍺≥
...:
si el ancho es mayor o igual que eso, entonces:⍵
devolver la cadena⋄
de otra manera:' '=⍵
Máscara booleana donde los espacios en blanco son iguales a la cadenab←
almacenar enb
(para b lanks)(
...)↑
tome el siguiente número de elementos de eso:⍺+1
uno más que el ancho⍸
y dónde es verdadg←
almacenar eng
(para g aps)⍺≥
Máscara booleana donde el ancho es mayor o igual queg/⍨
filtrar los índices de brecha por eso⍺,
añadir eso al ancho⊃⌽
elige el último elemento de eso (iluminado, elige el primero de los invertidos)t←
tienda ent
(para t ake)b⊃⍨
úsalo para elegir un elemento de la máscara de b lankst+
agregue eso at
⍵↓⍨
soltar tantos caracteres de la cadena⍺∇
recurse a eso con el mismo argumento izquierdo izquierdo⎕TC,
append que a la lista de t ERMINAL c ontrol caracteres (8: HT, 10: NL, 13: CR)2↓
suelte los dos primeros caracteres de eso (dejando solo un 13: CR principal)(
…),
Agregue eso a lo siguiente:t↑⍵
los primerost
caracteres de la cadenafuente
Gracias a @Erik the Outgolfer, una versión de golf:
Python 3 , 94 bytes
Pruébalo en línea!
# Python 3 , 130 bytesPruébalo en línea!
Versión no tan golfista ...fuente
JavaScript + HTML + CSS,
11764 bytes-53 bytes cortesía de @Neil
fuente
(n,s)=>document.body.innerHTML+=`<p style=width:${n}ch><tt>${s}</tt></p>`
74 bytes. Si está dispuesto a desenterrar versiones antiguas de Firefox, puede guardar otros 8 bytes con(n,s)=>document.body.innerHTML+=`<pre wrap width=${n}>${s}</pre>`
.ch
unidades. Firefox 65 calcula50ch
como500px
; Chromium 70 se computa50ch
como400px
elit. Sed eget erat lectus. Morbi mi mi, fringilla sed
(Segunda línea) tiene más de 50 caracteres. Estoy usando el Chrome más nuevo.<p>
interior del<tt>
.Jalea , 12 bytes
Pruébalo en línea!
Desafortunadamente, esto es demasiado lento para funcionar para el caso de prueba proporcionado en menos de un minuto sobre TIO.
fuente
C # (.NET Core) , 162 bytes
Esta función utiliza una expresión regular que coincide con el espacio en blanco más cercano que está cerca del enésimo o múltiple del enésimo carácter y divide la cadena en función de él.
Pruébalo en línea!
El enlace TIO es un programa completo, y la función tiene una palabra clave estática, por lo que se puede llamar a la función desde main.
Test Regex
fuente
C # (compilador interactivo de Visual C #) , 78 bytes
Pruébalo en línea!
El crédito va a @LukeStevens por proponer la versión de Java ... Aparentemente .NET te hace importar el
RegularExpressions
espacio de nombres para reemplazarlo :(Aquí está mi versión original que se divide en el carácter espacial y usa LINQ para unirlos nuevamente:
C # (compilador interactivo de Visual C #) , 91 bytes
Pruébalo en línea!
fuente
Dart , 112 bytes
Pruébalo en línea!
fuente
APL (NARS), 48 caracteres, 96 bytes
prueba:
fuente
C, 63 bytes
La función de este ejercicio b (a, n) rompería la línea "a" como se dijo en el ejercicio, en la forma en que no cambia su longitud (si vemos el resultado como una cadena) porque cambia algunos espacios en \ n o una nueva línea en lugar. La cadena de entrada "a" no debería tener ningún carácter \ n para la función b () (podría tener \ n en la cadena de entrada para bs ())
La función b (a, n) estaría bien solo porque la restricción de este ejercicio, que impone cada palabra de la cadena "a" tiene una longitud <n si esto no es cierto, esa función puede ir
a un bucle infinito ... (muy mal en mi forma de ver, así que copié también la función más buena porque en ese caso devolvería -1 y no iría a un bucle infinito; es bs (a, n) a continuación) No excluyo que ambas funciones tengan errores ... .
resultado de b () pasado en una función que agrega longitud de línea a cada línea
fuente