Что за язык?


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-кода заголовка ответа, вам нужно будет постараться сделать все возможное для успешного извлечения языка. Входные данные могут содержать символы Юникода.

Выходной регистр имеет значение.

тесты

Github Gist с тестовыми примерами

В каждой строке есть один тест. Формат такой:

<lang_name> - <rest_of_the_line_is_the_header>

счет

Ваш счет:

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

(это процент)

Тай-брейк - самый короткий код.


Должен быть тай-брейк, как самый короткий код, так как 100% баллов очень достижимы.
user81655

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, поэтому подстановка исключит их из ввода.

    .*?соответствует любому количеству символов, но поскольку ?квантификатор делает ленивым , он будет соответствовать наименьшему возможному количеству, которое позволяет сопоставить весь шаблон. Это позволит избежать удаления всего ввода, который всегда будет начинаться с а <и заканчиваться на а >.

    Имя языка теперь начинается с первого символа оставшейся измененной входной строки.

  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.

    Для других проблемных случаев мы используем отрицательный прогноз (?! 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

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.
Деннис

@ Деннис Спасибо! Рад, что это помогло.
Конор О'Брайен
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.