Prédire si un message sera marqué ou non dans 50 octets

41

Étant donné l'entrée d'une chaîne composée de tout message provenant de la salle de discussion de notre site, tirée de la liste décrite ci-dessous, renvoie une valeur de vérité ou une valeur de fausseté tentant de prédire si ce message a été marqué ou non sur 50 octets ou moins.

Vous pouvez utiliser n'importe quelle valeur de vérité ou de fausseté , mais elles doivent être identiques (autrement dit, il ne devrait y avoir que deux sorties possibles, une vérité et une fausseté). L'entrée sera donnée sous forme de code HTML brut avec les nouvelles lignes supprimées et peut contenir des caractères Unicode non-ASCII. Si vous avez besoin d'informations autres que UTF-8, veuillez l'indiquer dans votre réponse.

La soumission gagnante à ce défi sera celle qui prédit correctement le pourcentage le plus élevé de messages de discussion en dehors de la liste liée ci-dessous. Si deux soumissions données ont le même taux de réussite, la soumission la plus courte l'emportera.

Veuillez fournir des instructions pour exécuter votre code sur l’ensemble des messages et calculer le pourcentage correct. Idéalement, il devrait s'agir d'un peu de code passe-partout (non compté dans vos 50 octets) qui parcourt les cas de test positifs et en indique le nombre de fois que votre code est correct, puis fait de même pour les cas de test négatifs. (Le score global peut ensuite être calculé manuellement via (correctPositive + correctNegative) / totalMessages.)

Pour que votre code soit raisonnablement vérifiable, il doit être terminé en 5 minutes ou moins pour la liste complète des messages de discussion sur du matériel moderne raisonnable.

La liste complète des messages de discussion peut être trouvée ici , et elle comprend les 1000 derniers messages marqués comme cas de test de véracité et les 1000 derniers messages non marqués comme cas de test faussement. Notez qu'il y a deux fichiers dans l'essentiel; faites défiler à mi-chemin pour les messages sans étoile.

Poignée de porte
la source
4
Connaissant les comportements du chat, je pense que le Pyth suivant suffirait:O2
Arcturus
9
Compte tenu de l'historique des messages passés Don'?t star
marqués
11
Ce serait beaucoup plus facile si vous aviez également donné l'utilisateur dans le cadre de la saisie.
Mama Fun Roll
3
À un moment donné, j'aurais répondu à Regex, 2 octets \^
PurkkaKoodari
14
Je pense que vous devez exécuter ce nouveau sur les 1000 prochains messages, et voir que l' on vraiment starredness prédit
abligh

Réponses:

29

Rétine , 50 octets, 71,8% 72,15%

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

J'ai essayé de jouer au regex sur la suggestion de @ MartinBüttner. Cela correspond à 704 messages suivis et à 739 messages non suivis.

