ภาษาคืออะไร


17

เมื่อเร็ว ๆ นี้การออกแบบ PPCGลีดเดอร์ได้รับมีปัญหาบางอย่างแยกคำตอบhtml ที่ส่วนหัว

ในการท้าทายนี้คุณจะต้องทำการยิงของตัวเองในการแยกส่วนหัวคำตอบ


ตัวอย่างกรณีทดสอบ

อินพุตตัวอย่างเหล่านี้( ไม่ใช่กรณีทดสอบจริง) ดังนั้นคุณจึงสามารถทราบได้ว่าอินพุทอาจเป็นอย่างไร

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 ของส่วนหัวคำตอบคุณจะต้องพยายามทำอย่างดีที่สุดเพื่อแยกภาษาออกมาเป็นผลสำเร็จ ข้อมูลที่ป้อนอาจมีอักขระ Unicode

กรณีการส่งออกมีความสำคัญ

การทดสอบ

Github สรุปสาระสำคัญกับกรณีทดสอบ

มีหนึ่งกรณีทดสอบต่อบรรทัด รูปแบบคือ:

<lang_name> - <rest_of_the_line_is_the_header>

เกณฑ์การให้คะแนน

คะแนนของคุณคือ:

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

(ซึ่งเป็นเปอร์เซ็นต์)

ไทเบรกเกอร์เป็นรหัสที่สั้นที่สุด


ควรมีไทเบรกเกอร์เหมือนรหัสที่สั้นที่สุดเนื่องจากสามารถทำคะแนนได้ 100%
user81655

1
รูปแบบส่วนหัวที่พบบ่อยที่สุด#ไม่ได้ปรากฏในกรณีทดสอบ!
edc65

ดังนั้นภาษาจึงเป็นคำแรกที่อินพุต?
TanMath

@ edc65 ฉันเชื่อว่านี่เป็นเรื่องเกี่ยวกับการแยกวิเคราะห์เอาต์พุต HTMLของคำตอบไม่ใช่แหล่งข้อมูลมาร์กดาวน์
Kroltan

5
กำลังแยก HTML ด้วย regex หรือไม่ อะไรต่อไป
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 ทั้งหมดดังนั้นการแทนที่จะลบออกจากอินพุต

    .*?จับคู่จำนวนอักขระใด ๆ แต่เนื่องจาก?ทำให้ตัวนับขี้เกียจมันจะจับคู่กับจำนวนที่น้อยที่สุดเท่าที่จะเป็นไปได้ซึ่งยังคงอนุญาตให้รูปแบบทั้งหมดตรงกัน หลีกเลี่ยงปัญหานี้ลบการป้อนข้อมูลทั้งหมดซึ่งมักจะเริ่มต้นด้วยและสิ้นสุดด้วย<>

    ชื่อภาษาเริ่มต้นด้วยอักขระตัวแรกของสตริงอินพุตที่แก้ไขแล้วที่เหลือ

  2. หลังจากชื่อภาษาเราจะพบหนึ่งในตอนจบต่อไปนี้:

    ,, - , &, (, ,5หรือพื้นที่ตามด้วยตัวเลขสองหลัก

    สองตอนจบแรกเป็นเรื่องธรรมดาและPython 2 &amp; PuLP...ควรจะแยกเป็นPython 2, Ruby (2.2.2p95)...เป็นRuby,>PHP – 3302 bytesเป็นPHPและเป็นPerl 5...Perl

    (,| [-&(–5]| \d\d).* จะตรงกับตอนจบเหล่านี้ทั้งหมด (และตัวละครทั้งหมดตามหลังพวกเขา) แต่มันจะส่งผลให้เกิดผลบวกปลอม:

    • , จะจับคู่เครื่องหมายจุลภาคในชื่อภาษา Help, WarDoq!จะตรงกับเครื่องหมายจุลภาคในชื่อภาษา

    • ( จะตรงกับรุ่นของ JavaScript (ESx)Java (1.8)และ

    • \d\d จะจับคู่เวอร์ชันใน Ti-Basic 84จะตรงกับรุ่นใน

    เราสามารถแก้ไขกรณีปัญหาที่สามโดยใช้ [0-7]\dแทน\d\dเพื่อหลีกเลี่ยงการจับคู่884ใน

    สำหรับกรณีที่มีปัญหาอื่น ๆ เราใช้ lookahead เชิงลบ(?! W|...\))ที่จะป้องกันรูปแบบก่อนหน้าจากการจับคู่หากมีการตามด้วยW(เช่นในHelp, WarDoq! ) หรือตามตัวอักษรสามตัวและวงเล็บปิด (เช่นเดียวกับใน(ES6)หรือ(1.8) )

    วางมันทั้งหมดเข้าด้วยกัน, (,| [-&(–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

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

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

ฉันมีอัปเดตนี้ในคอมพิวเตอร์ของฉัน ความผิดหวังของฉันคือฉันลืมปรับปรุงรหัสตามลำดับสำหรับล่าม ฉันไม่รู้สึกอยากถ่าย 100% บางทีทุกคนควรจัดรูปแบบส่วนหัวเหมือนกัน¯ \ _ (ツ) _ / ¯


การลอกแท็กเป็นความคิดที่ดี นั่นช่วยประหยัดสามไบต์ในคำตอบ Retina ของฉัน
Dennis

@ เดนนิสขอบคุณ! ดีใจที่มันช่วย
Conor O'Brien
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.