Cual es el idioma

17

Recientemente, la tabla de clasificación de diseño PPCG ha tenido algunos problemas al analizar encabezados html de respuesta .

En este desafío, tendrás tu propia oportunidad de analizar los encabezados de respuesta.


Ejemplos de casos de prueba

Estas entradas de ejemplo ( NO casos de prueba reales), solo para que pueda hacerse una idea de cómo podrían ser las entradas

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>

Especificaciones

Su programa debe tener 150 bytes o menos

Se le dará una línea de html de encabezado de respuesta, deberá intentar hacer lo mejor para extraer el idioma con éxito. La entrada puede contener caracteres unicode.

El caso de salida es importante.

Pruebas

Github Gist con casos de prueba

Hay un caso de prueba por línea. El formato es:

<lang_name> - <rest_of_the_line_is_the_header>

Puntuación

Tu puntaje es:

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

(que es un porcentaje)

El desempate es el código más corto.

Downgoat
fuente
Debería haber un desempate como el código más corto ya que se puede lograr una puntuación del 100%.
user81655 el
1
¿El estilo de encabezado más común #ni siquiera está presente en los casos de prueba?
edc65
Entonces, ¿el idioma suele ser la primera palabra de entrada?
TanMath
@ edc65 Creo que se trata de analizar la salida HTML de la respuesta, no la fuente de Markdown.
Kroltan
55
Analizando HTML con expresiones regulares? ¿Qué sigue?
Neil

Respuestas:

11

Retina 0.8.2 , 100%, 75 71 70 68 67 64 59 53 51 bytes

<.*?>

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

2 |:

Esto es esencialmente un código de golf ahora, así que tuve que cambiar de idioma.

Pruébalo en línea!

Verificación

$ 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

Cómo funciona

El código consta de tres sustituciones simples (o eliminaciones). En lugar de tratar de hacer coincidir el nombre del idioma, nos deshacemos de todas las partes de la cadena de entrada que forman parte de él.

  1. <.*?> coincidirá con todas las etiquetas HTML, por lo que la sustitución las eliminará de la entrada.

    .*?coincide con cualquier cantidad de caracteres, pero dado que ?hace que el cuantificador sea flojo , coincidirá con la menor cantidad posible que aún permita que coincida todo el patrón. Esto evita eliminar toda la entrada, que siempre comenzará con a <y finalizará con a >.

    El nombre del idioma ahora comienza con el primer carácter de la cadena de entrada modificada restante.

  2. Después del nombre del idioma, casi siempre encontraremos uno de los siguientes finales:

    ,, -, &, (, , 5, O un espacio seguido de dos dígitos.

    Las dos primeras terminaciones son bastante comunes y Python 2 &amp; PuLP...deben analizarse como Python 2, Ruby (2.2.2p95)...como Ruby, >PHP – 3302 bytescomo PHPy Perl 5...como Perl.

    (,| [-&(–5]| \d\d).* coincidiría con todas estas terminaciones (y todos los caracteres después de ellas), pero generará algunos falsos positivos:

    • ,coincidirá con la coma en el nombre del idioma Help, WarDoq!.

    • (coincidirá con la versión de JavaScript (ESx)y Java (1.8).

    • \d\dcoincidirá con la versión en Ti-Basic 84.

    Podemos solucionar el tercer caso de problema usando en [0-7]\dlugar de \d\d, para evitar hacer coincidir el 8in 84.

    Para los otros casos problemáticos, usamos la búsqueda anticipada negativa (?! W|...\))que evitará que el patrón anterior coincida si es seguido por W(como en Help, WarDoq!) o exactamente por tres caracteres y un paréntesis de cierre (como en (ES6)o (1.8)).

    Poniendo todo junto, (,| [-&(–5]| [0-7]\d)(?! W|...\)).*coincide con todo después del nombre del idioma.

  3. Nos quedan dos casos problemáticos:

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

    se analiza como

    Python 2 3
    Zozotez Lisp:
    

    Podemos arreglar el primero eliminando y el segundo eliminando :de la salida.

    Esto se logra reemplazando 2 |:con la cadena vacía.

Dennis
fuente
16

Bash, 100%, 100 bytes

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

Pruébelo en línea en Ideone .

Verificación

$ 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
fuente
2
Huh, realmente pensé que esto sería muy difícil ... ¡buen trabajo!
Downgoat
4

Jolf, 13 bytes, 85.94%, sin competencia

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

Tenía esta actualización en mi computadora. Para mi disgusto, me había olvidado de actualizar el código respectivo para el intérprete. No tengo ganas de disparar al 100%. Tal vez todos deberían formatear sus encabezados de la misma manera ¯ \ _ (ツ) _ / ¯

Conor O'Brien
fuente
Eliminar etiquetas es una buena idea. Eso ahorró tres bytes en mi respuesta Retina.
Dennis el
@ Dennis Gracias! Me alegra que haya ayudado.
Conor O'Brien el