채팅 핑 카운터 작성 시간을 핑을했는지 계산하여 모든 사람의

당신의 임무는 채팅 메시지 목록을 제공하는 프로그램을 작성하는 것입니다. 각 사람이 얼마나 많은 시간을 핑을했는지 계산하여 모든 사람의 인기를 알 수 있습니다. 그러나 비밀리에해야하므로 코드를 숨길 수 있도록 가능한 한 작아야합니다.

명세서

  • 입력은 2 개의 튜플 목록으로 제공되며 각 항목은 형식 ("username", "message")입니다.
  • 다른 사용자에 대한 핑은 그 사용자 @를 명확하게 참조하는 3 자 이상의 문자 로 정의됩니다 .
  • 그러나 :messageid공백 으로 시작해야하는 답장도 고려해야합니다 .
  • 첫 번째 메시지에 ID가 있다고 가정하고 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


답변

자바 스크립트 (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 조건과 일치하는지 확인합니다. 이름 인 경우 이름 목록을 살펴보고 일치하는 항목이 하나만 있는지 확인한 다음 증가시킵니다. 응답 인 경우 단순히 메시지 배열에서 해당 인덱스를 참조하고 증가시킬 이름을 가져옵니다. 마지막으로 객체를 반환합니다.


답변

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";