ह्यूमन फ्रेंडली फाइलनेम डिटेक्शन


10

परिचय

फ़ाइल नामों को बेतहाशा चीजें बदलती जा सकता है, एक साधारण से लेकर blah.txtके लिए 303549020150514101638190-MSP0.txt। पूर्व आमतौर पर मानव उत्पन्न होता है, जबकि उत्तरार्द्ध अक्सर मशीन उत्पन्न होता है। क्या किसी फ़ाइल को "मानव-अनुकूल" माना जा सकता है या नहीं, इस पर शिक्षित अनुमान लगाने के लिए एक साधारण कार्य करना अच्छा नहीं होगा?

तब से हटाए गए Eduard Florinescu की एक पोस्ट से प्रेरित। उनका विचार अच्छा था, लेकिन बस थोड़ा सा बाहर होने की जरूरत थी।

चुनौती

अपनी पसंद की भाषा में एक कार्यक्रम या फ़ंक्शन लिखें जो एक स्ट्रिंग ले सकता है, और यह निर्धारित कर सकता है कि क्या इसे "मानव-अनुकूल" माना जाता है, जैसा कि इस चुनौती से परिभाषित किया गया है।

कुछ और विवरण और नियम इस प्रकार हैं:

  • इनपुट एक स्ट्रिंग होगा जिसमें 95 प्रिंट करने योग्य एससीआई अक्षर होंगे।
  • "मानव-अनुकूल" को इस प्रकार परिभाषित किया जाएगा:
    • विचार में विस्तार को छोड़ दें। एक विस्तार को अंतिम अवधि के रूप में परिभाषित किया जाता है, जिसके बाद अल्फा-न्यूमेरिक पात्रों की एक श्रृंखला होती है (1 के रूप में कुछ, 6 के रूप में कई)।
    • लंबाई के आधार पर स्ट्रिंग के आधे से अधिक (विस्तार को छोड़कर) में वर्णों के संयुक्त परिभाषित समूह शामिल हो सकते हैं (संयुक्त):
      • दशमलव वर्ण 8 से अधिक पंक्ति में।
      • हेक्साडेसिमल वर्ण (ऊपरी xor निचला मामला) एक पंक्ति में कम से कम 16 (अक्षरों और संख्याओं से मिलकर होना चाहिए, और जिनमें से कम से कम एक तिहाई अक्षर संख्याएं हैं)।
      • Base64 वर्ण ( %+=विशेष वर्णों के रूप में) एक पंक्ति में कम से कम 12 (अक्षरों और संख्याओं से युक्त होना चाहिए, मिश्रित मामला होना चाहिए, और जिनमें से कम से कम एक तिहाई अक्षर अपरकेस अक्षर हैं)।
    • यदि उपरोक्त समूहों में से कोई भी परिभाषा में ओवरलैप करता है (जैसे कि एक जो बेस 64 के रूप में अर्हता प्राप्त करता है, लेकिन एक पंक्ति में 8 अंक है), तो उनमें से सबसे लंबे समय तक बाहर रखा जाने वाला चुनें।
  • आउटपुट एक सत्य या मिथ्या मूल्य होना चाहिए, यह इस बात पर निर्भर करता है कि स्ट्रिंग को "मानव-अनुकूल" माना जाता है या नहीं।
  • मान लें कि केवल मान्य इनपुट का उपयोग किया जाएगा। त्रुटि से निपटने के बारे में चिंता न करें।

विजेता का निर्धारण सबसे छोटे कार्यक्रम / समारोह द्वारा किया जाएगा। उनका चयन कम से कम 7 दिनों में किया जाएगा, या यदि / जब पर्याप्त प्रस्तुतियाँ हो गई हों। एक टाई होने की स्थिति में, पहले जो उत्तर आया वह जीत जाता है।

उदाहरण

यहां इनपुट और आउटपुट के कुछ उदाहरण दिए गए हैं जिन्हें आपके कोड को संभालने में सक्षम होना चाहिए:

"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

जवाबों:


1

जावास्क्रिप्ट, 466 बाइट्स

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)

व्याख्या:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.