Tulis Penghitung Ping Obrolan

19

Tugas Anda adalah menulis sebuah program, yang diberi daftar pesan obrolan, menghitung berapa kali setiap orang di-ping, jadi saya bisa tahu seberapa populer semua orang. Tapi, karena saya harus melakukannya secara sembunyi-sembunyi, saya perlu sekecil mungkin agar saya bisa menyembunyikan kode.

Spesifikasi

  • Masukan datang dalam daftar 2-tupel, dengan masing-masing item berbentuk ("username", "message").
  • Ping ke pengguna lain didefinisikan sebagai @diikuti oleh 3 atau lebih huruf yang jelas merujuk ke pengguna itu.
  • Namun, Anda juga harus mempertimbangkan balasan, yang harus dimulai dengan :messageiddiikuti oleh spasi.
  • Anggap pesan pertama memiliki id 0dan lanjutkan secara berurutan.
  • Keluarkan setiap pengguna dan katakan berapa kali setiap ping.
  • Outputnya bisa dalam format urutan apa pun / wajar.
  • Ini adalah , jadi kode terpendek dalam byte menang!

Uji Kasus

[["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
sumber
2
Saya suka bagaimana :0berfungsi ganda sebagai emoticon yang terkejut.
Gagang Pintu
4
"Aku suka menimbulkan kesedihan melalui downvotes." Anda tahu hanya ada satu cara yang tepat saya bisa menanggapi itu, kan? ;)
Geobits
9
Pada titik apa kita berhenti dengan lelucon "Alex salah"?
Martin Ender
1
Dapatkah balasan berada di luar jangkauan (mis. Pesan pertama dimulai dengan :3) atau ping tidak memuaskan pengguna di ruangan (mis. @zzz)?
Sp3000
2
Bisakah pengguna ping belum memposting pesan saat dia ping? misalnya [["Doorknob","@Alex is wrong"],["Alex","I am only slightly wrong"]]input yang valid?
ETHproduksi

Jawaban:

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)

Menggunakan objek untuk membuat daftar nama unik di samping ping. Kemudian mencari pesan-pesan yang cocok dengan kondisi ping. Jika sebuah nama, ia melihat daftar nama untuk menemukan apakah hanya ada satu kecocokan, dan kemudian peningkatan. Jika ada balasan, itu hanya merujuk indeks itu di larik pesan dan menarik nama yang akan ditambahkan. Akhirnya, ia mengembalikan objek.

Mwr247
sumber
Tentunya menggunakan objek lebih pendek. Jika bukan, saya tidak berpikir Anda perlu mengembalikan Peta sebagai array
Downgoat
@Downgoat Tapi Maplebih menyenangkan bukan? Na, saya awalnya memperkirakan terlalu banyak berapa banyak yang diperlukan untuk referensi objek, berpikir saya harus array yang terpisah untuk nama, tetapi Anda benar bahwa itu jauh lebih pendek dengan cara ini.
Mwr247
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
sumber