Escreva um contador de ping de bate-papo

19

Sua tarefa é escrever um programa, que, com uma lista de mensagens de bate-papo, conte quantas vezes cada pessoa recebe um ping, para que eu saiba o quão popular é todo mundo. Mas, como tenho que fazê-lo clandestinamente, preciso que seja o menor possível para ocultar o código.

Especificações

  • A entrada vem em uma lista de 2 tuplas, com cada item no formato ("username", "message").
  • Um ping para outro usuário é definido como @seguido por três ou mais letras que se referem inequivocamente a esse usuário.
  • No entanto, você também deve considerar as respostas, que devem começar :messageidseguidas por um espaço.
  • Suponha que a primeira mensagem tenha id 0e prossiga sequencialmente.
  • Faça a saída de cada usuário e diga quantas vezes cada um recebeu um ping.
  • A saída pode estar em qualquer ordem / formato razoável.
  • Isso é , então o código mais curto em bytes vence!

Casos de teste

[["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
fonte
2
Eu gosto de como :0dobra como um emoticon surpreso.
Maçaneta
4
"Eu gosto de causar tristeza através de votos negativos." Você sabe que há apenas uma maneira adequada de responder a isso, certo? ;)
Geobits 29/02
9
Em que ponto estamos parando com as piadas "Alex está errado"?
Martin Ender
11
Uma resposta pode estar fora do alcance (por exemplo, a primeira mensagem iniciada com :3) ou um ping não satisfazendo nenhum usuário na sala (por exemplo @zzz)?
Sp3000 29/02
2
Um usuário pingado ainda não pode ter postado uma mensagem quando pingado? por exemplo, [["Doorknob","@Alex is wrong"],["Alex","I am only slightly wrong"]]entrada válida?
ETHproductions

Respostas:

2

JavaScript (ES6), 245 210 bytes

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)

Usa um objeto para criar uma lista exclusiva de nomes ao lado de pings. Em seguida, ele procura nas mensagens correspondências para qualquer condição de ping. Se um nome, ele pesquisa a lista de nomes para descobrir se há apenas uma correspondência e, em seguida, incrementa. Se uma resposta, simplesmente referencia esse índice na matriz de mensagens e puxa o nome para ser incrementado. Finalmente, ele retorna o objeto.

Mwr247
fonte
Certamente, usar um objeto é mais curto. Se não for, acho que você não precisa retornar o mapa como uma matriz.
Downgoat 29/02/16
@Downgoat Mas Mapé mais divertido, certo? Na, eu originalmente superestimei quanto extra seria necessário para fazer referência a um objeto, pensando que eu precisaria de uma matriz separada para nomes, mas você está certo que é muito mais curto dessa maneira.
#
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
fonte