친숙한 파일 이름 탐지


10

소개

파일 이름은 격렬 간단한에 이르기까지 일을 변화 할 수 있습니다 blah.txt303549020150514101638190-MSP0.txt. 전자는 일반적으로 인간이 생성하고 후자는 종종 기계 생성입니다. 파일이 "인간 친화적"으로 간주 될 수 있는지에 대한 교육 된 추측을하는 간단한 기능을 갖는 것이 좋지 않습니까?

이후 삭제 된 Eduard Florinescu의 게시물에서 영감을 받았습니다. 그의 아이디어는 좋았지 만 약간의 육체가 필요했습니다.

도전

문자열을 취할 수있는 선택한 언어로 프로그램이나 함수를 작성하고이 과제에 정의 된대로 "인간 친화적"으로 간주되는지 결정하십시오.

추가 세부 사항 및 규칙은 다음과 같습니다.

  • 입력은 95 개의 인쇄 가능한 ASCII 문자로 구성된 문자열입니다.
  • "인간 친화적"은 다음과 같이 정의됩니다.
    • 고려 사항에서 확장을 제외하십시오. 확장은 마지막 기간으로 정의되고 일련의 영숫자 문자 (1 ~ 6)입니다.
    • 길이를 기준으로 문자열의 절반을 넘지 않아야 (확장자 제외) 다음과 같이 정의 된 문자 그룹 (결합)으로 구성 될 수 있습니다.
      • 행에서 8보다 긴 10 진수 문자.
      • 16 행 이상의 16 진 문자 (대문자 또는 소문자) (문자와 숫자로 구성되고 문자의 3 ​​분의 1 이상은 숫자 임)
      • %+=12 행 이상의 Base64 문자 ( 특수 문자로 사용) (문자와 숫자로 구성되고 대소 문자를 혼합해야하며 문자의 3 ​​분의 1 이상이 대문자 여야 함)
    • 위의 그룹 중 하나라도 정의에서 겹치는 경우 (예 : 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

자바 스크립트, 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.