Il ^.*( ... )faut s’assurer qu’il y a toujours 0 ou 1 correspondance, car Retina affiche le nombre de correspondances par défaut. Vous pouvez marquer le programme sur les fichiers d’entrée en ajoutant le nombre m`de caractères en mode multiligne, puis en exécutant

Retina stars.retina < starred.txt

et pareillement pour unstarred.txt.


Analyse / explication

J'ai généré les extraits ci-dessus (et beaucoup d'autres) à l'aide d'un programme, puis j'ai sélectionné ceux que je voulais manuellement. Voici un aperçu de la raison pour laquelle les extraits ci-dessus fonctionnent:

  • C: Allumettes PPCG,@CᴏɴᴏʀO'Bʀɪᴇɴ
  • E: Allumettes @ETHproductions,@El'endiaStarman
  • ;: Comme les tests sont au format HTML, cela correspond &lt;et&gt;
  • ಠ-ﭏ: Correspond à une plage de caractères Unicode, en particulier pour ಠ_ಠet@Doorknob冰
  • tar: Correspond aux variations de star, @El'endiaStarman(encore) et gravatarqui apparaît également dans les onebox postés par les nouveaux messages bots
  • ol: Correspond rel="nofollow"à beaucoup de liens et de onebox
  • l.x: Allumettes @AlexA.,@trichoplax
  • eo: Principalement des matches people, mais aussi trois cas pour@Geobits
  • a.u: Correspond principalement graduation, status, featureetabuse
  • pin: Correspondances pinget mots se terminant par ping. Correspond également à quelques messages dans une discussion sur pineapple, à titre d'exemple de surajustement.
  • nu: Correspond à un mélange de mots, le plus commun étant number
  • o.f: Allumettes golf,conf(irm|use)
  • "$: Correspond à une citation double comme dernier caractère, par exemple @phase He means "Jenga."

Il [n'y a rien de spécial - il me reste un personnage, alors je me suis dit que je pourrais l'utiliser pour faire correspondre un cas de plus.

Sp3000
la source
(Je n'ai pas encore posté le code de test car il semble fonctionner assez lentement et j'aimerais comprendre pourquoi. Il est trop tard cependant.)
Sp3000
1
L'exécution de Retina une fois pour chaque cas de test prendra beaucoup de temps. Le mode multiligne rapporte le score revendiqué à peu près instantanément.
Dennis
@ Dennis Merci, j'ai complètement oublié que je pouvais le faire.
Sp3000
3
LOL, maintenant mon nom est un aimant étoile?
ETHproductions
18

JavaScript ES6, 50 octets, 71,10%

Identifie correctement 670 vedettes et 752 non-vedettes.

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

Maintenant, à travers la barrière des 70%, et battre tout le monde sauf Retina!

Renvoie truesi le message contient l'une de ces choses:

  • Un mot dont la deuxième lettre est D, E, Rou v;
  • tar(généralement star);
  • aet uavec un caractère entre les deux;
  • let xavec un caractère entre (généralement alex);
  • texte en italique;
  • eoou ol;
  • un C, un point-virgule ou un .

Voici quelques autres matchs fructueux qui ne semblent pas valoir la peine de se débarrasser des autres:

  • nf
  • nu
  • yp
  • n.m

Cela s'est rapproché de plus en plus de la réponse de Retina, mais j'ai trouvé la plupart des améliorations moi-même.

Testez - le dans la console d'une de ces pages: textes étoiles , textes sans étoile

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

Voici une version alternative. /a/.testest techniquement une fonction, mais ne répond pas à nos critères :

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

Cela a donné 71,90% (697 étoiles, 741 étoiles).


J'ai effectué des analyses sur les listes pour voir quels groupes de regex correspondent aux messages les plus suivis et les moins non marqués. Les analyses peuvent être trouvées dans ce Gist . Jusqu'à présent, j'ai vérifié aaet a.acorrespond. a.uest en baisse autour de 50 avec un score de 28, mais c'est le match le plus efficace de son format ...

ETHproductions
la source
Il n'y a que 1000 messages ...?
Conor O'Brien
2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Certains étaient multilignes, ce qui n'était pas comptabilisé dans l'extrait de code. Cela a été corrigé.
ETHproductions
Pourquoi personne n'utilise /regexp/.test()? Je pense qu'il est possible de faire pression dans quelques cas de plus avec cela.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
8
Aujourd'hui, j'ai appris que je pouvais obtenir des stars du tchat en disant simplement mon propre nom.
Alex A.
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Merci, je ne sais pas comment je n'y ai pas pensé
ETHproductions
15

Pyth, 50 octets, 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

Cela hache l'entrée dans l'un des 322 compartiments et choisit la valeur booléenne en fonction de ce compartiment.

Notation

$ 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]]
Dennis
la source
14

CJam, 45 octets, 65,55%

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

Ceci vérifie si le premier caractère est dans une liste spécifique ou si la somme de tous les points de code est supérieure à 8 672.

Notation

$ 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
Dennis
la source
+1 pour m'avoir appris la foldcommande, avec la réponse réelle.
Poignée de porte
6

Matlab / Octave, 17 octets 60,15%

Classifie correctement 490 messages comme étant en attente, 713 messages comme étant non stared

Version actuelle:

Je vérifie juste la longueur.

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

Ancienne version:

Pourrait être traduit dans une autre langue. Il vérifie simplement si le message contient les mots étoile ou non.score: 59/911/52.5%

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

Résultats pour les cas de test utilisant ce 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),'\%'])
flawr
la source
3

CJam, 32 octets, score global de 0,5605 (56%).

Identifie correctement 428 messages suivis et 693 messages non suivis. Le score total est (360+730)/2000=0.545.

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

Ne m'attendant pas à gagner, je vais voir comment ça se passe. Ci-dessus, le code d'un seul message, à exécuter avec plusieurs, utilisez cette version modifiée qui renvoie le nombre de messages suivis:

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

Testez-le avec STDIN comme texte brut de l'un ou l'autre fichier. Retourne vrai si le message contient "étoile" ou si length + 1 mod 4 = 0.

GamrCorps
la source
2
Donc ... si quatre divisent un de plus que la longueur d'un message, alors il a une chance d'être interprété?
Conor O'Brien
2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Oui, mais cela permet d'obtenir un score élevé
GamrCorps 17/01/2016
3

JavaScript ES6, 0,615 = 61,5%

342 correctement identifiés comme suivis, 888 correctement identifiés comme non suivis, (342+888)/2000 = 0.615

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

Testez comme ceci sur ceci ou sur ceci :

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

Je pourrais encore vous, mon joli!

Conor O'Brien
la source
1
Je vous ai maintenant;)
ETHproductions
@ETHproductions GG. Je vais chercher d'autres modèles plus communs.
Conor O'Brien
3

Retina, 46 octets, 68,55

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

679 étoiles: 692 unstar

Basculé vers Retina pour obtenir plus de regex dans ... Pas encore fait.

Maman Fun Roll
la source
Oh yeah, j'ai oublié a propos de ça. Je le réparerai.
Mama Fun Roll
1

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

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

Programme utilisé à des fins de test:

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|ಠ");
Stephan Schinkel
la source