Ngôn ngữ là gì?


17

Gần đây, bảng xếp hạng thiết kế PPCG đã gặp một số khó khăn khi phân tích cú pháp trả lời các tiêu đề html .

Trong thử thách này, bạn sẽ tự mình thực hiện phân tích cú pháp tiêu đề.


Ví dụ trường hợp kiểm tra

Những ví dụ đầu vào này ( KHÔNG phải là trường hợp thử nghiệm thực tế), để bạn có thể biết được đầu vào thể như thế nào

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>

Thông số kỹ thuật

Chương trình của bạn nên từ 150 byte trở xuống

Bạn sẽ được cung cấp một dòng html tiêu đề trả lời, bạn sẽ cần cố gắng hết sức để trích xuất thành công ngôn ngữ. Đầu vào có thể chứa các ký tự unicode.

Vấn đề đầu ra.

Xét nghiệm

Github Gist với các trường hợp thử nghiệm

Có một trường hợp thử nghiệm trên mỗi dòng. Định dạng là:

<lang_name> - <rest_of_the_line_is_the_header>

Chấm điểm

Điểm của bạn là:

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

(là một phần trăm)

Tie-breaker là mã ngắn nhất.


Cần có một bộ ngắt kết nối như mã ngắn nhất vì 100% điểm là rất khả thi.
dùng81655

1
Kiểu tiêu đề phổ biến nhất #thậm chí không có trong các trường hợp thử nghiệm?!
edc65

Vì vậy, ngôn ngữ thường là từ đầu tiên đầu vào?
TanMath

@ edc65 Tôi tin rằng đây là về phân tích đầu ra HTML của câu trả lời, không phải nguồn Markdown.
Kroltan

5
Phân tích cú pháp HTML bằng regex? Sao tiếp theo?
Neil

Câu trả lời:


11

Võng mạc 0.8.2 , 100%, 75 71 70 68 67 64 59 53 51 byte

<.*?>

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

2 |:

Đây thực chất là mã golf, vì vậy tôi phải chuyển ngôn ngữ.

Hãy thử trực tuyến!

xác minh

$ 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

Làm thế nào nó hoạt động

Mã này bao gồm ba thay thế đơn giản (hoặc loại bỏ). Thay vì cố gắng khớp tên ngôn ngữ, chúng tôi loại bỏ tất cả các phần của chuỗi đầu vào tạo thành một phần của nó.

  1. <.*?> sẽ khớp với tất cả các thẻ HTML, vì vậy sự thay thế sẽ loại bỏ chúng khỏi đầu vào.

    .*?khớp với bất kỳ số lượng ký tự nào, nhưng vì ?làm cho bộ định lượng trở nên lười biếng , nó sẽ khớp với số lượng ít nhất có thể mà vẫn cho phép toàn bộ mẫu khớp với nhau. Điều này tránh xóa toàn bộ đầu vào, sẽ luôn bắt đầu bằng a <và kết thúc bằng a >.

    Tên ngôn ngữ bây giờ bắt đầu bằng ký tự đầu tiên của chuỗi đầu vào được sửa đổi còn lại.

  2. Sau tên của ngôn ngữ, chúng ta hầu như sẽ luôn tìm thấy một trong những kết thúc sau:

    ,, -, &, (, , 5, Hoặc một không gian sau đó là hai chữ số.

    Hai kết thúc đầu tiên khá phổ biến và Python 2 &amp; PuLP...nên được phân tích thành as Python 2, Ruby (2.2.2p95)...as Ruby, >PHP – 3302 bytesas PHPPerl 5...as Perl.

    (,| [-&(–5]| \d\d).* sẽ khớp với tất cả các kết thúc này (và tất cả các ký tự sau chúng), nhưng nó sẽ dẫn đến một vài kết quả dương tính giả:

    • ,sẽ khớp với dấu phẩy trong tên ngôn ngữ Help, WarDoq!.

    • (sẽ phù hợp với phiên bản của JavaScript (ESx)Java (1.8).

    • \d\dsẽ phù hợp với phiên bản trong Ti-Basic 84.

    Chúng tôi có thể sửa chữa các trường hợp vấn đề thứ ba bằng cách sử dụng [0-7]\dthay vì \d\dđể tránh phù hợp với 884.

    Đối với các trường hợp vấn đề khác, chúng tôi sử dụng giao diện phủ định (?! W|...\))sẽ ngăn mẫu trước đó khớp với nếu nó được theo sau W(như trong Help, WarDoq!) hoặc chính xác ba ký tự và dấu ngoặc đơn đóng (như trong (ES6)hoặc (1.8)).

    Đặt tất cả lại với nhau, (,| [-&(–5]| [0-7]\d)(?! W|...\)).*khớp mọi thứ sau tên ngôn ngữ.

  3. Chúng tôi còn lại với hai trường hợp vấn đề:

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

    được phân tích cú pháp như

    Python 2 3
    Zozotez Lisp:
    

    Chúng ta có thể sửa lỗi thứ nhất bằng cách xóa và cái thứ hai bằng cách xóa :khỏi đầu ra.

    Điều này đạt được bằng cách thay thế 2 |:bằng chuỗi trống.


16

Bash, 100%, 100 byte

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

Hãy thử trực tuyến trên Ideone .

xác minh

$ 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
Huh, tôi thực sự nghĩ rằng điều này sẽ rất khó khăn ... công việc tốt!
Hạ cấp


4

Jolf, 13 byte, 85,94%, không lọc

ρΥ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  

Tôi đã có bản cập nhật này trên máy tính của tôi. Tôi cảm thấy buồn vì đã quên cập nhật mã tương ứng cho trình thông dịch. Tôi không cảm thấy muốn chụp 100%. Có lẽ mọi người nên định dạng các tiêu đề của mình giống nhau ¯ \ _ (ツ) _ /


Tước thẻ là một ý tưởng tốt. Điều đó đã lưu ba byte trong câu trả lời Retina của tôi.
Dennis

@Dennis Cảm ơn! Vui vì nó đã giúp.
Conor O'Brien
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.