Quelle est la langue?

17

Récemment, le tableau de bord de conception PPCG a rencontré des difficultés à analyser les en- têtes HTML de réponse .

Dans ce défi, vous tenterez d'analyser les en-têtes de réponse.


Exemples de cas de test

Ces exemples d'entrées ( PAS les cas de test réels), juste pour que vous puissiez avoir une idée de la façon dont les entrées pourraient être

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

Votre programme doit être de 150 octets ou moins

Vous recevrez une ligne html d'en-tête de réponse, vous devrez essayer de faire de votre mieux pour réussir à extraire la langue. L'entrée peut contenir des caractères Unicode.

Le cas de sortie est important.

Les tests

Github Gist avec des cas de test

Il y a un cas de test par ligne. Le format est:

<lang_name> - <rest_of_the_line_is_the_header>

Notation

Ton score est:

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

(qui est un pourcentage)

Le bris d'égalité est le code le plus court.

Downgoat
la source
Il devrait y avoir un bris d'égalité comme le code le plus court car un score de 100% est très réalisable.
user81655
1
Le style d'en-tête le plus courant #n'est même pas présent dans les cas de test?!
edc65
Donc, la langue est généralement le premier mot de l'entrée?
TanMath
@ edc65 Je crois qu'il s'agit d'analyser la sortie HTML de la réponse, pas la source Markdown.
Kroltan
5
Analyser HTML avec regex? Et ensuite?
Neil

Réponses:

11

Rétine 0,8,2 , 100%, 75 71 70 68 67 64 59 53 51 octets

<.*?>

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

2 |:

C'est essentiellement du golf de code maintenant, j'ai donc dû changer de langue.

Essayez-le en ligne!

Vérification

$ 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

Comment ça fonctionne

Le code consiste en trois substitutions (ou éliminations) simples. Au lieu d'essayer de faire correspondre le nom de la langue, nous nous débarrassons de toutes les parties de la chaîne d'entrée qui en font partie.

  1. <.*?> correspondra à toutes les balises HTML, donc la substitution les éliminera de l'entrée.

    .*?correspond à n'importe quelle quantité de caractères, mais puisque ?rend le quantificateur paresseux , il correspondra à la quantité la plus petite possible qui permet toujours au motif entier de correspondre. Cela évite de supprimer l'intégralité de l'entrée, qui commencera toujours par a <et se terminera par a >.

    Le nom de la langue commence maintenant par le premier caractère de la chaîne d'entrée modifiée restante.

  2. Après le nom de la langue, nous trouverons presque toujours l'une des terminaisons suivantes:

    ,, -, &, (, ,5 , Ou un espace suivi de deux chiffres.

    Les deux premières fins sont assez courantes et Python 2 &amp; PuLP...doivent être analysées comme Python 2, Ruby (2.2.2p95)...comme Ruby, >PHP – 3302 bytescomme PHPet Perl 5...commePerl .

    (,| [-&(–5]| \d\d).* correspondrait à toutes ces terminaisons (et à tous les caractères qui les suivent), mais cela entraînerait quelques faux positifs:

    • ,correspondra à la virgule dans le nom de la langue Help, WarDoq!.

    • (correspondra à la version de JavaScript (ESx)et Java (1.8).

    • \d\dcorrespondra à la version en Ti-Basic 84.

    Nous pouvons résoudre le troisième cas de problème en utilisant [0-7]\dau lieu de \d\d, pour éviter de faire correspondre le8 dans 84.

    Pour les autres cas problématiques, nous utilisons l'anticipation négative (?! W|...\))qui empêchera la correspondance du modèle précédent s'il est suivi par W(comme dans Help, WarDoq!) ou par exactement trois caractères et une parenthèse fermante (comme dans (ES6)ou(1.8) ).

    Tout mettre ensemble, (,| [-&(–5]| [0-7]\d)(?! W|...\)).*correspond à tout après le nom de la langue.

  3. Il nous reste deux cas problématiques:

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

    obtient analysé comme

    Python 2 3
    Zozotez Lisp:
    

    Nous pouvons corriger le premier en supprimant et le second en supprimant: de la sortie.

    Ceci est réalisé en remplaçant 2 |:par la chaîne vide.

Dennis
la source
16

Bash, 100%, 100 octets

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

Essayez-le en ligne sur Ideone .

Vérification

$ 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
la source
2
Huh, je pensais vraiment que ce serait très difficile ... beau travail!
Downgoat
4

Jolf, 13 octets, 85,94%, sans concurrence

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

J'ai eu cette mise à jour sur mon ordinateur. C'est à mon grand regret que j'avais oublié de mettre à jour le code respectif de l'interprète. Je n'ai pas envie de tirer à 100%. Peut-être que tout le monde devrait formater ses en-têtes de la même façon ¯ \ _ (ツ) _ / ¯

Conor O'Brien
la source
Retirer les étiquettes est une bonne idée. Cela a sauvé trois octets dans ma réponse Retina.
Dennis
@Dennis Merci! Heureux que cela ait aidé.
Conor O'Brien