การตรวจหาชื่อไฟล์ที่เป็นมิตรกับมนุษย์


10

บทนำ

ชื่อไฟล์สามารถที่แตกต่างกันอย่างดุเดือดสิ่งตั้งแต่ง่ายไปblah.txt 303549020150514101638190-MSP0.txtอดีตมักจะเป็นมนุษย์สร้างขึ้นในขณะที่หลังมักจะสร้างเครื่อง มันจะดีหรือไม่ถ้ามีฟังก์ชั่นง่าย ๆ เพื่อคาดเดาการศึกษาว่าไฟล์นั้นอาจถือเป็น "มิตรกับมนุษย์" หรือไม่?

แรงบันดาลใจจากโพสต์โดย Eduard Florinescu ที่ถูกลบไปแล้ว ความคิดของเขาเป็นสิ่งที่ดี แต่ต้องการเพียงเล็กน้อย fleshing

ท้าทาย

เขียนโปรแกรมหรือฟังก์ชั่นในภาษาที่คุณเลือกซึ่งสามารถรับสตริงและพิจารณาว่าเป็น "มนุษย์เป็นมิตร" ตามที่กำหนดโดยความท้าทายนี้

รายละเอียดและกฎเพิ่มเติมบางประการมีดังนี้:

  • อินพุตจะเป็นสตริงที่ประกอบด้วยอักขระ ASCII ที่พิมพ์ได้ 95 ตัว
  • "เป็นมิตรกับมนุษย์" จะถูกกำหนดด้วยเหตุนี้:
    • ไม่รวมส่วนขยายในการพิจารณา นามสกุลถูกกำหนดเป็นช่วงเวลาสุดท้ายตามด้วยชุดของอักขระตัวเลขและตัวอักษร (น้อยที่สุด 1, มากถึง 6)
    • ไม่เกินครึ่งของสตริงตามความยาว (ไม่รวมส่วนขยาย) อาจประกอบด้วยกลุ่มของอักขระที่กำหนดไว้ต่อไปนี้ (รวมกัน):
      • อักขระทศนิยมมีความยาวมากกว่า 8 ในหนึ่งแถว
      • อักขระเลขฐานสิบหก (ตัวพิมพ์เล็กหรือตัวบน xor) อย่างน้อย 16 ตัวในหนึ่งแถว (ต้องประกอบด้วยตัวอักษรและตัวเลขและอย่างน้อยหนึ่งในสามของตัวอักษรเป็นตัวเลข)
      • อักขระ Base64 (ใช้%+=เป็นอักขระพิเศษ) อย่างน้อย 12 ตัวในหนึ่งแถว (ต้องประกอบด้วยตัวอักษรและตัวเลขเป็นตัวพิมพ์เล็กและอย่างน้อยหนึ่งในสามของตัวอักษรเป็นตัวอักษรตัวพิมพ์ใหญ่)
    • หากการจัดกลุ่มใด ๆ ข้างต้นทับกันในความหมาย (เช่นที่มีคุณสมบัติเป็น base64 แต่มี 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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.