Що таке мова?


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 Gist з тестовими кейсами

Є один тестовий випадок на рядок. Формат:

<lang_name> - <rest_of_the_line_is_the_header>

Оцінка балів

Ваш рахунок:

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

(що становить відсоток)

Автоматичний вимикач - найкоротший код.


Повинно бути крапку, як найкоротший код, оскільки 100% бал дуже досяжний.
користувач81655

1
Найпоширеніший стиль заголовка #навіть не присутній у тестових випадках ?!
edc65

Отже, мова є, як правило, першим словом, яке вводиться?
TanMath

@ edc65 Я вважаю, що мова йде про аналіз виходу HTML відповіді, а не джерела Markdown.
Кролтан

5
Розбирання HTML з регулярним виразом? Що далі?
Ніл

Відповіді:


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

    Ім'я мови тепер починається з першого символу решти модифікованого рядка введення.

  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, щоб уникнути відповідності 8в 84.

    Для інших проблемних випадків ми використовуємо від'ємний 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
Ага, я дійсно думав, що це буде дуже складно ... приємна робота!
Пуховик


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  

Це оновлення у мене було на комп’ютері. На жаль, я забув оновити відповідний код для перекладача. Я не люблю стріляти на 100%. Можливо, кожен повинен форматувати свої заголовки однаково ¯ \ _ (ツ) _ / ¯


Зачистка тегів - хороша ідея. Це врятувало три байти у моїй відповіді на Retina.
Денніс

@Dennis Дякую! Радий, що це допомогло.
Conor O'Brien
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.