Apa bahasanya?

17

Baru-baru ini, leaderboard desain PPCG telah mengalami beberapa masalah dalam menguraikan header html jawaban .

Dalam tantangan ini, Anda akan mengambil kesempatan sendiri untuk mengurai header jawaban.


Contoh Kasus Uji

Ini contoh input ( BUKAN kasus uji yang sebenarnya), supaya Anda bisa mendapatkan gagasan tentang bagaimana input mungkin menjadi seperti

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>

Spec

Program Anda harus 150 byte atau di bawah

Anda akan diberi satu baris html tajuk jawaban, Anda harus berusaha melakukan yang terbaik untuk berhasil mengekstrak bahasa. Input mungkin mengandung karakter unicode.

Kasus keluaran penting.

Tes

Github Gist dengan kasus uji

Ada satu test case per baris. Formatnya adalah:

<lang_name> - <rest_of_the_line_is_the_header>

Mencetak gol

Nilaimu adalah:

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

(yang merupakan persen)

Tie-breaker adalah kode terpendek.

Downgoat
sumber
Harus ada tie-breaker seperti kode terpendek karena skor 100% sangat bisa dicapai.
user81655
1
Gaya tajuk paling umum #bahkan tidak ada dalam kasus uji ?!
edc65
Jadi bahasanya biasanya kata input pertama?
TanMath
@ edc65 Saya percaya ini tentang parsing output HTML dari jawabannya, bukan sumber penurunan harga.
Kroltan
5
Parsing HTML dengan regex? Selanjutnya apa
Neil

Jawaban:

11

Retina 0.8.2 , 100%, 75 71 70 68 67 64 59 53 51 byte

<.*?>

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

2 |:

Ini pada dasarnya kode golf sekarang, jadi saya harus beralih bahasa.

Cobalah online!

Verifikasi

$ 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

Bagaimana itu bekerja

Kode terdiri dari tiga substitusi sederhana (atau eliminasi). Alih-alih mencoba mencocokkan nama bahasa, kami membuang semua bagian dari string input yang membentuk bagian dari itu.

  1. <.*?> akan cocok dengan semua tag HTML, sehingga substitusi akan menghilangkannya dari input.

    .*?cocok dengan jumlah karakter apa pun, tetapi karena ?membuat kuantifier malas , itu akan cocok dengan jumlah sekecil mungkin yang masih memungkinkan seluruh pola untuk mencocokkan. Ini menghindari menghapus seluruh input, yang akan selalu dimulai dengan a <dan diakhiri dengan a >.

    Nama bahasa sekarang dimulai dengan karakter pertama dari string input yang dimodifikasi yang tersisa.

  2. Setelah nama bahasa, kita akan hampir selalu menemukan salah satu dari akhiran berikut:

    ,, -, &, (, , 5, Atau spasi diikuti oleh dua digit.

    Dua ujung pertama agak umum, dan Python 2 &amp; PuLP...harus diuraikan sebagai Python 2, Ruby (2.2.2p95)...seperti Ruby, >PHP – 3302 bytessebagai PHP, danPerl 5... sebagaiPerl .

    (,| [-&(–5]| \d\d).* akan cocok dengan semua ujung ini (dan semua karakter setelahnya), tetapi itu akan menghasilkan beberapa kesalahan positif:

    • , akan cocok dengan koma dalam nama bahasa Help, WarDoq! .

    • (akan cocok dengan versi JavaScript (ESx)danJava (1.8) .

    • \d\d akan cocok dengan versi di Ti-Basic 84 .

    Kami dapat memperbaiki kasus masalah ketiga dengan menggunakan [0-7]\dalih-alih \d\d, untuk menghindari pencocokan8 di 84.

    Untuk kasus masalah lainnya, kami menggunakan lookahead negatif (?! W|...\))yang akan mencegah pencocokan pola sebelumnya jika diikuti oleh W(seperti dalam Help, WarDoq!) atau dengan tepat tiga karakter dan tanda kurung penutup (seperti dalam(ES6) atau (1.8)).

    Menyatukan semuanya, (,| [-&(–5]| [0-7]\d)(?! W|...\)).*cocok dengan semuanya setelah nama bahasa.

  3. Kami memiliki dua kasus masalah:

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

    diurai sebagai

    Python 2 3
    Zozotez Lisp:
    

    Kita bisa memperbaiki yang pertama dengan menghapus dan yang kedua dengan menghapus: dari output.

    Ini dicapai dengan mengganti 2 |:dengan string kosong.

Dennis
sumber
16

Bash, 100%, 100 byte

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

Cobalah online di Ideone .

Verifikasi

$ 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
Dennis
sumber
2
Huh, saya benar-benar berpikir ini akan sangat sulit ... pekerjaan bagus!
Downgoat
4

Jolf, 13 byte, 85,94%, tidak bersaing

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

Saya memiliki pembaruan ini di komputer saya. Saya sangat kecewa karena saya lupa memperbarui kode masing-masing untuk juru bahasa. Saya tidak merasa ingin memotret 100%. Mungkin semua orang harus memformat tajuknya sama dengan ¯ \ _ (ツ) _ / ¯

Conor O'Brien
sumber
Mengupas tag adalah ide yang bagus. Itu menyimpan tiga byte dalam jawaban Retina saya.
Dennis
@Dennis Terima kasih! Senang itu membantu.
Conor O'Brien