언어는 무엇입니까?


17

최근에 PPCG 디자인 리더 보드는 html 헤더 응답 구문 분석에 문제가 있습니다 .

이 도전에서는 응답 헤더를 구문 분석 할 때 직접 촬영합니다.


테스트 사례 예

예 입력 ( NOT 실제 테스트 케이스), 그냥 그렇게 당신은 입력 방법의 아이디어를 얻을 수 있습니다 처럼을

Input: <h1>Python 3, 32 bytes</h1>
Desired Output: Python 3

Input: <h1>JavaScript, 13 chars / 32 bytes</h1>
Desired Output: JavaScript

Input: <b>VeryBadlyFormattedHeader v3 : (32 bytes)</b>

투기

프로그램은 150 바이트 이하 여야합니다

답변 헤더의 html 줄이 표시됩니다. 언어를 성공적으로 추출하려면 최선을 다해야합니다. 입력에는 유니 코드 문자가 포함될 수 있습니다.

출력 사례가 중요합니다.

테스트

테스트 케이스가있는 Github Gist

한 줄에 하나의 테스트 사례가 있습니다. 형식은 다음과 같습니다.

<lang_name> - <rest_of_the_line_is_the_header>

채점

당신의 점수는 :

 Number Correct
----------------
  Total Number

(백분율)

타이 브레이커는 가장 짧은 코드입니다.


100 % 점수를 얻을 수 있기 때문에 가장 짧은 코드와 같은 타이 브레이커가 있어야합니다.
user81655

1
가장 일반적인 헤더 스타일 #은 테스트 케이스에도 나타나지 않습니다!
edc65

언어는 일반적으로 입력의 첫 단어입니까?
TanMath

@ edc65 이것이 Markdown 소스가 아니라 응답 의 HTML 출력 을 구문 분석하는 것 입니다.
Kroltan

5
정규식으로 HTML을 구문 분석 하시겠습니까? 다음은 뭐야?
Neil

답변:


11

망막 0.8.2 , 100 %, 75 71 70 68 67 64 59 53 51 바이트

<.*?>

(,| [-&(–5]| [0-7]\d)(?! W|...\)).*

2 |:

이것은 본질적으로 코드 골프입니다. 그래서 언어를 바꿔야했습니다.

온라인으로 사용해보십시오!

확인

$ wget -q https://gist.githubusercontent.com/vihanb/1d99599b50c82d4a6d7f/raw/cd8225de96e9920db93613198b012749f9763e3c/testcases
$ grep -Po '(?<= - ).*' < testcases > input
$ grep -Po '^.*?(?= - )' < testcases > output
$ mono retina/Retina.exe headers.ret < input | head -n -1 | diff -s - output
Files - and output are identical

작동 원리

이 코드는 세 가지 간단한 대체 (또는 제거)로 구성됩니다. 언어 이름을 일치시키는 대신 입력 문자열의 일부를 구성하는 모든 입력 문자열을 제거합니다.

  1. <.*?> 모든 HTML 태그와 일치하므로 대체하면 입력에서 태그가 제거됩니다.

    .*?문자의 양을 일치하지만 이후 ?정량하게 게으른 , 여전히 전체 패턴이 일치 할 수 있도록 할 수있는 최소 금액과 일치합니다. 이렇게하면 전체 입력을 삭제하지 않아도되며 항상 a로 시작하고 a <로 끝납니다 >.

    언어 이름은 이제 나머지 수정 된 입력 문자열의 첫 문자로 시작합니다.

  2. 언어 이름 뒤에는 거의 항상 다음 결말 중 하나를 찾습니다.

    ,, -, &, (, , 5, 또는 공간은 두 자리 하였다.

    처음 두 엔딩은 다소 일반적이며 , as , as 및 as 로 Python 2 &amp; PuLP...구문 분석해야합니다 .Python 2Ruby (2.2.2p95)...Ruby>PHP – 3302 bytesPHPPerl 5...Perl

    (,| [-&(–5]| \d\d).* 이 모든 결말 (및 그 뒤의 모든 문자)과 일치하지만 몇 가지 잘못된 긍정이 발생합니다.

    • ,언어 이름의 쉼표와 일치합니다 Help, WarDoq!.

    • (의 버전을 일치 JavaScript (ESx)하고 Java (1.8).

    • \d\d의 버전과 일치합니다 Ti-Basic 84.

    in [0-7]\d대신 \d\d일치하는 것을 피하기 위해 대신에 를 사용하여 세 번째 문제를 해결할 수 있습니다 .884

    다른 문제의 경우 (?! W|...\))앞의 패턴이 W(에서와 같이 Help, WarDoq!) 또는 정확히 3 개의 문자와 닫는 괄호 (에서 (ES6)또는로 (1.8)) 와 일치하는 경우 선행 패턴이 일치하지 않도록 하는 네거티브 lookahead 를 사용합니다 .

    모두 합치면 (,| [-&(–5]| [0-7]\d)(?! W|...\)).*언어 이름 뒤의 모든 것과 일치합니다.

  3. 우리는 두 가지 문제가 남았습니다.

    <h1>Python <s>2</s> 3, <s>255</s> <s>204</s> <s>180</s> 178 bytes</h1>
    <h1><a href="http://sylwester.no/zozotez/" rel="nofollow">Zozotez Lisp</a>: 73</h1>
    

    다음과 같이 파싱된다

    Python 2 3
    Zozotez Lisp:
    

    출력에서 제거하여 첫 번째를 제거 하고 :출력에서 제거하여 두 번째를 수정할 수 있습니다 .

    이것은 2 |:빈 문자열 로 대체함으로써 달성됩니다 .


16

배쉬, 100 %, 100 바이트

sed sX..s.2./s.XX|grep -Po '(?<=>)[^<]+?(?=(,(?! W)| [-&–5]| ?<| [0-79]\d| ?\((?!E|1\.)))'|head -1

Ideone에서 온라인으로 사용해보십시오 .

확인

$ wget -q https://gist.githubusercontent.com/vihanb/1d99599b50c82d4a6d7f/raw/cd8225de96e9920db93613198b012749f9763e3c/testcases
$ grep -Po '(?<= - ).*' < testcases > input
$ grep -Po '^.*?(?= - )' < testcases > output
$ while read line; do bash headers.sh <<< "$line"; done < input | diff -s - output
Files - and output are identical

2
허, 나는 이것이 매우 어렵다고 생각했다 . .. 좋은 직업!
Downgoat


4

줄프, 13 바이트, 85.94 %, 비경쟁

ρΥpΔid=',H',E
  pΔi         remove all HTML tags from input, preserving content
 Υ   d=',H     slice from beginning until a member is a comma
ρ         ',E  replace said comma with the empty string  

내 컴퓨터에이 업데이트가있었습니다. 통역사를 위해 해당 코드를 업데이트하는 것을 잊어 버린 것은 내 chagrin에게있었습니다. 나는 100 %를 촬영하고 싶지 않다. 어쩌면 모든 사람이 같은 ¯ \ _ (ツ) _ / ¯ 형식을 사용해야합니다


태그를 제거하는 것이 좋습니다. 그것은 Retina 답변에서 3 바이트를 절약했습니다.
Dennis

@Dennis 감사합니다! 도움이되어 다행입니다.
코너 O'Brien
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.