Detecção de nome de arquivo amigável para humanos

10

Introdução

Os nomes de arquivos podem variar muito, desde um simples blah.txtaté 303549020150514101638190-MSP0.txt. O primeiro é geralmente gerado por seres humanos, enquanto o último geralmente é gerado por máquina. Não seria bom ter uma função simples para fazer palpites sobre se um arquivo pode ou não ser considerado "amigo do homem"?

Inspirado em um post de Eduard Florinescu que foi excluído desde então. A ideia dele era boa, mas só precisava de um pouco de detalhamento.

Desafio

Escreva um programa ou função no idioma de sua escolha que possa usar uma string e determine se ela é considerada "amigável ao ser humano", conforme definido por este desafio.

Alguns detalhes e regras adicionais são os seguintes:

  • A entrada será uma sequência que consiste nos 95 caracteres ascii imprimíveis.
  • "amigo do homem" deve ser definido assim:
    • Exclua a extensão na consideração. Uma extensão é definida como o período final seguido por uma série de caracteres alfanuméricos (apenas 1, 6).
    • Não mais da metade da cadeia de comprimento (excluindo extensão) pode consistir nos seguintes agrupamentos definidos de caracteres (combinados):
      • Caracteres decimais maiores que 8 em uma linha.
      • Caracteres hexadecimais (maiúsculas ou minúsculas) de pelo menos 16 em uma linha (devem consistir em letras e números e dos quais pelo menos um terço dos caracteres são números).
      • Caracteres base64 (usando %+=como caracteres especiais) de pelo menos 12 em uma linha (devem consistir em letras e números, estar em maiúsculas e com pelo menos um terço dos caracteres em maiúsculas).
    • Se algum dos agrupamentos acima se sobrepuser na definição (como aquele que se qualifica como base64, mas possui 8 dígitos seguidos), escolha o maior deles a ser excluído.
  • A saída deve ser um valor verdadeiro ou falso, dependendo se a string é considerada "amigável para o ser humano" ou não.
  • Suponha que apenas a entrada válida será usada. Não se preocupe com o tratamento de erros.

O vencedor será determinado pelo programa / função mais curto. Eles serão selecionados em pelo menos 7 dias ou se / quando houver envios suficientes. Em caso de empate, a resposta que veio antes vence.

Exemplos

Aqui estão alguns exemplos de entrada e saída que seu código deve ser capaz de manipular:

"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
fonte

Respostas:

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>')

removido
fonte