Qual è la lingua?


17

Di recente, la classifica di progettazione PPCG ha avuto qualche problema nell'analizzare le intestazioni html delle risposte .

In questa sfida farai il tuo colpo per analizzare le intestazioni delle risposte.


Esempi di casi di test

Questi input di esempio ( NON casi di test effettivi), solo così puoi avere un'idea di come potrebbero essere gli input

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

Il tuo programma dovrebbe essere di 150 byte o meno

Ti verrà data una riga dell'html dell'intestazione di una risposta, dovrai cercare di fare del tuo meglio per estrarre correttamente la lingua. L'input può contenere caratteri unicode.

Il caso di uscita è importante.

test

Github Gist con casi di test

C'è un caso di test per riga. Il formato è:

<lang_name> - <rest_of_the_line_is_the_header>

punteggio

Il tuo punteggio è:

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

(che è una percentuale)

Il demolitore è il codice più breve.


Dovrebbe esserci un pareggio come il codice più breve poiché il punteggio del 100% è molto realizzabile.
user81655

1
Lo stile di intestazione più comune #non è nemmeno presente nei casi di test ?!
edc65,

Quindi la lingua è in genere la prima parola dell'input?
TanMath,

@ edc65 Credo che si tratti dell'analisi dell'output HTML della risposta, non dell'origine Markdown.
Kroltan,

5
Analizzare HTML con regex? Qualunque sia il prossimo?
Neil,

Risposte:


11

Retina 0,8,2 , 100%, 75 71 70 68 67 64 59 53 51 byte

<.*?>

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

2 |:

Questo è essenzialmente il golf del codice ora, quindi ho dovuto cambiare lingua.

Provalo online!

Verifica

$ 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

Come funziona

Il codice è costituito da tre semplici sostituzioni (o eliminazioni). Invece di cercare di abbinare il nome della lingua, ci liberiamo di tutte le parti della stringa di input che ne fanno parte.

  1. <.*?> corrisponderà a tutti i tag HTML, quindi la sostituzione li eliminerà dall'input.

    .*?corrisponde a qualsiasi quantità di caratteri, ma poiché ?rende il quantificatore pigro , corrisponderà alla quantità minima possibile che consente comunque di far corrispondere l'intero modello. Questo evita di cancellare l'intero input, che inizierà sempre con a <e finirà con a >.

    Il nome della lingua ora inizia con il primo carattere della stringa di input modificata rimanente.

  2. Dopo il nome della lingua, troveremo quasi sempre una delle seguenti terminazioni:

    ,, -, &, (, , 5, O uno spazio seguito da due cifre.

    I primi due finali sono piuttosto comuni e Python 2 &amp; PuLP...dovrebbero essere analizzati come Python 2, Ruby (2.2.2p95)...come Ruby, >PHP – 3302 bytescome PHPe Perl 5...come Perl.

    (,| [-&(–5]| \d\d).* corrisponderebbe a tutti questi finali (e tutti i caratteri dopo di essi), ma si tradurrà in alcuni falsi positivi:

    • ,corrisponderà alla virgola nel nome della lingua Help, WarDoq!.

    • (corrisponderà alla versione di JavaScript (ESx)e Java (1.8).

    • \d\dcorrisponderà alla versione in Ti-Basic 84.

    Possiamo risolvere il terzo caso problematico usando [0-7]\dinvece di \d\d, per evitare di abbinare 8in 84.

    Per gli altri casi problematici, utilizziamo il lookahead negativo (?! W|...\))che impedisce la corrispondenza del modello precedente se è seguito da W(come in Help, WarDoq!) o da esattamente tre caratteri e una parentesi chiusa (come in (ES6)o (1.8)).

    Mettendo tutto insieme, (,| [-&(–5]| [0-7]\d)(?! W|...\)).*corrisponde a tutto dopo il nome della lingua.

  3. Restano due casi problematici:

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

    viene analizzato come

    Python 2 3
    Zozotez Lisp:
    

    Possiamo correggere il primo rimuovendo e il secondo rimuovendo :dall'output.

    Ciò si ottiene sostituendo 2 |:con la stringa vuota.


16

Bash, 100%, 100 byte

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

Provalo online su Ideone .

Verifica

$ 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
Eh, pensavo davvero che sarebbe stato molto difficile ... bel lavoro!
Downgoat,


4

Jolf, 13 byte, 85,94%, non 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  

Ho avuto questo aggiornamento sul mio computer. Fu con mio disappunto che avevo dimenticato di aggiornare il rispettivo codice per l'interprete. Non ho voglia di sparare al 100%. Forse tutti dovrebbero formattare le proprie intestazioni allo stesso modo ¯ \ _ (ツ) _ / ¯


Stripping tags è una buona idea. Ciò ha salvato tre byte nella mia risposta Retina.
Dennis,

@Dennis Grazie! Sono contento che abbia aiutato.
Conor O'Brien,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.