Phát hiện tên tệp thân thiện với con người


10

Giới thiệu

Tên tệp có thể rất khác nhau, từ đơn giản blah.txtđến 303549020150514101638190-MSP0.txt. Cái trước thường là do con người tạo ra, trong khi cái trước thường là do máy tạo ra. Sẽ không hay ho gì khi có một chức năng đơn giản để đưa ra những phỏng đoán có giáo dục về việc một tập tin có thể được coi là "thân thiện với con người" hay không?

Lấy cảm hứng từ một bài đăng của Eduard Florinescu đã bị xóa. Ý tưởng của anh ấy là tốt, nhưng chỉ cần một chút thôi.

Thử thách

Viết chương trình hoặc chức năng bằng ngôn ngữ bạn chọn có thể lấy một chuỗi và xác định xem nó có được coi là "thân thiện với con người" hay không, như được xác định bởi thử thách này.

Một số chi tiết và quy tắc khác như sau:

  • Đầu vào sẽ là một chuỗi bao gồm 95 ký tự ascii có thể in được.
  • "thân thiện với con người" sẽ được định nghĩa như vậy:
    • Không bao gồm phần mở rộng trong việc xem xét. Một phần mở rộng được định nghĩa là khoảng thời gian cuối cùng theo sau là một loạt các ký tự chữ và số (ít nhất là 1, nhiều nhất là 6).
    • Không quá một nửa chuỗi theo độ dài (không bao gồm phần mở rộng) có thể bao gồm các nhóm ký tự được xác định sau (kết hợp):
      • Các ký tự thập phân dài hơn 8 liên tiếp.
      • Các ký tự thập lục phân (chữ thường xor chữ thường) có ít nhất 16 liên tiếp (phải bao gồm các chữ cái và số và trong đó ít nhất một phần ba các ký tự là số).
      • Các ký tự Base64 (sử dụng %+=làm các ký tự đặc biệt) của ít nhất 12 liên tiếp (phải bao gồm các chữ cái và số, là trường hợp hỗn hợp và trong đó ít nhất một phần ba các ký tự là chữ in hoa).
    • Nếu bất kỳ nhóm nào ở trên trùng lặp trong định nghĩa (chẳng hạn như một nhóm đủ điều kiện là cơ sở64, nhưng có 8 chữ số liên tiếp), hãy chọn loại dài nhất trong số chúng để loại trừ.
  • Đầu ra phải là một giá trị trung thực hoặc giả, tùy thuộc vào việc chuỗi có được coi là "thân thiện với con người" hay không.
  • Giả sử rằng chỉ có đầu vào hợp lệ sẽ được sử dụng. Đừng lo lắng về việc xử lý lỗi.

Người chiến thắng sẽ được xác định bởi chương trình / chức năng ngắn nhất. Họ sẽ được chọn trong ít nhất 7 ngày, hoặc nếu / khi đã có đủ bài nộp. Trong trường hợp hòa, câu trả lời đến sớm hơn sẽ thắng.

Ví dụ

Dưới đây là một vài ví dụ về đầu vào và đầu ra mà mã của bạn sẽ có thể xử lý:

"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

Câu trả lời:


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)

Giải thích:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.