Sagen Sie voraus, ob eine Nachricht in 50 Bytes markiert wird oder nicht


41

Wenn Sie eine Zeichenfolge eingeben, die aus einer Nachricht aus unserem Site-Chatroom besteht, die aus der unten beschriebenen und verknüpften Liste stammt, geben Sie entweder einen echten oder einen falschen Wert aus, um vorherzusagen, ob diese Nachricht in 50 Bytes oder weniger markiert wurde.

Sie können alle wahrheitsgetreuen oder falschen Werte verwenden , diese müssen jedoch identisch sein (dh es sollten nur zwei mögliche Ausgaben vorhanden sein, eine wahrheitsgetreue und eine falsche). Die Eingabe wird als unformatiertes HTML mit entfernten Zeilenumbrüchen angegeben und kann Nicht-ASCII-Unicode-Zeichen enthalten. Wenn Sie eine andere Eingabe als UTF-8 benötigen, geben Sie dies bitte in Ihrer Antwort an.

Der Gewinner dieser Herausforderung ist derjenige, der den höchsten Prozentsatz an Chatnachrichten korrekt aus der unten verlinkten Liste vorhersagt. Wenn zwei Einsendungen die gleiche Erfolgsrate haben, gewinnt die kürzere Einsendung.

Bitte geben Sie Anweisungen zum Ausführen Ihres Codes für den gesamten Nachrichtensatz und zum Berechnen des korrekten Prozentsatzes. Im Idealfall handelt es sich hierbei um einen Code, der die positiven Testfälle durchläuft und ausgibt, wie viele davon Ihr Code richtig gemacht hat, und dann für die negativen Testfälle das Gleiche tut. (Die Gesamtpunktzahl kann dann manuell über berechnet werden (correctPositive + correctNegative) / totalMessages.)

Damit Ihr Code einigermaßen überprüfbar ist, muss er in maximal 5 Minuten für die gesamte Liste der Chat-Nachrichten auf vernünftiger moderner Hardware vollständig sein.

Die vollständige Liste der Chat-Nachrichten finden Sie hier . Sie besteht aus den 1000 neuesten markierten Nachrichten als echte Testfälle und den 1000 neuesten nicht markierten Nachrichten als falsche Testfälle. Beachten Sie, dass das Inhaltsverzeichnis zwei Dateien enthält. Blättern Sie etwa zur Hälfte nach unten, um die nicht markierten Nachrichten anzuzeigen.


4
Ich kenne das Verhalten des Chats und denke, dass der folgende Pyth ausreichen würde:O2
Arcturus

9
In Anbetracht der Geschichte vergangener Don'?t star
markierter

11
Dies wäre viel einfacher, wenn Sie auch den Benutzer als Teil der Eingabe erhalten würden.
Mama Fun Roll

3
Irgendwann hätte ich Regex beantwortet , 2 Bytes\^
PurkkaKoodari

14
Ich denke, Sie sollten dies bei den nächsten 1.000 Nachrichten noch einmal wiederholen und sehen, welche wirklich die Starre vorausgesagt hat
am

Antworten:


29

Netzhaut , 50 Bytes, 71,8%, 72,15%

