Viết bộ đếm Ping trò chuyện


19

Nhiệm vụ của bạn là viết một chương trình, đưa ra một danh sách các tin nhắn trò chuyện, đếm số lần mỗi người được ping, để tôi có thể biết mức độ phổ biến của mọi người. Nhưng, vì tôi phải làm điều đó một cách lén lút, tôi cần nó phải nhỏ nhất có thể để tôi có thể ẩn mã.

Thông số kỹ thuật

  • Đầu vào có một danh sách gồm 2 bộ, với mỗi mục có dạng ("username", "message").
  • Một ping đến một người dùng khác được định nghĩa là @theo sau bởi 3 hoặc nhiều chữ cái mà rõ ràng đề cập đến người dùng đó.
  • Tuy nhiên, bạn cũng phải xem xét trả lời, phải bắt đầu :messageidbằng một khoảng trắng.
  • Giả sử tin nhắn đầu tiên có id 0và tiến hành tuần tự.
  • Xuất ra mỗi người dùng và cho biết mỗi người đã ping bao nhiêu lần.
  • Đầu ra có thể theo bất kỳ thứ tự / định dạng hợp lý.
  • Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng!

Các trường hợp thử nghiệm

[["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
Tôi thích cách nhân :0đôi như một biểu tượng cảm xúc ngạc nhiên.
Doorknob

4
"Tôi thích gây ra nỗi buồn thông qua downvote." Bạn biết chỉ có một cách thích hợp để tôi có thể đáp ứng điều đó, phải không? ;)
Geobits

9
Tại điểm nào chúng ta dừng lại với những trò đùa "Alex là sai"?
Martin Ender

1
Có thể một câu trả lời nằm ngoài phạm vi (ví dụ: tin nhắn đầu tiên bắt đầu bằng :3) hoặc ping không thỏa mãn bất kỳ người dùng nào trong phòng (ví dụ @zzz)?
Sp3000

2
Người dùng ping chưa thể đăng thông báo khi anh ta ping? ví dụ như [["Doorknob","@Alex is wrong"],["Alex","I am only slightly wrong"]]đầu vào hợp lệ?
Sản xuất ETH

Câu trả lời:


2

JavaScript (ES6), 245 210 byte

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)

Sử dụng một đối tượng để tạo một danh sách tên duy nhất cùng với ping. Sau đó, nó xem qua các thông báo cho phù hợp với điều kiện ping. Nếu một tên, nó sẽ xem qua danh sách các tên để tìm nếu chỉ có một kết quả khớp, và sau đó tăng dần. Nếu một câu trả lời, nó chỉ đơn giản tham chiếu chỉ mục đó trong mảng thông báo và kéo tên được tăng lên. Cuối cùng, nó trả về đối tượng.


Chắc chắn sử dụng một đối tượng là ngắn hơn. Nếu không, tôi không nghĩ rằng bạn cần trả lại Bản đồ dưới dạng một mảng
Downgoat

@Downgoat Nhưng Mapvui hơn phải không? Na, ban đầu tôi đã đánh giá quá cao việc cần thêm bao nhiêu để tham chiếu một đối tượng, nghĩ rằng tôi sẽ phải có một mảng riêng cho tên, nhưng bạn nói đúng là nó ngắn hơn nhiều theo cách này.
Mwr247

0

PHP, 227 byte

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";
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.