Написать чат пинг счетчик


19

Ваша задача - написать программу, в которой есть список сообщений чата, подсчитать, сколько раз каждый пользователь получает пинг, чтобы я мог знать, насколько популярны все. Но, поскольку я должен сделать это тайно, мне нужно, чтобы он был как можно меньше, чтобы я мог скрыть код.

Спекуляции

  • Входные данные поступают в виде списка из двух кортежей, причем каждый элемент имеет форму ("username", "message").
  • Пинг другому пользователю определяется как @сопровождаемый 3 или более буквами, которые однозначно относятся к этому пользователю.
  • Тем не менее, вы также должны рассмотреть ответы, которые должны начинаться с :messageidпробела.
  • Предположим, что первое сообщение имеет идентификатор 0и последовательно.
  • Выведите каждого пользователя и скажите, сколько раз каждый получил пинг.
  • Вывод может быть в любом порядке / разумном формате.
  • Это , поэтому выигрывает самый короткий код в байтах !

Тестовые случаи

[["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
Мне нравится, как :0удваивается, как удивленный смайлик.
Дверная ручка

4
«Мне нравится вызывать грусть из-за отрицательных голосов». Вы знаете, что есть только один правильный способ, которым я могу ответить на это, верно? ;)
Геобиц

9
В какой момент мы останавливаемся с шутками «Алекс не прав»?
Мартин Эндер

1
Может ли ответ быть вне диапазона (например, первое сообщение начинается с :3) или пинг не удовлетворяет любого пользователя в комнате (например @zzz)?
Sp3000

2
Может ли проверенный пользователь еще не опубликовал сообщение, когда он проверен? Например, [["Doorknob","@Alex is wrong"],["Alex","I am only slightly wrong"]]допустимый ввод?
ETHproductions

Ответы:


2

JavaScript (ES6), 245 210 байт

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)

Использует объект для создания уникального списка имен наряду с пингами. Затем он просматривает сообщения на совпадения с любым условием проверки связи. Если имя, оно просматривает список имен, чтобы найти единственное совпадение, а затем увеличивает его. Если ответ, он просто ссылается на этот индекс в массиве сообщений и извлекает имя для увеличения. Наконец, он возвращает объект.


Конечно, использование объекта короче. Если это не так, я не думаю, что вам нужно возвращать карту в виде массива
Downgoat

@ Downgoat Но разве Mapвеселее, верно? Нет, я изначально переоценил, сколько еще потребуется, чтобы ссылаться на объект, думая, что мне понадобится отдельный массив для имен, но вы правы, так как он намного короче.
Mwr247

0

PHP, 227 байт

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";
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.