Napisz czat Ping Counter

19

Twoim zadaniem jest napisanie programu, który na podstawie listy wiadomości czatu policzy, ile razy każda osoba jest pingowana, dzięki czemu będę wiedział, jak popularni są wszyscy. Ale ponieważ muszę to robić w ukryciu, muszę być tak mały, jak to możliwe, aby ukryć kod.

Okular

  • Dane wejściowe znajdują się na liście 2-krotek, przy czym każdy element ma postać ("username", "message").
  • Ping do innego użytkownika jest definiowany jako @następujący po nim 3 lub więcej liter, które jednoznacznie odnoszą się do tego użytkownika.
  • Jednak należy również wziąć pod uwagę odpowiedzi, które muszą zaczynać się :messageidod spacji.
  • Załóżmy, że pierwsza wiadomość ma identyfikator 0i kontynuuj sekwencję.
  • Przekaż każdemu użytkownikowi dane i powiedz, ile razy każdy z nich został pingowany.
  • Dane wyjściowe mogą być w dowolnej kolejności / rozsądnym formacie.
  • To jest , więc wygrywa najkrótszy kod w bajtach !

Przypadki testowe

[["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
źródło
2
Lubię, jak :0podwaja się jako zdziwiony emotikon.
Klamka
4
„Lubię wywoływać smutek poprzez przegłosowania”. Wiesz, że jest tylko jeden właściwy sposób na to, prawda? ;)
Geobits
9
W którym momencie przestajemy żartować „Alex się myli”?
Martin Ender
1
Czy odpowiedź może być poza zakresem (np. Pierwsza wiadomość zaczynająca się od :3) lub ping niespełniający wymagań użytkownika w pokoju (np. @zzz)?
Sp3000,
2
Czy pingowany użytkownik jeszcze nie opublikował wiadomości, kiedy jest pingowany? np. czy [["Doorknob","@Alex is wrong"],["Alex","I am only slightly wrong"]]prawidłowe dane wejściowe?
ETHprodukcje

Odpowiedzi:

2

JavaScript (ES6), 245 210 bajtów

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)

Używa obiektu do utworzenia unikalnej listy nazw obok pingów. Następnie przegląda wiadomości w poszukiwaniu dopasowań do jednego z warunków ping. Jeśli nazwa, przegląda listę nazw, aby sprawdzić, czy istnieje tylko jedno dopasowanie, a następnie zwiększa. Jeśli odpowiedź, po prostu odwołuje się do tego indeksu w tablicy komunikatów i pobiera nazwę, która ma zostać zwiększona. Na koniec zwraca obiekt.

Mwr247
źródło
Z pewnością użycie obiektu jest krótsze. Jeśli tak nie jest, nie sądzę, że musisz zwrócić Mapę jako tablicę
Downgoat
@Downgoat Ale Mapjest więcej zabawy, prawda? Nie, pierwotnie przeceniałem, ile jeszcze zajmie odniesienie do obiektu, myśląc, że będę musiał osobną tablicę dla nazw, ale masz rację, że w ten sposób jest znacznie krótszy.
Mwr247
0

PHP, 227 bajtów

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
źródło