Was ist die sprache

17

Vor kurzem hatte die PPCG-Design- Bestenliste einige Probleme beim Parsen von Antwort- HTML-Headern .

In dieser Herausforderung können Sie selbst versuchen, Antwort-Header zu analysieren.


Beispiel Testfälle

Diese Beispieleingaben ( NICHT tatsächliche Testfälle), damit Sie eine Vorstellung davon bekommen, wie Eingaben aussehen könnten

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

Ihr Programm sollte 150 Bytes oder weniger sein

Sie erhalten eine Zeile mit dem HTML-Code eines Antwort-Headers. Sie müssen versuchen, Ihr Bestes zu geben, um die Sprache erfolgreich zu extrahieren. Die Eingabe kann Unicode-Zeichen enthalten.

Ausgabefall ist wichtig.

Tests

Github Gist mit Testfällen

Es gibt einen Testfall pro Zeile. Das Format ist:

<lang_name> - <rest_of_the_line_is_the_header>

Wertung

Dein Ergebnis ist:

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

(das ist ein Prozent)

Tie-Breaker ist der kürzeste Code.

Downgoat
quelle
Es sollte einen Tie-Breaker wie den kürzesten Code geben, da eine Punktzahl von 100% sehr gut erreichbar ist.
user81655
1
Der gebräuchlichste Header-Stil #ist in den Testfällen gar nicht vorhanden ?!
EDC65
Die Sprache ist also normalerweise das erste Wort, das eingegeben wird.
TanMath
@ edc65 Ich glaube, es geht darum, die HTML-Ausgabe der Antwort zu analysieren , nicht die Markdown-Quelle.
Kroltan
5
HTML mit Regex analysieren? Was auch immer als nächstes?
Neil

Antworten:

11

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

<.*?>

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

2 |:

Das ist jetzt im Wesentlichen Codegolf, also musste ich die Sprache wechseln.

Probieren Sie es online!

Nachprüfung

$ 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

Wie es funktioniert

Der Code besteht aus drei einfachen Ersetzungen (oder Eliminierungen). Anstatt zu versuchen, mit dem Namen der Sprache übereinzustimmen, werden alle Teile der Eingabezeichenfolge entfernt, die Teil der Eingabezeichenfolge sind.

  1. <.*?> stimmt mit allen HTML-Tags überein, sodass diese durch die Ersetzung aus der Eingabe entfernt werden.

    .*?Entspricht einer beliebigen Anzahl von Zeichen. Da ?der Quantifizierer jedoch faul ist , entspricht er der geringstmöglichen Anzahl, die noch für das gesamte Muster zulässig ist. Vermeiden Sie das Löschen der gesamten Eingabe, die immer mit a beginnt und mit a <endet >.

    Der Name der Sprache beginnt jetzt mit dem ersten Zeichen der verbleibenden geänderten Eingabezeichenfolge.

  2. Nach dem Namen der Sprache finden wir fast immer eine der folgenden Endungen:

    ,, -, &, (, , 5, Oder ein Raum , der von zwei Ziffern.

    Die ersten beiden Endungen sind ziemlich häufig und Python 2 &amp; PuLP...sollten als Python 2, Ruby (2.2.2p95)...as Ruby, >PHP – 3302 bytesas PHPund Perl 5...as analysiert werden Perl.

    (,| [-&(–5]| \d\d).* würde mit all diesen Endungen (und allen Zeichen danach) übereinstimmen, aber es werden ein paar falsch positive Ergebnisse erzielt:

    • ,stimmt mit dem Komma im Sprachennamen überein Help, WarDoq!.

    • (wird mit der Version von JavaScript (ESx)und übereinstimmen Java (1.8).

    • \d\dpasst zur Version in Ti-Basic 84.

    Wir können den dritten Problemfall beheben , indem Sie [0-7]\dstatt \d\d, passend zu dem zu vermeiden , 8in 84.

    Für die anderen Problemfälle verwenden wir den negativen Lookahead (?! W|...\)), der die Übereinstimmung des vorhergehenden Musters verhindert, wenn darauf W(wie in Help, WarDoq!) oder genau drei Zeichen und eine schließende Klammer (wie in (ES6)oder (1.8)) folgen .

    Alles zusammen, (,| [-&(–5]| [0-7]\d)(?! W|...\)).*alles nach dem Namen der Sprache.

  3. Wir haben zwei Problemfälle:

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

    wird analysiert als

    Python 2 3
    Zozotez Lisp:
    

    Wir können das erste Problem beheben, indem wir es entfernen, und das zweite, indem wir es :aus der Ausgabe entfernen .

    Dies wird durch Ersetzen 2 |:durch die leere Zeichenfolge erreicht.

Dennis
quelle
16

Bash, 100%, 100 Bytes

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

Probieren Sie es online auf Ideone .

Nachprüfung

$ 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
quelle
2
Huh, ich dachte wirklich, das wäre sehr schwierig ... gute Arbeit!
Downgoat
4

Jolf, 13 Bytes, 85,94%, nicht konkurrierend

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

Ich hatte dieses Update auf meinem Computer. Zu meinem Leidwesen hatte ich vergessen, den entsprechenden Code für den Dolmetscher zu aktualisieren. Ich habe keine Lust zu 100% zu schießen. Vielleicht sollte jeder seine Header gleich formatieren ¯ \ _ (ツ) _ / ¯

Conor O'Brien
quelle
Das Entfernen von Tags ist eine gute Idee. Das sparte drei Bytes in meiner Retina-Antwort.
Dennis
@ Tennis Danke! Ich bin froh, dass es geholfen hat.
Conor O'Brien