Écrire un compteur de ping de chat

19

Votre tâche consiste à écrire un programme qui, compte tenu d'une liste de messages de discussion, compte le nombre de fois où chaque personne reçoit un ping, afin que je sache à quel point tout le monde est populaire. Mais, comme je dois le faire subrepticement, j'ai besoin qu'il soit aussi petit que possible pour pouvoir cacher le code.

Spécifications

  • L'entrée est fournie dans une liste de 2 tuples, chaque élément étant du formulaire ("username", "message").
  • Un ping vers un autre utilisateur est défini comme un @suivi de 3 lettres ou plus qui se réfère sans ambiguïté à cet utilisateur.
  • Cependant, vous devez également considérer les réponses, qui doivent commencer par :messageidsuivi d'un espace.
  • Supposons que le premier message ait un identifiant 0et continuez séquentiellement.
  • Sortez chaque utilisateur et dites combien de fois chacun a reçu un ping.
  • La sortie peut être dans n'importe quel ordre / format raisonnable.
  • C'est le , donc le code le plus court en octets gagne!

Cas de test

[["AlexA.", "I am wrong"], ["Quartatoes", "@Alex you are very wrong"], ["AlexA.", ":1 I am only slightly wrong"]]
AlexA.: 1
Quartatoes: 1

[["Doorknob", "I have never eaten an avocad."], ["AquaTart", ":0 I will ship you an avocad"], ["AlexA.", ":0 this is shocking"]]
Doorknob: 2
AquaTart: 0
AlexA.: 0

[["Geobits", "I like causing sadness through downvotes."], ["Flawr", "I want to put random message ids in my chat messages :0 askjdaskdj"]]
Geobits: 0
Flawr: 0

[["Downgoat", "goatigfs.com/goatgif"], ["Downotherthing", "@Downgoat cool gifs"], ["Dennis", "@Down cool gifs this is an ambiguous ping"]]
Downgoat: 1
Downotherthing: 0
Dennis: 0
Maltysen
la source
2
J'aime la :0double émoticône surprise.
Poignée de porte
4
"J'aime causer de la tristesse à travers les votes négatifs." Vous savez qu'il n'y a qu'une seule façon appropriée de répondre à cela, non? ;)
Geobits
9
À quel moment arrêtons-nous avec les blagues "Alex a tort"?
Martin Ender
1
Une réponse peut-elle être hors de portée (par exemple, le premier message commençant par :3) ou un ping ne satisfaisant aucun utilisateur dans la salle (par exemple @zzz)?
Sp3000
2
Un utilisateur cinglé n'a-t-il pas encore posté de message lorsqu'il a cinglé? Par exemple, [["Doorknob","@Alex is wrong"],["Alex","I am only slightly wrong"]]une entrée valide?
ETHproductions

Réponses:

2

JavaScript (ES6), 245 210 octets

a=>(p={},a.map(b=>p[b[0]]=0),(a.map(b=>b[1].match(/@[a-z]{3,}|^:\d+/gi)||[]).map(c=>c.map(d=>(z=(d[0]=='@'?(y=Object.keys(p).filter(e=>e.startsWith(d.slice(1)))).length<2?y:0:a[d.slice(1)[0]]))&&p[z[0]]++))),p)

Utilise un objet pour créer une liste unique de noms aux côtés des pings. Ensuite, il recherche dans les messages les correspondances à l'une ou l'autre des conditions de ping. S'il s'agit d'un nom, il parcourt la liste des noms pour trouver s'il n'y a qu'une seule correspondance, puis s'incrémente. S'il s'agit d'une réponse, il fait simplement référence à cet index dans le tableau de messages et extrait le nom à incrémenter. Enfin, il renvoie l'objet.

Mwr247
la source
Sûrement, utiliser un objet est plus court. Si ce n'est pas le cas, je ne pense pas que vous ayez besoin de renvoyer la carte sous forme de tableau
Downgoat
@Downgoat Mais Mapest-ce plus amusant, non? Na, j'ai à l'origine surestimé combien il faudrait pour référencer un objet, pensant que je devrais avoir un tableau séparé pour les noms, mais vous avez raison, il est beaucoup plus court de cette façon.
Mwr247
0

PHP, 227 octets

foreach($_GET[a]as $c){$r[]=&$n[$c[0]]??$n[$c[0]]=0;preg_match("#^(:(\d+)|@(\w+))#",$c[1],$m);$m[2]==""?!$m[3]?:count($a=preg_grep("#^{$m[3]}#",array_keys($n)))>1?:$n[end($a)]++:$r[$m[2]]++;}foreach(($n)as$k=>$v)echo"$k: $v\n";
Jörg Hülsermann
la source