เขียนตัวนับ Chat Chat


19

งานของคุณคือการเขียนโปรแกรมที่ให้รายชื่อข้อความแชทนับจำนวนครั้งที่แต่ละคนได้รับการ ping ดังนั้นฉันสามารถรู้ได้ว่าทุกคนโด่งดังแค่ไหน แต่เนื่องจากฉันต้องทำมันอย่างลับๆล่อๆฉันต้องการให้มันเล็กที่สุดเท่าที่จะเป็นไปได้เพื่อที่ฉันจะสามารถซ่อนรหัสได้

รายละเอียด

  • การป้อนข้อมูลที่มาในรายการของ 2 tuples ("username", "message")กับแต่ละรายการเป็นของแบบฟอร์ม
  • การ ping ไปยังผู้ใช้รายอื่นถูกกำหนดให้เป็น@ตัวอักษรรองลงมา 3 ตัวหรือมากกว่านั้นซึ่งอ้างถึงผู้ใช้นั้นอย่างไม่น่าสงสัย
  • อย่างไรก็ตามคุณต้องพิจารณาการตอบกลับด้วยซึ่งจะต้องเริ่ม:messageidจากตามด้วยช่องว่าง
  • สมมติว่าข้อความแรกมีรหัส0และดำเนินการตามลำดับ
  • เอาท์พุทผู้ใช้แต่ละคนและบอกว่ากี่ครั้งที่แต่ละคนได้รับการ ping
  • เอาต์พุตสามารถอยู่ในรูปแบบคำสั่ง / สมเหตุสมผล
  • นี่คือดังนั้นรหัสที่สั้นที่สุดในหน่วยไบต์ชนะ!

กรณีทดสอบ

[["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เป็นสองเท่าของอิโมติคอน
Doorknob

4
"ฉันชอบทำให้เกิดความเศร้าผ่านทางโหวต" คุณรู้ว่ามีวิธีการที่เหมาะสมเพียงวิธีเดียวที่ฉันสามารถตอบกลับได้ใช่มั้ย ;)
Geobits

9
เราหยุดพูดถึงเรื่องตลกของอเล็กซ์ว่า "ผิดหรือยัง?"
Martin Ender

1
การตอบกลับอยู่นอกช่วง (เช่นข้อความแรกที่ขึ้นต้นด้วย:3) หรือ ping ไม่พอใจผู้ใช้ในห้อง (เช่น@zzz)?
Sp3000

2
ผู้ใช้ที่ส่ง Ping ไปยังยังไม่ได้โพสต์ข้อความเมื่อเขาส่ง Ping ไปได้หรือไม่? เช่นการ[["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";
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.