División de cuerdas en trozos de igual longitud n
Como en la mayoría de los idiomas "normales" TMTOWTDI (hay más de una forma de hacerlo). Asumo aquí que la entrada no contiene saltos de línea, y que "dividir" significa dividirla en líneas. Pero hay dos objetivos muy diferentes: si la longitud de la cadena no es un múltiplo de la longitud del fragmento, ¿desea mantener el fragmento final incompleto o desea descartarlo?
Mantener un trozo final incompleto
En general, hay tres formas de dividirse en Retina. Aquí presento los tres enfoques, porque pueden hacer una gran diferencia cuando intentas adaptarlos a un problema relacionado. Puede usar un reemplazo y agregar un salto de línea a cada coincidencia:
.{n}
$&¶
Eso es 8 bytes (o un poco menos si n = 2
o n = 3
porque entonces puedes usar ..
o ...
respectivamente). Sin embargo, esto tiene un problema: agrega un salto de línea adicional si la longitud de la cadena es un múltiplo de la longitud del fragmento.
También puede usar una etapa dividida y aprovechar el hecho de que las capturas se retienen en la división:
S_`(.{n})
La _
opción elimina las líneas vacías que de lo contrario resultarían de cubrir toda la cadena con coincidencias. Esto es 9 bytes, pero no agrega un salto de línea final. Por n = 3
sus 8 bytes y por n = 2
sus 7 bytes. Tenga en cuenta que puede guardar un byte en general si las líneas vacías no importan (por ejemplo, porque de todos modos solo procesará líneas no vacías y eliminará los avances de línea): entonces puede eliminar el _
.
La tercera opción es usar una coincidencia. Con la !
opción podemos imprimir todos los partidos. Sin embargo, para incluir el fragmento final, debemos permitir una longitud de coincidencia variable:
M!`.{1,n}
Esto también es de 9 bytes, y tampoco incluirá un salto de línea final. Esto también se convierte en 8 bytes para n = 3
hacerlo ..?.?
. Sin embargo, tenga en cuenta que se reduce a 6 bytes n = 2
porque ahora solo necesitamos ..?
. También tenga en cuenta que M
puede eliminarse si esta es la última etapa de su programa, guardando un byte en cualquier caso.
Descartando un trozo final incompleto
Esto se vuelve realmente largo si intentas hacerlo con un reemplazo, porque necesitas reemplazar el fragmento final con nada (si existe) y también con una división. Entonces podemos ignorarlos con seguridad. Curiosamente, para el enfoque de partido es lo contrario: se acorta:
M!`.{n}
Eso es 7 bytes, o menos de n = 2
, n = 3
. Nuevamente, tenga en cuenta que puede omitir M
si esta es la última etapa del código.
Si desea un avance de línea final aquí, puede obtenerlo agregando |$
la expresión regular.
Bonus: trozos superpuestos
Recuerde que M
tiene la &
opción que devuelve coincidencias superpuestas (que normalmente no es posible con expresiones regulares). Esto le permite obtener todos los fragmentos superpuestos (subcadenas) de una cadena de una longitud determinada:
M!&`.{n}