Escribir un contador de ping de chat

19

Su tarea es escribir un programa que, dado una lista de mensajes de chat, cuente cuántas veces se pincha a cada persona, para que pueda saber cuán populares son todos. Pero, dado que tengo que hacerlo subrepticiamente, necesito que sea lo más pequeño posible para poder ocultar el código.

Especificaciones

  • La entrada viene en una lista de 2 tuplas, con cada elemento de la forma ("username", "message").
  • Un ping a otro usuario se define como @seguido de 3 o más letras que se refieren inequívocamente a ese usuario.
  • Sin embargo, también debe considerar las respuestas, que deben comenzar con :messageidun espacio seguido.
  • Suponga que el primer mensaje tiene identificación 0y proceda secuencialmente.
  • Envíe a cada usuario y diga cuántas veces se pinchó a cada uno.
  • La salida puede estar en cualquier orden / formato razonable.
  • Este es el , por lo que gana el código más corto en bytes

Casos de prueba

[["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
fuente
2
Me gusta cómo :0funciona como un emoticón sorprendido.
Pomo de la puerta
44
"Me gusta causar tristeza a través de votos negativos". Sabes que solo hay una manera adecuada de responder a eso, ¿verdad? ;)
Geobits
99
¿En qué punto nos detenemos con los chistes de "Alex está equivocado"?
Martin Ender
1
¿Puede una respuesta estar fuera de alcance (por ejemplo, primer mensaje que comienza con :3) o un ping que no satisface a ningún usuario en la sala (por ejemplo @zzz)?
Sp3000
2
¿Puede un usuario marcado aún no haber publicado un mensaje cuando está marcado? por ejemplo, ¿es [["Doorknob","@Alex is wrong"],["Alex","I am only slightly wrong"]]una entrada válida?
ETHproductions

Respuestas:

2

JavaScript (ES6), 245 210 bytes

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)

Utiliza un objeto para crear una lista única de nombres junto a pings. Luego, busca en los mensajes las coincidencias con cualquiera de las condiciones de ping. Si es un nombre, mira a través de la lista de nombres para encontrar si solo hay una coincidencia, y luego aumenta. Si es una respuesta, simplemente hace referencia a ese índice en la matriz de mensajes y extrae el nombre que se incrementará. Finalmente, devuelve el objeto.

Mwr247
fuente
Seguramente usar un objeto es más corto. Si no es así, no creo que deba devolver el mapa como una matriz
Downgoat
@Downgoat Pero Mapes más divertido ¿verdad? Na, originalmente sobreestimé la cantidad adicional que se necesitaría para hacer referencia a un objeto, pensando que tendría una matriz separada para los nombres, pero tienes razón en que es mucho más corto de esta manera.
Mwr247
0

PHP, 227 bytes

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
fuente