Scrivi un contatore di ping di chat


19

Il tuo compito è quello di scrivere un programma che fornisca un elenco di messaggi di chat contando quante volte ogni persona riceve un ping, così posso sapere quanto sono popolari tutti. Ma, dal momento che devo farlo di nascosto, ho bisogno che sia il più piccolo possibile in modo da poter nascondere il codice.

Specifiche

  • L'input viene fornito in un elenco di 2 tuple, con ogni elemento nel modulo ("username", "message").
  • Un ping per un altro utente è definito come @seguito da 3 o più lettere che si riferiscono in modo inequivocabile a quell'utente.
  • Tuttavia, devi anche considerare le risposte, che devono iniziare :messageidseguite da uno spazio.
  • Supponiamo che il primo messaggio abbia id 0e proceda in sequenza.
  • Invia ogni utente e indica quante volte è stato eseguito il ping di ognuno.
  • L'output può essere in qualsiasi ordine / formato ragionevole.
  • Questo è , quindi vince il codice più breve in byte !

Casi 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

2
Mi piace il :0doppio di un'emoticon sorpresa.
Maniglia della porta

4
"Mi piace causare tristezza attraverso i voti negativi." Sai che c'è solo un modo corretto in cui posso rispondere, giusto? ;)
Geobits il

9
A che punto ci fermiamo con le battute "Alex is wrong"?
Martin Ender,

1
Una risposta può essere fuori portata (ad esempio il primo messaggio che inizia con :3) o un ping che non soddisfa alcun utente nella stanza (ad esempio @zzz)?
Sp3000,

2
Un utente con ping può non aver ancora pubblicato un messaggio quando ha eseguito il ping? es. è un [["Doorknob","@Alex is wrong"],["Alex","I am only slightly wrong"]]input valido?
ETHproductions

Risposte:


2

JavaScript (ES6), 245 210 byte

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)

Utilizza un oggetto per creare un elenco univoco di nomi accanto a ping. Quindi cerca tra i messaggi le corrispondenze a entrambe le condizioni di ping. Se un nome, controlla l'elenco dei nomi per scoprire se esiste una sola corrispondenza, quindi aumenta. Se una risposta, fa semplicemente riferimento a quell'indice nell'array dei messaggi e ne estrae il nome da incrementare. Infine, restituisce l'oggetto.


Sicuramente l'utilizzo di un oggetto è più breve. In caso contrario, non credo che sia necessario restituire la mappa come matrice
Downgoat,

@Downgoat Ma Mapè più divertente vero? Na, inizialmente avevo sopravvalutato la quantità di extra necessaria per fare riferimento a un oggetto, pensando che avrei dovuto disporre di un array separato per i nomi, ma hai ragione che è molto più breve in questo modo.
Mwr247

0

PHP, 227 byte

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";
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.