El reto
Dada una cadena de entrada y un número entero n : trunca cualquier ejecución de caracteres consecutivos hasta un máximo de n de longitud. Los caracteres pueden ser cualquier cosa, incluidos los caracteres especiales. La función debe ser sensible a mayúsculas y n puede variar de 0 a infinito.
Ejemplo de entradas / salidas:
f("aaaaaaabbbccCCCcc", 2) //"aabbccCCcc"
f("aaabbbc", 1) //"abc"
f("abcdefg", 0) //""
f("aaaaaaabccccccccCCCCCC@", 4) //"aaaabccccCCCC@"
Puntuación
La puntuación se basa en el número de bytes utilizados. Así
function f(s,n){return s.replace(new RegExp("(.)\\1{"+n+",}","g"),function(x){return x.substr(0, n);});}
Sería 104 puntos.
¡Feliz golf!
Editar: se eliminó la restricción de idioma, pero aún me encantaría ver las respuestas de JavaScript
Respuestas:
Python 2, 52 bytes
Escrito como un programa (54 bytes):
Itera a través de la cadena de entrada
s
, agregando cada carácter a la cadena de salida ar
menos que los últimosn
caracteres der
sean ese carácter.Pensé que esto fallaría
n==0
porquer[-0:]
no son los últimos 0 caracteres (cadena vacía), sino la cadena completa. Pero funciona porque la cadena permanece vacía, por lo que sigue coincidiendo con la cadena de 0 caracteres.Un recursivo
lambda
dio 56 debido a la repeticiónUna estrategia alternativa para mantener un contador
i
de repeticiones del último personaje también resultó más larga que simplemente verificar los últimosn
personajes directamente.fuente
C,
8178Modifica la cadena entrante.
Programa de prueba
Requiere dos parámetros, el primero es la cadena para truncar, el segundo es el límite de longitud.
Explicación:
Esto funciona porque el puntero de origen siempre será igual o mayor que el puntero de destino, por lo que podemos escribir sobre la cadena a medida que la analizamos.
fuente
Haskell, 36 bytes
Versión sin puntos de
\n s -> concatMap (take n) (group s)
.fuente
Javascript ES6,
60545543 bytes-12 bytes gracias a @ TestSubject06 y @Downgoat
Ejecuciones de ejemplo:
fuente
RegExp("(.)\\1*","g")
a/(.)\1*/g
(s,n)
as=>n
, y el uso se vuelvef("aaaaaaabbbccCCCcc")(2)
MATL, 9 bytes
Pruébalo en línea
Explicación
fuente
CJam, 12 bytes
Pruébalo en línea!
Explicación
fuente
Pyth,
1612 bytesPruébalo en línea!
fuente
Python 2, 56 bytes
fuente
gs2, 6 bytes
Codificado en CP437 :
Esta es una función anónima (bloque) que espera un número en la parte superior de la pila y una cadena debajo de ella.
Pruébalo en línea. (El código aquí es
lines, dump, read number, [the answer], run-block
).fuente
Perl 6 ,
3836 bytesExplicación:
Prueba:
fuente
Javascript ES5, 73
Reutiliza la expresión regular de Lynn de su respuesta de Python .
fuente
new
palabra clave por -4 bytes.Perl 5, 50 bytes
Código de 46 bytes + 3 para
-i
y 1 para-p
Toma el número para truncar a través de
-i
.Uso
fuente
-p
solo hay un byte?-e
estas opciones solo consume 1 byte. Si el script tiene que ejecutarse desde un archivo, cuesta 3 por el espacio y se marca. Hay una meta publicación que intentaré encontrar pero ahora estoy en el móvil.Bash 46 bytes
Uso: Ingrese el número de caracteres a limitar, presione enter e ingrese la cadena. Ctrl+ Dpara salir
sed
(enviar EOF).fuente
Java 7,
107106bytesAlternativa anterior en línea for-loop para la concatenación de cadenas (que es 1 byte más que
String s="";for(int i=-1;++i<j;)s+="$1";
desafortunadamente):Sin golf y casos de prueba:
Pruébalo aquí.
Salida:
fuente
Javascript (usando una biblioteca externa) (115 bytes)
Enlace a lib: https://github.com/mvegh1/Enumerable
Explicación del código: cargue la cadena en la biblioteca, que se analiza internamente como matriz de caracteres. Aplique un acumulador en la secuencia, pasando un objeto personalizado como valor inicial. La propiedad a es el elemento actual, b es la cadena acumulada y c es el recuento secuencial del elemento actual. El acumulador verifica si el valor de iteración actual, n, es igual al último valor del elemento, ca Si no, restablecemos el recuento a 1 y establecemos el elemento actual. Si el recuento del elemento actual es menor o igual que la longitud deseada, lo acumulamos en la cadena de retorno. Finalmente, devolvemos la propiedad b, la cadena acumulada. No es el código más golfista, pero feliz de haber obtenido una solución que funciona ...
fuente
J,
3130 bytesAgrupa la cadena de entrada en corridas (subcadenas) de caracteres idénticos y toma el mínimo de la longitud de esa corrida y la longitud máxima que se ingresó para truncar la cadena. Luego copia el primer personaje de cada carrera tantas veces.
Uso
Explicación
fuente
Dyalog APL ,
2220 bytesSolicita n toma la cadena de entrada como argumento.
(
la función tácita ...∊
aplanar⊢↑¨⍨
cada elemento del argumento (es decir, cada partición) truncado al⎕⌊⍴¨
mínimo de la entrada numérica y la longitud actual)
[final de la función tácita] aplicada a⊢⊂⍨
la entrada particionada en los ᴛʀᴜᴇ s de1,
ᴛʀᴜᴇ antepuestos a (el primer carácter no es igual a su predecesor no existente)2≠/⊢
el par de caracteres no iguales en la entradafuente
Ruby, 32 bytes
fuente
TCC,
75 bytesLa entrada es una cadena y un número, separados por espacio.
Pruébalo en línea!
fuente
tcc.lua
archivo con marca de tiempo 16-07-25 16:57 UTC, que no tenía la capacidad de leer múltiples entradas a la vez. Si su respuesta requiere una versión del idioma posterior al desafío, debe etiquetarla como no competitiva en el encabezado. Eliminaré mi voto negativo cuando lo hagas.