Jaki jest język

17

Ostatnio w tabeli wyników projektu PPCG występują problemy z analizowaniem nagłówków HTML odpowiedzi .

W tym wyzwaniu spróbujesz parsować nagłówki odpowiedzi.


Przykładowe przypadki testowe

Te przykładowe dane wejściowe ( NIE rzeczywiste przypadki testowe), tylko po to, abyś mógł zrozumieć, jak mogą być dane wejściowe

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

Twój program powinien mieć 150 bajtów lub mniej

Otrzymasz wiersz html nagłówka odpowiedzi, musisz postarać się jak najlepiej wypakować język. Dane wejściowe mogą zawierać znaki Unicode.

Sprawa wyjściowa ma znaczenie.

Testy

Github Gist z przypadkami testowymi

Istnieje jeden przypadek testowy na linię. Format to:

<lang_name> - <rest_of_the_line_is_the_header>

Punktacja

Twój wynik to:

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

(co jest procentem)

Tie-breaker to najkrótszy kod.

Downgoat
źródło
Powinien istnieć remis jak najkrótszy kod, ponieważ 100% punktów jest bardzo osiągalnych.
user81655
1
Najpopularniejszy styl nagłówka #nie występuje nawet w przypadkach testowych?!
edc65
Więc język jest zazwyczaj pierwszym słowem na wejściu?
TanMath
@ edc65 Wydaje mi się, że chodzi o analizę wyniku HTML odpowiedzi, a nie źródła Markdown.
Kroltan
5
Analizujesz HTML za pomocą wyrażenia regularnego? Co dalej?
Neil

Odpowiedzi:

11

Siatkówka 0,8 , 100%, 75 71 70 68 67 64 59 53 51 bajtów

<.*?>

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

2 |:

Zasadniczo jest to teraz kod golfowy, więc musiałem zmienić język.

Wypróbuj online!

Weryfikacja

$ 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

Jak to działa

Kod składa się z trzech prostych podstawień (lub eliminacji). Zamiast próbować dopasować nazwę języka, pozbywamy się wszystkich części ciągu wejściowego, które stanowią jego część.

  1. <.*?> dopasuje wszystkie tagi HTML, więc podstawienie wyeliminuje je z danych wejściowych.

    .*?dopasowuje dowolną liczbę znaków, ale ponieważ ?powoduje, że kwantyfikator jest leniwy , dopasuje najmniejszą możliwą liczbę, która wciąż pozwala na dopasowanie całego wzorca. Pozwala to uniknąć usuwania całego wejścia, które zawsze zaczyna się od <a kończy na a >.

    Nazwa języka zaczyna się teraz od pierwszego znaku pozostałego zmodyfikowanego ciągu wejściowego.

  2. Po nazwie języka prawie zawsze znajdziemy jedno z następujących zakończeń:

    ,, -, &, (, ,5 , Lub spację dwóch cyfr.

    Pierwsze dwa zakończenia są dość powszechne i Python 2 &amp; PuLP...powinny być analizowane jako Python 2, Ruby (2.2.2p95)...jako Ruby, >PHP – 3302 bytesjako PHPi Perl 5...jako Perl.

    (,| [-&(–5]| \d\d).* dopasuje wszystkie te zakończenia (i wszystkie znaki po nich), ale spowoduje to kilka fałszywych trafień:

    • ,dopasuje przecinek w nazwie języka Help, WarDoq!.

    • (będzie pasować do wersji JavaScript (ESx)i Java (1.8).

    • \d\ddopasuje wersję w Ti-Basic 84.

    Możemy naprawić trzeci przypadek problemu, używając [0-7]\dzamiast \d\d, aby uniknąć dopasowania 8w 84.

    W innych przypadkach problemowych używamy negatywnego spojrzenia (?! W|...\)), które zapobiegnie dopasowaniu poprzedniego wzoru, jeśli po nim następują W(jak w Help, WarDoq!) lub dokładnie trzy znaki i nawias zamykający (jak w (ES6)lub(1.8) ).

    Zestawiając wszystko razem, (,| [-&(–5]| [0-7]\d)(?! W|...\)).*dopasowuje wszystko po nazwie języka.

  3. Pozostały nam dwa przypadki problemów:

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

    zostaje przeanalizowany jako

    Python 2 3
    Zozotez Lisp:
    

    Pierwszy możemy naprawić, usuwając, a drugi usuwając :z wyjścia.

    Osiąga się to poprzez zastąpienie 2 |:pustym łańcuchem.

Dennis
źródło
16

Bash, 100%, 100 bajtów

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

Wypróbuj online na Ideone .

Weryfikacja

$ 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
źródło
2
Huh, naprawdę myślałem, że to będzie bardzo trudne ... niezła robota!
Downgoat 23.01.16
4

Jolf, 13 bajtów, 85,94%, niekonkurujący

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

Miałem tę aktualizację na swoim komputerze. Ku mojemu rozczarowaniu zapomniałem zaktualizować odpowiedni kod dla tłumacza. Nie mam ochoty strzelać za 100%. Może każdy powinien sformatować swoje nagłówki tak samo ¯ \ _ (ツ) _ / ¯

Conor O'Brien
źródło
Zdejmowanie tagów to dobry pomysł. To zaoszczędziło trzy bajty w mojej odpowiedzi Retina.
Dennis
@Dennis Thanks! Cieszę się, że pomogło.
Conor O'Brien