Detección de nombre de archivo amigable para humanos

10

Introducción

Los nombres de archivos pueden ser muy variados, desde simples blah.txthasta 303549020150514101638190-MSP0.txt. El primero generalmente es generado por humanos, mientras que el segundo a menudo es generado por máquina. ¿No sería bueno tener una función simple para hacer conjeturas educadas sobre si un archivo podría considerarse "amigable para los humanos"?

Inspirado en una publicación de Eduard Florinescu que desde entonces ha sido eliminada. Su idea era buena, pero solo necesitaba un poco de desarrollo.

Desafío

Escriba un programa o función en el idioma de su elección que pueda tomar una cadena y determine si se considera "amigable para los humanos", según lo define este desafío.

Algunos detalles y reglas adicionales son los siguientes:

  • La entrada será una cadena que consta de los 95 caracteres ascii imprimibles.
  • "amigable para los humanos" se definirá así:
    • Excluir la extensión en la consideración. Una extensión se define como el período final seguido de una serie de caracteres alfanuméricos (tan solo 1, hasta 6).
    • No más de la mitad de la cadena por longitud (excluyendo la extensión) puede consistir en los siguientes grupos de caracteres definidos (combinados):
      • Caracteres decimales de más de 8 seguidos.
      • Caracteres hexadecimales (mayúsculas o minúsculas) de al menos 16 seguidos (deben estar formados por letras y números, y de los cuales al menos un tercio de los caracteres son números).
      • Base64 caracteres (que se usan %+=como caracteres especiales) de al menos 12 en una fila (debe consistir en letras y números, deben estar en mayúsculas y minúsculas, y de los cuales al menos un tercio de los caracteres son letras mayúsculas).
    • Si alguna de las agrupaciones anteriores se superpone en la definición (como una que califica como base64, pero tiene 8 dígitos seguidos), elija la más larga para excluirla.
  • La salida debe ser un valor verdadero o falso, dependiendo de si la cadena se considera "amigable para los humanos" o no.
  • Suponga que solo se utilizará una entrada válida. No te preocupes por el manejo de errores.

El ganador será determinado por el programa / función más corto. Se seleccionarán en al menos 7 días, o si / cuando ha habido suficientes envíos. En caso de empate, la respuesta que vino antes gana.

Ejemplos

Aquí hay algunos ejemplos de entrada y salida que su código debería poder manejar:

"results_for__michael_greer.txt.zip" => true

"Georg Feuerstein - Connecting the Dots.pdf" => true

"M People - Search for the Hero-ntuqTuc6HxM.mp4" => true

"index.html?v=QTR4WGVTUzFsV3d8NHxvcmlnaW5hbHx8MTExMTAxBHxodHRwOi8vLCwsLHRyLDcsMA%3D%3D.html" => false

"ol2DCE0SIyQC(173).pdf" => false

"d41d8cd98f00b204e9800998ecf8427e.md5" => false

"12792331_807918856008495_7076645197310150318_o.jpg" => false
Mwr247
fuente

Respuestas:

1

Javascript, 466 bytes

s=>(s=s.split(/\.[a-z\d]{1,6}$/i)[j=d=0],h=s[l='length']/2|0,m=[],g=r=>(++j,m=m.concat((s[n='match'](r)||[]).map(x=>[x,j]))),p='replace',g(/\d{9,}/g),g(/[\da-f]{16,}/ig),g(/[\da-z%+=]{12,}/ig),m.sort((x,y)=>y[0][l]-x[0][l]).every(x=>x[1]-1?x[1]-2?s=s[p](x[0],y=>y[n](/[a-z]/)&&y[n](/\d/)&&(y+'A')[n](/[A-Z]/g)[l]>y[l]/3|0?(d+=y[l],''):y):s=s[p](x[0],y=>!!y[n](/[A-F]/)^!!y[n](/[a-f]/)&&(y+'0')[n](/\d/g)[l]>y[l]/3|0?(d+=y[l],''):y):(s=s[p](z=x[0],''),d+=z[l])),d<=h)

Explicando:

f=s=>(                                 // f: take string s (filename) as input
    s=s.split(/\.[a-z\d]{1,6}$/i)[j=d=0],  // s: input without extension
                                           // d: combined rules' sum
                                           // j: combined rule-number step
    h=s[l='length']/2|0,                   // h: half string
                                           // l: length
    m=[],                                  // m: matches
    g=r=>(++j,                             // j: next combined rule number
        m=m.concat(                            // m: join
            (s[n='match'](r)||[]).map(             // new (r)egex-matches
            x=>[x,j])                              // mapped with its rule number
    )),p='replace',                        // p: replace
    g(/\d{9,}/g),                          // combined rules §1
    g(/[\da-f]{16,}/ig),                   // combined rules §2
    g(/[\da-z%+=]{12,}/ig),                // combined rules $3
    m.sort((x,y)=>y[0][l]-x[0][l])         // matches ordered by length
        .every(x=>x[1]-1?                      // for combined rule §1
            x[1]-2?                                // for combined rule §2
                s=s[p](x[0],y=>                        // for combined rule §3
                    y[n](/[a-z]/)&&y[n](/\d/)&&            // if lower and digit and
                    (y+'A')[n](/[A-Z]/g)[l]>y[l]/3|0?      // upper at least `total/3`
                (d+=y[l],''):y)                        // replace by empty and sum up `d`
            :s=s[p](x[0],y=>                       // replace if
                !!y[n](/[A-F]/)^!!y[n](/[a-f]/)&&      // (upper xor lower case) and
                (y+'0')[n](/\d/g)[l]>y[l]/3|0?         // digits: at least `total/3`
            (d+=y[l],''):y)                        // by empty and sum up `d`
        :(s=s[p](z=x[0],''),d+=z[l]))          // no treatment
    ,d<=h                                  // output if "no more than half of string"
);


["results_for__michael_greer.txt.zip",
"Georg Feuerstein - Connecting the Dots.pdf",
"M People - Search for the Hero-ntuqTuc6HxM.mp4",
"index.html?v=QTR4WGVTUzFsV3d8NHxvcmlnaW5hbHx8MTExMTAxBHxodHRwOi8vLCwsLHRyLDcsMA%3D%3D.html",
"ol2DCE0SIyQC(173).pdf",
"d41d8cd98f00b204e9800998ecf8427e.md5",
"12792331_807918856008495_7076645197310150318_o.jpg"]
.forEach(x=>document.body.innerHTML+='<pre>"'+x+'" => '+f(x)+'</pre>')

remoto
fuente