Détection de nom de fichier conviviale


10

introduction

Les noms de fichiers peuvent varier considérablement, allant du simple blah.txtau 303549020150514101638190-MSP0.txt. Le premier est généralement généré par l'homme, tandis que le second est souvent généré par la machine. Ne serait-il pas agréable d'avoir une fonction simple pour faire des suppositions éclairées sur la question de savoir si un fichier peut être considéré comme "convivial"?

Inspiré d'un article d'Eduard Florinescu qui a depuis été supprimé. Son idée était bonne, mais avait juste besoin d'un petit coup de fouet.

Défi

Écrivez un programme ou une fonction dans la langue de votre choix qui peut prendre une chaîne et déterminez si elle est considérée comme «conviviale», telle que définie par ce défi.

Voici quelques détails et règles supplémentaires:

  • L'entrée sera une chaîne composée des 95 caractères ascii imprimables.
  • "respectueux de l'homme" doit être défini ainsi:
    • Exclure l'extension dans la considération. Une extension est définie comme la période finale suivie d'une série de caractères alphanumériques (aussi peu que 1, autant que 6).
    • Pas plus de la moitié de la chaîne par longueur (hors extension) ne peut être constituée des groupes de caractères définis suivants (combinés):
      • Caractères décimaux supérieurs à 8 d'affilée.
      • Caractères hexadécimaux (majuscule ou minuscule) d'au moins 16 dans une rangée (doivent être constitués de lettres et de chiffres, et dont au moins un tiers des caractères sont des chiffres).
      • Caractères Base64 (utilisant %+=comme caractères spéciaux) d'au moins 12 dans une rangée (doivent être constitués de lettres et de chiffres, être en minuscules et dont au moins un tiers des caractères sont des majuscules).
    • Si l'un des groupes ci-dessus se chevauche dans la définition (tel que celui qui se qualifie comme base64, mais qui a 8 chiffres d'affilée), choisissez le plus long d'entre eux à exclure.
  • La sortie doit être une valeur véridique ou fausse, selon que la chaîne est considérée comme "conviviale" ou non.
  • Supposons que seule une entrée valide sera utilisée. Ne vous inquiétez pas de la gestion des erreurs.

Le gagnant sera déterminé par le programme / la fonction la plus courte. Ils seront sélectionnés dans au moins 7 jours, ou si / quand il y a eu suffisamment de soumissions. En cas d'égalité, la réponse qui est venue plus tôt l'emporte.

Exemples

Voici quelques exemples d'entrée et de sortie que votre code devrait être capable de gérer:

"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

Réponses:


1

Javascript, 466 octets

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)

Expliquant:

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.