^.*([[CE;ಠ-ﭏ]|tar|ol|l.x|eo|a.u|pin|nu|o.f|"$)

Versuchte einige Regex Golf auf @ MartinBüttner Vorschlag. Dies entspricht 704 markierten Nachrichten und nicht 739 nicht markierten Nachrichten.

Das ^.*( ... )ist , um sicherzustellen , dass es immer entweder 0 oder 1 Spiel, da Retina die Anzahl der Spiele standardmäßig ausgibt. Sie können das Programm anhand der Eingabedateien bewerten, indem Sie den m`mehrzeiligen Modus voranstellen und dann ausführen

Retina stars.retina < starred.txt

und ebenfalls für unstarred.txt.


Analyse / Erklärung

Ich habe die obigen Schnipsel (und viele mehr) mit einem Programm generiert und dann die gewünschten manuell ausgewählt. Hier ist eine Vorstellung davon, warum die obigen Snippets funktionieren:

  • C: Streichhölzer PPCG,@CᴏɴᴏʀO'Bʀɪᴇɴ
  • E: Streichhölzer @ETHproductions,@El'endiaStarman
  • ;: Da es sich bei den Testfällen um HTML handelt, stimmt dies mit &lt;und überein&gt;
  • ಠ-ﭏ: Entspricht einer Reihe von Unicode-Zeichen, insbesondere für ಠ_ಠund@Doorknob冰
  • tar: Entspricht Variationen von star, @El'endiaStarman(erneut) und wird auch gravatarin den von neuen Bots geposteten Oneboxen angezeigt
  • ol: rel="nofollow"Stimmt überein, was in vielen Links und oneboxes steht
  • l.x: Streichhölzer @AlexA.,@trichoplax
  • eo: Hauptsächlich Streichhölzer people, aber auch drei Fälle für@Geobits
  • a.u: Hauptsächlich Spiele graduation, status, featureundabuse
  • pin: Übereinstimmungen pingund Wörter, die auf enden ping. Entspricht auch ein paar Beiträgen in einer Diskussion zum Thema pineapple, als Beispiel für Überanpassung.
  • nu: Stimmt mit einer gemischten Wortmenge überein, die am häufigsten vorkommt number
  • o.f: Streichhölzer golf,conf(irm|use)
  • "$: Stimmt mit einem Anführungszeichen als letztes Zeichen überein, z @phase He means "Jenga."

Das [ist nichts Besonderes - ich hatte nur einen Charakter übrig, also dachte ich mir, ich könnte ihn für einen weiteren Fall verwenden.


(Ich habe den Testcode noch nicht veröffentlicht, da er ziemlich langsam zu laufen scheint und ich möchte herausfinden, warum. Es ist jetzt allerdings zu spät.)
Sp3000,

1
Das einmalige Ausführen von Retina für jeden Testfall dauert lange. Der Mehrzeilenmodus meldet die beanspruchte Punktzahl so ziemlich sofort.
Dennis

@Dennis Danke, ich habe völlig vergessen, dass ich das machen könnte.
Sp3000,

3
LOL, jetzt ist mein Name ein Sternmagnet?
ETHproductions

18

JavaScript ES6, 50 Byte, 71,10%

Identifiziert 670 mit und 752 ohne Stern.

x=>/ .[DERv]|tar|a.u|l.x|<i|eo|ol|[C;ಠ]/.test(x)

Jetzt über die 70% Schranke und alle außer Retina schlagen!

Gibt zurück, truewenn die Nachricht Folgendes enthält:

  • Ein Wort , von denen der zweite Buchstabe ist D, E, R, oder v;
  • tar(normalerweise star);
  • aund umit einem Buchstaben dazwischen;
  • lund xmit einem Buchstaben dazwischen (normalerweise alex);
  • kursiver Text;
  • eooder ol;
  • a C, ein Semikolon oder a .

Hier sind noch ein paar fruchtbare Übereinstimmungen, die es anscheinend nicht wert sind, andere loszuwerden:

  • nf
  • nu
  • yp
  • n.m

Dies ist der Retina-Antwort immer näher gekommen, aber ich habe die meisten Verbesserungen selbst gefunden.

Probieren Sie es in der Konsole einer dieser Seiten aus: Sternentexte , No-Star-Texte

var r=document.body.textContent.replace(/\n<br/g,"<br").split("\n").slice(0,-1);
var s=r.filter(function(x){return/ .[DERv]|tar|a.u|l.x|<i|eo|ol|[C;ಠ]/.test(x)}).length;
console.log("Total:",r.length,"Matched:",s,"Not matched:",r.length-s);

Hier ist eine alternative Version. /a/.testist technisch eine Funktion, erfüllt aber nicht unsere Kriterien :

/ .[ERv]|a.u|l.x|<i|eo|yp|ol|nf|tar|[C;ÿ-ff]/.test

Dies ergibt 71.90% (697 mit Sternchen, 741 ohne Sternchen).


Ich habe einige Analysen in den Listen durchgeführt, um herauszufinden, welche Regex-Gruppen den am meisten markierten und den am wenigsten markierten Beiträgen entsprechen. Die Analysen finden Sie in dieser Übersicht . Bisher habe ich geprüft aaund a.aÜbereinstimmungen. a.uliegt mit 28 auf Platz 50, ist aber das effizienteste Spiel seines Formats ...


Es gibt nur 1000 Nachrichten ...?
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Einige waren mehrzeilig, was im Snippet nicht berücksichtigt wurde. Dies wurde behoben.
ETHproductions

Warum benutzt niemand /regexp/.test()? Ich denke, dass es möglich ist, in ein paar Fällen mehr damit zu quetschen.
n̴̖̋h̷͉̃a̷̭̿h̷̭̿d̸̡̅ẗ̵̨́

8
Heute habe ich gelernt, dass ich Chatstars bekommen kann, indem ich meinen eigenen Namen sage.
Alex A.

@ n̴̖̋h̴̖̋ã̷͉h̷̭̿d̷̰̀ĥ̷̳ Danke, keine Ahnung, wie ich das fand
ETHproductions

15

Pyth, 50 Bytes, 67,9%

0000000: 21 40 6a 43 22 03 91 5d d3 c3 84 d5 5c df 46 69 b5 9d  !@jC"..]....\.Fi..
0000012: 42 9a 75 fa 74 71 d9 c1 79 1d e7 5d fc 25 24 63 f8 bd  B.u.tq..y..].%$c..
0000024: 1d 53 45 14 d7 d3 31 66 5f e8 22 32 43 7a              .SE...1f_."2Cz

Dadurch wird die Eingabe in einen von 322 Buckets gehasht und der Boolesche Wert in Abhängigkeit von diesem Bucket ausgewählt.

Wertung

$ xxd -c 18 -g 1 startest.pyth
0000000: 72 53 6d 21 40 6a 43 22 03 91 5d d3 c3 84 d5 5c df 46  rSm!@jC"..]....\.F
0000012: 69 b5 9d 42 9a 75 fa 74 71 d9 c1 79 1d e7 5d fc 25 24  i..B.u.tq..y..].%$
0000024: 63 f8 bd 1d 53 45 14 d7 d3 31 66 5f e8 22 32 43 64 2e  c...SE...1f_."2Cd.
0000036: 7a 38                                                  z8
$ echo $LANG
en_US
$ pyth/pyth.py startest.pyth < starred.txt
[[345, False], [655, True]]
$ pyth/pyth.py startest.pyth < unstarred.txt
[[703, False], [297, True]]

14

CJam, 45 Bytes, 65,55%

l_c"\"#&'(-.19<CEFHIJLMOPSTXY[_qಠ"e=\1b8672>|

Hiermit wird überprüft, ob sich das erste Zeichen in einer bestimmten Liste befindet oder die Summe aller Codepunkte größer als 8.672 ist.

Wertung

$ cat startest.cjam
1e3{l_c"\"#&'(-.19<CEFHIJLMOPSTXY[_qಠ"e=\1b8672>|}*
$ java -jar cjam-0.6.5.jar startest.cjam < starred.txt | fold -1 | sort | uniq -c
    308 0
    692 1
$ java -jar cjam-0.6.5.jar startest.cjam < unstarred.txt | fold -1 | sort | uniq -c
    619 0
    381 1

+1, um mir den foldBefehl und die eigentliche Antwort beizubringen.
Türklinke

6

Matlab / Oktave, 17 Bytes 60,15%

Klassifiziert 490 Nachrichten korrekt als gestarrt, 713 Nachrichten als nicht gestarrt

Aktuelle Version:

Ich überprüfe nur die Länge.

f=@(w)numel(w)>58

Alte Version:

Könnte in jede andere Sprache übersetzt werden. Es wird nur geprüft, ob die Nachricht die Worte Stern enthält oder nicht.score: 59/911/52.5%

f=@(w)nnz(strfind(lower(w),'star'))>0 %

Ergebnisse für Testfälle mit diesem Code:

slCharacterEncoding('UTF-8');

fid = fopen('codegolf_starred_messages_starred.txt');
line = fgetl(fid);
starred = 0;
while ischar(line)
    if f(line);
        starred = starred +1;
    end

    disp(line)
    line = fgetl(fid);
end
fclose(fid);


fid = fopen('codegolf_starred_messages_unstarred.txt');
line = fgetl(fid);
unstarred = 0;
while ischar(line)
    if ~f(line);
        unstarred = unstarred +1;
    end

    disp(line)
    line = fgetl(fid);
end
fclose(fid);

disp(['  correctly classified as *ed: ',num2str(starred)])
disp(['correctly classified as un*ed: ',num2str(unstarred)])
disp(['                  total score: ',num2str((starred+unstarred)/20),'\%'])

3

CJam, 32 Bytes, Gesamtnote von 0,5605 (56%).

Identifiziert korrekt 428 markierte und 693 nicht markierte Nachrichten. Gesamtpunktzahl ist (360+730)/2000=0.545.

l_el"sta"/,1>\,)4%!|

Ich erwarte nicht zu gewinnen und sehe, wie es funktioniert. Oben sehen Sie den Code für eine einzelne Nachricht, um diese geänderte Version mit mehreren Verwendungszwecken auszuführen, die die Anzahl der markierten Nachrichten zurückgibt:

1000{l_el"star"/,1>\,)6%!|}fA]:+

Testen Sie es einfach mit STDIN als Rohtext einer der beiden Dateien. Gibt true zurück, wenn die Nachricht "star" enthält oder if length + 1 mod 4 = 0.


2
Also ... wenn vier eine mehr als die Länge einer Nachricht teilen, dann hat es eine Chance, dass sie markiert wird?
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Ja, aber es sorgt für einen Highscore
GamrCorps

3

JavaScript ES6, 0,615 = 61,5%

342 korrekt als markiert identifiziert, 888 korrekt als nicht markiert identifiziert, (342+888)/2000 = 0.615

x=>-~x.search(/(bo|le)x|sta|ಠ|ツ/i)

Teste dies oder jenes so :

r=document.body.innerHTML.replace(/<\/*pre>/g,"").split`
`.filter(x=>-~x.search`(bo|le)x|sta|ಠ|ツ`).length

ICH KANN DICH NOCH ERHALTEN, MEINE HÜBSCHE!


1
Ich hab dich jetzt;)
ETHproductions

@ETHproductions GG. Ich werde nach weiteren gängigen Mustern suchen.
Conor O'Brien

3

Netzhaut, 46 Bytes, 68,55

^.*([zj_C;&¡-ff]|sta|san|soc|bo|eo|xk|l.x|<.>)

679 Stern: 692 Unstern

Auf Retina umgestellt, um ein paar Regexes zu bekommen ... Noch nicht fertig.


Oh ja, das hab ich vergessen. Ich werde es reparieren.
Mama Fun Roll

1

C # 6.0 (.NET Framework 4.6), 50 Bytes, 63,60%

bool s(string i)=>Regex.IsMatch(i,"ol|tar|l.x|ಠ");

Programm, das ich zu Testzwecken verwendet habe:

void Main()
{
    var starred = @"C:\starred.txt";
    var unstarred = @"C:\unstarred.txt";

    var linesStarred = File.ReadAllLines(starred);
    var linesUnstarred = File.ReadAllLines(unstarred);

    var cls = linesStarred.Count();
    var clsc = 0;

    foreach (var line in linesStarred)
    {
        if ( s(line) ) clsc++;
    }

    var clu = linesUnstarred.Count();
    var cluc = 0;

    foreach (var line in linesUnstarred)
    {
        if (!s(line)) cluc++;
    }

    $"Starred {clsc}/{cls} correct ({(clsc/cls*100):0.00}%)".Dump();
    $"Unstarred {cluc}/{clu} correct ({(cluc /clu*100):0.00}%)".Dump();
    $"{(((clsc+cluc)/(decimal)(cls+clu))*100):0.00}".Dump();
}

bool s(string i)=>Regex.IsMatch(i,"ol|tar|l.x|ಠ");
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.