Schreiben Sie einen Chat-Ping-Zähler

19

Ihre Aufgabe ist es, ein Programm zu schreiben, das anhand einer Liste von Chat-Nachrichten zählt, wie oft jede Person einen Ping erhält, damit ich weiß, wie beliebt jeder ist. Aber da ich es heimlich tun muss, muss es so klein wie möglich sein, damit ich den Code verstecken kann.

Technische Daten

  • Die Eingabe erfolgt in einer Liste mit 2 Tupeln, wobei jedes Element der Form entspricht ("username", "message").
  • Ein Ping an einen anderen Benutzer wird als @gefolgt von 3 oder mehr Buchstaben definiert, die eindeutig auf diesen Benutzer verweisen.
  • Sie müssen jedoch auch Antworten berücksichtigen, die mit :messageideinem Leerzeichen beginnen müssen.
  • Angenommen, die erste Nachricht hat die ID 0und gehe nacheinander vor.
  • Geben Sie jeden Benutzer aus und sagen Sie, wie oft jeder Ping erhalten hat.
  • Die Ausgabe kann in beliebiger Reihenfolge und in einem angemessenen Format erfolgen.
  • Das ist , also gewinnt der kürzeste Code in Bytes !

Testfälle

[["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
quelle
2
Ich mag es, wie :0sich das als überraschtes Emoticon verdoppelt.
Türklinke
4
"Ich mag es, durch Abstimmungen Traurigkeit zu verursachen." Sie wissen, dass es nur einen richtigen Weg gibt, wie ich darauf reagieren kann, richtig? ;)
Geobits
9
Ab wann hören wir mit den "Alex is wrong" -Witzen auf?
Martin Ender
1
Kann eine Antwort außerhalb des zulässigen Bereichs liegen (z. B. erste Nachricht beginnend mit :3) oder ein Ping, der keinen Benutzer im Raum zufriedenstellt (z. B. @zzz)?
Sp3000
2
Kann ein gepingter Benutzer noch keine Nachricht gepostet haben, wenn er gepingt hat? zB ist [["Doorknob","@Alex is wrong"],["Alex","I am only slightly wrong"]]gültige Eingabe?
ETHproductions

Antworten:

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)

Verwendet ein Objekt, um eine eindeutige Liste von Namen neben Pings zu erstellen. Anschließend werden die Nachrichten nach Übereinstimmungen mit einer der beiden Ping-Bedingungen durchsucht. Wenn es sich um einen Namen handelt, durchsucht es die Liste der Namen, um festzustellen, ob es nur eine Übereinstimmung gibt, und erhöht sie dann. Bei einer Antwort wird lediglich auf diesen Index im Nachrichtenarray verwiesen und der zu inkrementierende Name abgerufen. Schließlich wird das Objekt zurückgegeben.

Mwr247
quelle
Sicherlich ist die Verwendung eines Objekts kürzer. Wenn nicht, müssen Sie die Karte
meines Erachtens
@ Downgoat Aber Mapmacht mehr Spaß, oder? Na, ich habe ursprünglich überschätzt, wie viel zusätzlicher Aufwand erforderlich ist, um auf ein Objekt zu verweisen. Ich dachte, ich müsste ein separates Array für Namen erstellen, aber Sie haben Recht, dass es auf diese Weise viel kürzer ist.
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
quelle