Qual é o idioma?


17

Recentemente, o cabeçalho do projeto do PPCG tem tido alguns problemas ao analisar os cabeçalhos html da resposta .

Neste desafio, você estará tentando analisar cabeçalhos de resposta.


Casos de teste de exemplo

Estes exemplos de entradas ( NÃO casos de teste reais), apenas para que você possa ter uma idéia de como as entradas podem ser

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

Seu programa deve ter 150 bytes ou menos

Você receberá uma linha do html do cabeçalho da resposta; precisará fazer o possível para extrair o idioma com sucesso. A entrada pode conter caracteres unicode.

O caso de saída é importante.

Testes

Github Gist com casos de teste

Há um caso de teste por linha. O formato é:

<lang_name> - <rest_of_the_line_is_the_header>

Pontuação

Sua pontuação é:

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

(que é um percentual)

O desempatador é o código mais curto.


Deve haver um desempate como o código mais curto, pois 100% da pontuação é muito viável.
user81655

11
O estilo de cabeçalho mais comum #nem está presente nos casos de teste ?!
Edc65 23/01

Então o idioma é tipicamente a primeira palavra da entrada?
TanMath

@ edc65 Creio que se trata de analisar a saída HTML da resposta, não a fonte Markdown.
Kroltan 23/01

5
Analisando HTML com regex? O que vem depois?
Neil

Respostas:


11

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

<.*?>

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

2 |:

Isso é essencialmente código de golfe agora, então tive que trocar de idioma.

Experimente online!

Verificação

$ 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

Como funciona

O código consiste em três substituições simples (ou eliminações). Em vez de tentar corresponder ao nome do idioma, nos livramos de todas as partes da string de entrada que fazem parte dela.

  1. <.*?> corresponderá a todas as tags HTML, portanto a substituição as eliminará da entrada.

    .*?corresponde a qualquer quantidade de caracteres, mas, como ?torna o quantificador preguiçoso , ele corresponderá à menor quantidade possível que ainda permita que todo o padrão corresponda. Isso evita excluir toda a entrada, que sempre começa com a <e termina com a >.

    O nome do idioma agora começa com o primeiro caractere da sequência de entrada modificada restante.

  2. Após o nome do idioma, quase sempre encontramos um dos seguintes finais:

    ,, -, &, (, , 5, Ou um espaço seguido de dois dígitos.

    Os dois primeiros finais são bastante comuns e Python 2 &amp; PuLP...devem ser analisados ​​como Python 2, Ruby (2.2.2p95)...como Ruby, >PHP – 3302 bytescomo PHPe Perl 5...como Perl.

    (,| [-&(–5]| \d\d).* corresponderia a todos esses finais (e todos os caracteres após eles), mas resultará em alguns falsos positivos:

    • ,coincidirá com a vírgula no nome do idioma Help, WarDoq!.

    • (corresponderá à versão de JavaScript (ESx)e Java (1.8).

    • \d\dcorresponderá à versão em Ti-Basic 84.

    Podemos corrigir o terceiro caso de problema usando, em [0-7]\dvez de \d\d, para evitar a correspondência de 8in 84.

    Para os outros casos de problemas, usamos o indicador negativo (?! W|...\))que impedirá a correspondência do padrão anterior se for seguido por W(como em Help, WarDoq!) ou por exatamente três caracteres e um parêntese de fechamento (como em (ES6)ou (1.8)).

    Juntando tudo, (,| [-&(–5]| [0-7]\d)(?! W|...\)).*corresponde tudo depois do nome do idioma.

  3. Ficamos com dois casos de problemas:

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

    é analisado como

    Python 2 3
    Zozotez Lisp:
    

    Podemos corrigir o primeiro removendo e o segundo removendo :da saída.

    Isso é obtido substituindo 2 |:-o pela sequência vazia.


16

Bash, 100%, 100 bytes

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

Experimente online no Ideone .

Verificação

$ 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
Realmente pensei que isso seria muito difícil ... bom trabalho!
Downgoat


4

Jolf, 13 bytes, 85,94%, não-competitivo

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

Eu tive essa atualização no meu computador. Foi para meu desgosto que me esqueci de atualizar o respectivo código para o intérprete. Não sinto vontade de fotografar 100%. Talvez todos devam formatar seus cabeçalhos da mesma forma ¯ \ _ (ツ) _ / ¯


Retirar tags é uma boa ideia. Isso salvou três bytes na minha resposta Retina.
Dennis

@Dennis Thanks! Ainda bem que ajudou.
Conor O'Brien
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.