Напишіть лічильник пінг-чатів


19

Ваше завдання - написати програму, в якій за переліком повідомлень у чаті порахуйте, скільки разів кожна людина отримує пінг, щоб я міг знати, наскільки популярні всі. Але, оскільки я маю це робити приховано, мені потрібно, щоб це було якомога менше, щоб я міг приховати код.

Технічні характеристики

  • Вхід подається у списку з 2-х кортежів, причому кожен елемент має форму ("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) або ping, що не задовольняє жодного користувача в кімнаті (наприклад @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)

Використовує об'єкт для створення унікального списку імен поряд із пінгами. Потім він переглядає повідомлення про відповідність умовам ping. Якщо ім'я, воно переглядає список імен, щоб визначити, чи є лише одна відповідність, а потім з кроком. Якщо відповідь, вона просто посилається на цей індекс в масиві повідомлень і тягне ім’я, яке потрібно наростити. Нарешті, він повертає об'єкт.


Звичайно використання предмета коротше. Якщо це не я, я не думаю, що вам потрібно повертати карту як масив
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.