İnsan Dostu Dosya Adı Tespiti


10

Giriş

Dosya adları çılgınca bir basit arasında değişen şeyleri değişen edilebilir blah.txtiçin 303549020150514101638190-MSP0.txt. Birincisi genellikle insan tarafından üretilirken ikincisi genellikle makine tarafından üretilir. Bir dosyanın "insan dostu" kabul edilip edilemeyeceği konusunda eğitimli tahminler yapmak için basit bir işleve sahip olmak hoş olmaz mıydı?

Eduard Florinescu'nun silinen bir yayınından esinlenilmiştir. Fikri iyiydi, ama sadece biraz ete ihtiyacı vardı.

Meydan okuma

Seçtiğiniz dilde bir dize alabileceğiniz bir program veya işlev yazın ve bu sorunla tanımlandığı şekilde "insan dostu" olarak kabul edilip edilmediğini belirleyin.

Bazı detaylar ve kurallar aşağıdaki gibidir:

  • Giriş, yazdırılabilir 95 ascii karakterinden oluşan bir dize olacaktır.
  • "insan dostu" şu şekilde tanımlanır:
    • Uzantıyı dikkate almayın. Bir uzantı, son dönem ve ardından bir dizi alfasayısal karakter (1'den az, 6'ya kadar) olarak tanımlanır.
    • Dizenin uzunluğunun yarısından fazlası (uzantı hariç) aşağıdaki tanımlanmış karakter gruplarından (birleştirilmiş) oluşabilir:
      • Arka arkaya 8'den uzun ondalık karakterler.
      • Arka arkaya en az 16 olan onaltılık karakterler (büyük x veya küçük harf) (harflerden ve rakamlardan oluşmalı ve karakterlerin en az üçte biri sayı olmalıdır).
      • %+=Arka arkaya en az 12 karakterlik ( özel karakterler olarak kullanılır) Base64 karakter ( harf ve rakamlardan oluşmalı, büyük / küçük harf karıştırılmalıdır ve karakterlerin en az üçte biri büyük harf olmalıdır).
    • Yukarıdaki gruplandırmalardan herhangi biri tanım olarak çakışıyorsa (base64 olarak nitelendirilen, ancak arka arkaya 8 basamaklı bir tane gibi), hariç tutulacak en uzununu seçin.
  • Çıktı, ipin "insan dostu" olarak kabul edilip edilmediğine bağlı olarak, doğruluk ya da yanlış bir değer olmalıdır.
  • Yalnızca geçerli girdinin kullanılacağını varsayın. Hata işleme konusunda endişelenmeyin.

Kazanan en kısa program / fonksiyon tarafından belirlenecektir. En az 7 gün içinde veya yeterli sayıda başvuru olduğunda / olduğunda seçilecektir. Beraberlik durumunda, daha önce gelen cevap kazanır.

Örnekler

Kodunuzun işleyebilmesi için birkaç giriş ve çıkış örneği:

"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

Yanıtlar:


1

Javascript, 466 bayt

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)

İzahı:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.