Deteksi Nama File yang Ramah Manusia

10

pengantar

Nama file bisa bermacam-macam hal, mulai dari yang sederhana blah.txthingga 303549020150514101638190-MSP0.txt. Yang pertama biasanya dihasilkan manusia, sedangkan yang terakhir sering dihasilkan mesin. Bukankah lebih baik memiliki fungsi sederhana untuk membuat tebakan yang berpendidikan tentang apakah suatu file dapat dianggap "ramah manusia" atau tidak?

Terinspirasi oleh pos oleh Eduard Florinescu yang sejak itu dihapus. Idenya bagus, tetapi hanya perlu sedikit menyempurnakan.

Tantangan

Tulis program atau fungsi dalam bahasa pilihan Anda yang dapat mengambil string, dan tentukan apakah itu dianggap "ramah manusia", seperti yang didefinisikan oleh tantangan ini.

Beberapa perincian dan aturan lebih lanjut adalah sebagai berikut:

  • Input akan berupa string yang terdiri dari 95 karakter ascii yang dapat dicetak.
  • "ramah manusia" harus didefinisikan sebagai berikut:
    • Kecualikan ekstensi dalam pertimbangan. Ekstensi didefinisikan sebagai periode akhir diikuti oleh serangkaian karakter alfanumerik (sesedikit 1, sebanyak 6).
    • Tidak lebih dari setengah string dengan panjang (tidak termasuk ekstensi) dapat terdiri dari pengelompokan karakter yang didefinisikan berikut (gabungan):
      • Karakter desimal yang lebih panjang dari 8 berturut-turut.
      • Karakter heksadesimal (huruf besar atau kecil) dari setidaknya 16 berturut-turut (harus terdiri dari huruf dan angka, dan yang setidaknya sepertiga dari karakter adalah angka).
      • Base64 karakter (menggunakan %+=sebagai karakter khusus) minimal 12 berturut-turut (harus terdiri dari huruf dan angka, huruf besar-kecil, dan yang setidaknya sepertiga dari karakter adalah huruf besar).
    • Jika salah satu dari pengelompokan di atas tumpang tindih dalam definisi (seperti yang memenuhi syarat sebagai base64, tetapi memiliki 8 digit berturut-turut), pilih yang terpanjang dari mereka untuk dikecualikan.
  • Output harus berupa nilai true atau falsy, tergantung pada apakah string dianggap "ramah manusia" atau tidak.
  • Asumsikan bahwa hanya input yang valid yang akan digunakan. Jangan khawatir tentang penanganan kesalahan.

Pemenang akan ditentukan oleh program / fungsi terpendek. Mereka akan dipilih setidaknya dalam 7 hari, atau jika / ketika ada cukup pengiriman. Jika terjadi seri, jawaban yang datang sebelumnya menang.

Contohnya

Berikut adalah beberapa contoh input dan output yang harus dapat ditangani kode Anda:

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

Jawaban:

1

Javascript, 466 byte

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)

Menjelaskan:

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

dihapus
sumber