Erkennung menschlicher Dateinamen

10

Einführung

Dateinamen können sehr unterschiedliche Dinge sein, von einfach blah.txtbis 303549020150514101638190-MSP0.txt. Ersteres wird normalerweise vom Menschen erzeugt, während letzteres häufig maschinell erzeugt wird. Wäre es nicht schön, eine einfache Funktion zu haben, um fundierte Vermutungen anzustellen, ob eine Datei als "menschenfreundlich" angesehen werden kann oder nicht?

Inspiriert von einem Beitrag von Eduard Florinescu, der inzwischen gelöscht wurde. Seine Idee war gut, brauchte aber nur ein wenig Ausarbeitung.

Herausforderung

Schreiben Sie ein Programm oder eine Funktion in der Sprache Ihrer Wahl, die eine Zeichenfolge aufnehmen kann, und bestimmen Sie, ob diese gemäß dieser Herausforderung als "menschenfreundlich" eingestuft wird.

Einige weitere Details und Regeln lauten wie folgt:

  • Die Eingabe ist eine Zeichenfolge, die aus 95 druckbaren ASCII-Zeichen besteht.
  • "menschenfreundlich" ist wie folgt zu definieren:
    • Schließen Sie die Erweiterung in der Gegenleistung aus. Eine Erweiterung ist definiert als die letzte Periode, gefolgt von einer Reihe alphanumerischer Zeichen (nur 1, bis zu 6).
    • Nicht mehr als die Hälfte der Zeichenfolge nach Länge (ohne Erweiterung) darf aus den folgenden definierten Gruppierungen von Zeichen (kombiniert) bestehen:
      • Dezimalzeichen länger als 8 in einer Reihe.
      • Hexadezimale Zeichen (Groß- oder Kleinbuchstaben) von mindestens 16 in einer Reihe (müssen aus Buchstaben und Zahlen bestehen, von denen mindestens ein Drittel Zahlen sind).
      • Base64-Zeichen ( %+=als Sonderzeichen) von mindestens 12 in einer Reihe (müssen aus Buchstaben und Zahlen bestehen, in Groß- und Kleinschreibung geschrieben sein und von denen mindestens ein Drittel Großbuchstaben sind).
    • Wenn sich eine der oben genannten Gruppierungen in der Definition überschneidet (z. B. eine, die als base64 qualifiziert ist, aber 8 Ziffern hintereinander hat), wählen Sie die längste aus, die ausgeschlossen werden soll.
  • Die Ausgabe sollte ein wahrheitsgemäßer oder falscher Wert sein, je nachdem, ob die Zeichenfolge als "menschenfreundlich" eingestuft wird oder nicht.
  • Angenommen, es wird nur eine gültige Eingabe verwendet. Sorgen Sie sich nicht um die Fehlerbehandlung.

Der Gewinner wird durch das kürzeste Programm / die kürzeste Funktion ermittelt. Sie werden in mindestens 7 Tagen ausgewählt oder wenn / wenn genügend Einreichungen vorliegen. Bei einem Unentschieden gewinnt die Antwort, die früher kam.

Beispiele

Hier sind einige Beispiele für Ein- und Ausgaben, die Ihr Code verarbeiten sollte:

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

Antworten:

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)

Erklären:

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

entfernt
quelle