Introducción
La mayoría de los golfistas de código aquí agregan explicaciones a sus presentaciones, por lo que es más fácil entender lo que está sucediendo. Por lo general, las líneas de código van a la izquierda y la explicación correspondiente a la derecha con algún tipo de separador. Para que se vea bonito, los separadores están todos en la misma columna. Además, el texto de explicación largo generalmente se ajusta a la siguiente línea, por lo que los lectores no tienen que desplazarse horizontalmente para leer todo.
Sin embargo, cuando quieres editar esta explicación porque hiciste algunos campos de golf locos, a menudo terminas pasando tiempo para hacer que tu explicación vuelva a ser bonita. Dado que esta es una tarea muy repetitiva, desea escribir un programa para esto.
El reto
Dadas varias líneas de código con explicación y un separador, genera el código bien formateado con explicación.
Ejemplo
Entrada
shM-crz1dc4. "ANDBYOROF # z = input rz1 # convierte la entrada a mayúsculas cd # entrada dividida en espacios c4. "ANDBYOROF # crea una lista de las palabras de una cadena empaquetada que debe ignorarse - # filtra esas palabras hM # solo toma la primera letra de todas las palabras s # únelos en una cadena
Salida
shM-crz1dc4. "ANDBYOROF # z = input rz1 # convierte la entrada a mayúsculas cd # entrada dividida en espacios c4. "ANDBYOROF # crea una lista de las palabras de una cadena empaquetada que será # ignorado - # filtra esas palabras hM # solo toma la primera letra de todas las palabras s # únelos en una cadena
Una cookie para el primero que puede descubrir qué hace este código.
El algoritmo de formateo
- Encuentre la línea de código más larga (excluyendo la explicación y los espacios entre el código y el separador).
- Agregue 5 espacios después de esta línea de código y agregue el separador correspondiente con explicación. Esta es ahora la línea de referencia.
- Ajuste cada dos líneas a esta línea de referencia, de modo que los separadores estén todos en la misma columna.
- Ajuste todas las líneas que tengan más de 93 caracteres en una nueva línea de la siguiente manera:
- Encuentre la última palabra cuyo final está en la columna 93 o inferior.
- Tome todas las palabras después de esta y envuélvalas a una nueva línea con el separador principal y el espacio correcto. El espacio entre esas dos palabras debe eliminarse, por lo que la primera línea termina con un carácter de palabra y la segunda línea comienza con una después del separador.
- Si la línea resultante aún tiene más de 93 caracteres, haga lo mismo nuevamente hasta que cada línea tenga menos de 94 caracteres.
Notas
- Una palabra consta de caracteres que no son espacios en blanco. Las palabras están separadas por un solo espacio.
- La palabra envoltura siempre es posible. Esto significa que ninguna palabra es tan larga que haría imposible el ajuste.
- La entrada solo contendrá ASCII imprimible y no tendrá espacios en blanco al final
- El separador solo aparecerá una vez por línea.
- Si bien la explicación puede tener una longitud ilimitada, el separador y el código solo pueden tener una longitud máxima combinada de
93 - 5 = 87
caracteres. Los 5 caracteres son los espacios entre el código y el separador. El código y el separador siempre tendrán al menos un carácter. - La entrada puede contener líneas vacías. Esos nunca contendrán ningún carácter (excepto una nueva línea si toma la entrada como cadena multilínea). Esas líneas vacías también deben estar presentes en la salida.
- Cada línea tendrá un código, un separador y una explicación. Las excepciones son líneas vacías.
- Puede tomar la entrada en cualquier formato razonable, siempre que no se procese previamente. Deje claro en su respuesta cuál usa.
- La salida puede ser una cadena multilínea o una lista de cadenas.
Reglas
- Función o programa completo permitido.
- Reglas predeterminadas para entrada / salida.
- Se aplican lagunas estándar .
- Este es el código de golf , por lo que gana el conteo de bytes más bajo. Tiebreaker es una presentación anterior.
Casos de prueba
El formato de entrada aquí es una lista de cadenas que representan las líneas y una sola cadena para el separador. Ambos están separados por una coma. La salida es una lista de cadenas.
['shM-crz1dc4. "ANDBYOROF # z = input', '', 'rz1 # convierte la entrada a mayúsculas', 'cd # divide la entrada en espacios', 'c4." ANDBYOROF # crea una lista de las palabras de un paquete cadena que se ignorará ',' - # filtra esas palabras ',' hM # solo toma la primera letra de todas las palabras ',' s # únelas en una cadena '], "#" -> [' shM-crz1dc4 . "ANDBYOROF # z = input ',' ',' rz1 # convierte la entrada a mayúsculas ',' cd # divide la entrada en espacios ',' c4." ANDBYOROF # crea una lista de las palabras de una cadena empaquetada que será ' , '# ignorado', '- # filtra esas palabras ',' hM # solo toma la primera letra de todas las palabras ',' s # únelas en una cadena '] ['codecodecode e # Explicación', 'sdf dsf sdf e # A Muy muy muy muy muy muy muy muy muy largo largo largo largo largo largo largo largo largo largo largo explicación larga y larga y larga', '', 'algunos más codee # y alguna explicación más '], "e #" -> [' codecodecode e # Explicación ',' sdf dsf sdf e # A Muy muy muy muy muy muy muy muy muy largo largo largo largo largo largo ',' e # largo larga, larga, larga, larga, larga explicación y se vuelve más larga ',' e # y más larga ',' ',' algo más de código e # y alguna explicación más ']
¡Feliz codificación!
length of the longest code-line + 5
. Esto también se aplica a las líneas que solo contienen una explicación, ya que fueron ajustadas.Respuestas:
Ruby,
245237220216212209205 bytesFunción anónima. Enfoque bastante básico (encuentre la longitud máxima, agregue 5, luego procese en cada línea, con recursión para lidiar con el ajuste) y puede haber otro enfoque que ahorre más bytes.
Eliminé la respuesta anterior que no cumplía con todos los requisitos; No quería tener un código de media respuesta como respuesta (también estaba recibiendo votos negativos por estar incompleto), pero ahora debería hacer todo lo que la pregunta me pide.
Registro de cambios:
map
llamada y eliminar algunasstrip
funciones innecesarias basadas en la promesa de que las palabras en la explicación siempre tienen exactamente un espacio entre ellas. También," "
está asignado a una constante ya que lo uso mucho.map
llamadas al aprovechar el poder de las funciones de orden superior, lo que significa que la primera llamada del mapa establecerá la variable de longitudl
correctamente incluso si se llama después de la declaración de la función auxiliars
. -4 bytes.\n
líneas múltiples abusadas con nuevas líneas reales, más un pequeño truco usandoif
operadores ternarios (cuandojoin
se llama en una matriz connil
valores, se convierten en cadenas vacías).join
aparentemente puede ser reemplazado por a*
.fuente
93 - 5 = 87
caracteres. Los 5 caracteres son los espacios entre el código y el separador. El código y el separador siempre tendrán al menos un carácter de largo". Su sección de código está más allá del límite, con 97 caracteres, por lo que el programa tiene un comportamiento indefinido.LiveScript,
243236233228219225 bytesCómo funciona: principalmente como el código Java. Comience por aliasing length (LiveScript permite crear una función a partir de operadores utilizando paréntesis).
.=
esa = a.b
- que usamos aquí para mapear.=> blabla ..
es la construcción de cascada Smalltalk-ish: el lado izquierdo=>
es accesible como..
para el resto del bloque; Y será devuelto. Aquí, es el elemento dividido en k. Nota: Estoy usando la interpolación de cadenas, porque/
solo significa "dividir" con una cadena literal.LS también nos permite usar
a-=/regexp/
en este lambda (también funciona con literales de cadena): es solo azúcar para una.replace
llamada.Finalmente, el
>?=
es el>?
operador combinatorio -assin, que devuelve el mayor de dos operandos.LS tiene estilo Python / Haskell para comprensión, sin nada sofisticado, excepto la "cadena * veces" para repetir el espacio lo suficiente.
Esto para la comprensión sirve como tema (ver el bloque sobre las cascadas de la otra).
Luego hacemos un bucle en cada elemento de la matriz (el que acabamos de construir con la comprensión), y si alguna línea es mayor que 93 caracteres, encontramos el último índice de, dividido allí, y empujamos la línea separada justo después de esta iteración actual ( ... para que la próxima iteración se vuelva a dividir si la línea es demasiado grande).
Lo último que le apetece
a[j to]
es un rango (desde j hasta el final), pero dado que usa métodos de matriz, tenemos que volver a unirlo a una cadena, lo que hacemos usando sobrecargado*
:*''
.ejemplo
salida:
fuente
Java, 347 + 19 = 366 bytes
Requiere
Así los +19 bytes.
Toma en el formato
f.accept(List<String> code, String seperator)
. Formatos en el lugar. Una versión que crea y devuelve una nuevaList<String>
sería trivial de implementar pero costaría algunos bytes.Sangrado + ejemplo de uso:
... probablemente debería ejecutar esto por sí mismo: P
fuente
replace(" *"+s)
no funciona, peroreplaceAll(" *"+s)
me encantaría escucharlo, no puedo entenderlo.replace
usa cadenas peroreplaceAll
usa expresiones regulares. </badguess>PowerShell,
224217235 bytesSe actualizó la lógica para determinar la longitud máxima de la cadena de código. Actualizada para permitir múltiples separadores que incluyen meta caracteres regex.
Pequeña explicación
Esto toma una cadena completa delimitada de nueva línea para la entrada.
Salida de muestra con algo de Lorem Ipsum
fuente
MATLAB,
270265262 bytesEl programa acepta la entrada
I
en forma de una matriz de celdas de cadenas donde cada elemento de la matriz de celdas es una línea separada de la entrada. También acepta una segunda entrada que indica cuál es el carácter del comentario (es decir#
). La función devuelve una cadena de varias líneas que está formateada correctamente.Breve explicacion
Entrada de ejemplo
Salida de ejemplo
fuente