Dự đoán liệu một tin nhắn sẽ được gắn dấu sao hay không trong 50 byte


41

Đưa ra một đầu vào của một chuỗi bao gồm bất kỳ tin nhắn nào từ phòng chat trang web của chúng tôi được lấy từ danh sách được mô tả và liên kết bên dưới, xuất ra một giá trị trung thực hoặc giả mạo để dự đoán xem tin nhắn đó có được gắn dấu sao hay không trong 50 byte hoặc ít hơn.

Bạn có thể sử dụng bất kỳ giá trị trung thực hoặc giả , nhưng chúng phải giống hệt nhau (nghĩa là chỉ nên có hai kết quả đầu ra có thể, một giá trị trung thực và một giá trị giả). Đầu vào sẽ được cung cấp dưới dạng HTML thô với các dòng mới bị xóa và nó có thể chứa các ký tự Unicode không phải ASCII. Nếu bạn yêu cầu đầu vào trong một cái gì đó không phải là UTF-8, vui lòng nói như vậy trong câu trả lời của bạn.

Bài dự thi chiến thắng cho thử thách này sẽ là bài dự đoán tỷ lệ tin nhắn trò chuyện chính xác cao nhất, nằm ngoài danh sách được liên kết bên dưới. Nếu hai bài nộp nhất định có cùng tỷ lệ thành công, bài nộp ngắn hơn sẽ giành chiến thắng.

Vui lòng cung cấp hướng dẫn để chạy mã của bạn trên toàn bộ bộ thông báo và tính toán tỷ lệ phần trăm chính xác. Lý tưởng nhất, đây phải là một chút mã soạn sẵn (không được tính vào 50 byte của bạn) lặp lại các trường hợp kiểm tra dương tính và đưa ra bao nhiêu trong số đó mã của bạn đã chính xác và sau đó thực hiện tương tự cho các trường hợp kiểm tra âm tính. (Điểm tổng thể sau đó có thể được tính bằng tay thông qua (correctPositive + correctNegative) / totalMessages.)

Để mã của bạn có thể kiểm tra một cách hợp lý, nó phải hoàn thành trong 5 phút hoặc ít hơn cho toàn bộ danh sách các tin nhắn trò chuyện trên phần cứng hiện đại hợp lý.

Danh sách đầy đủ các tin nhắn trò chuyện có thể được tìm thấy ở đây , và nó bao gồm 1000 tin nhắn được gắn dấu sao mới nhất là các trường hợp kiểm tra trung thực và 1000 tin nhắn không có sao mới nhất là các trường hợp kiểm tra giả. Lưu ý rằng có hai tệp trong ý chính; cuộn khoảng một nửa xuống cho các tin nhắn không có dấu sao.


4
Biết các hành vi trò chuyện, tôi nghĩ rằng Pyth sau đây sẽ đủ:O2
Arcturus

9
Xem xét lịch sử của các tin nhắn được gắn dấu sao trong quá khứ, Regex, 11 byte:Don'?t star
Hạ cấp

11
Điều này sẽ dễ dàng hơn nhiều nếu bạn cũng được cung cấp cho người dùng như một phần của đầu vào.
Mama Fun Roll

3
Tại một số điểm, tôi đã trả lời Regex, 2 byte \^
PurkkaKoodari

14
Tôi nghĩ bạn nên chạy lại tin nhắn này trong 1.000 tin nhắn tiếp theo và xem tin nhắn nào thực sự được dự đoán là sao
bỏ qua

Câu trả lời:


29

Võng mạc , 50 byte, 71,8% 72,15%

^.*([[CE;ಠ-ﭏ]|tar|ol|l.x|eo|a.u|pin|nu|o.f|"$)

Đã thử chơi golf regex theo đề nghị của @ MartinBüttner. Điều này khớp với 704 tin nhắn được gắn dấu sao và không khớp với 739 tin nhắn chưa được gắn dấu sao.

Điều ^.*( ... )này là để đảm bảo rằng luôn có 0 hoặc 1 khớp, vì Retina xuất số lượng khớp theo mặc định. Bạn có thể chấm điểm chương trình trên các tệp đầu vào bằng cách m`chuẩn bị cho chế độ đa dòng, sau đó chạy

Retina stars.retina < starred.txt

và tương tự như vậy cho unstarred.txt.


Phân tích / giải thích

Tôi đã tạo các đoạn mã trên (và nhiều đoạn khác) bằng một chương trình, sau đó chọn những đoạn tôi muốn theo cách thủ công. Đây là một số trực giác về lý do tại sao các đoạn trên hoạt động:

  • C: Trận đấu PPCG,@CᴏɴᴏʀO'Bʀɪᴇɴ
  • E: Trận đấu @ETHproductions,@El'endiaStarman
  • ;: Bởi vì các trường hợp thử nghiệm là HTML, điều này khớp &lt;&gt;
  • ಠ-ﭏ: Phù hợp với một loạt các ký tự Unicode, nổi bật nhất cho ಠ_ಠ@Doorknob冰
  • tar: Khớp các biến thể của star, @El'endiaStarman(một lần nữa) và cũng gravatarxuất hiện trong các onebox được đăng bởi các bài đăng mới bot
  • ol: Các trận đấu rel="nofollow"có rất nhiều liên kết và oneboxes
  • l.x: Trận đấu @AlexA.,@trichoplax
  • eo: Chủ yếu là khớp people, nhưng cũng có ba trường hợp cho@Geobits
  • a.u: Chủ yếu là phù hợp graduation, status, featureabuse
  • pin: Kết hợp pingvà từ kết thúc bằng ping. Cũng phù hợp với một vài bài viết trong một cuộc thảo luận về pineapple, như một ví dụ về quá mức.
  • nu: Ghép một túi hỗn hợp các từ, phổ biến nhất trong số đó là number
  • o.f: Trận đấu golf,conf(irm|use)
  • "$: Ghép một trích dẫn kép làm ký tự cuối cùng, vd @phase He means "Jenga."

Điều [này không có gì đặc biệt - tôi chỉ còn lại một nhân vật nên tôi nghĩ rằng tôi có thể sử dụng nó để khớp với một trường hợp nữa.


(Tôi chưa đăng mã kiểm tra vì nó dường như đang chạy khá chậm và tôi muốn tìm hiểu tại sao. Tuy nhiên, bây giờ đã quá muộn.)
Sp3000

1
Thực hiện Retina một lần cho mỗi trường hợp thử nghiệm sẽ mất nhiều thời gian. Chế độ nhiều dòng báo cáo số điểm được yêu cầu khá nhiều ngay lập tức.
Dennis

@Dennis Cảm ơn, tôi hoàn toàn quên tôi có thể làm điều đó.
Sp3000

3
LOL, bây giờ tên của tôi là một nam châm sao?
Sản phẩm điện tử

18

JavaScript ES6, 50 byte, 71,10%

Xác định chính xác 670 ngôi sao và 752 ngôi sao.

x=>/ .[DERv]|tar|a.u|l.x|<i|eo|ol|[C;ಠ]/.test(x)

Bây giờ vượt qua rào cản 70% và đánh bại tất cả mọi người trừ Retina!

Trả về truenếu tin nhắn chứa bất kỳ thứ nào trong số này:

  • Một lời mà lá thư thứ hai là D, E, R, hoặc v;
  • tar(thường star);
  • auvới một char ở giữa;
  • lxvới một char ở giữa (thường alex);
  • chữ in nghiêng;
  • eohoặc ol;
  • a C, dấu chấm phẩy hoặc a .

Đây là một vài trận đấu hiệu quả hơn mà dường như không đáng để loại bỏ người khác:

  • nf
  • nu
  • yp
  • n.m

Điều này đã ngày càng phát triển gần hơn với câu trả lời của Retina, nhưng tôi đã tự mình tìm thấy hầu hết các cải tiến.

Kiểm tra nó trong bảng điều khiển của một trong những trang sau: văn bản sao , văn bản không có sao

var r=document.body.textContent.replace(/\n<br/g,"<br").split("\n").slice(0,-1);
var s=r.filter(function(x){return/ .[DERv]|tar|a.u|l.x|<i|eo|ol|[C;ಠ]/.test(x)}).length;
console.log("Total:",r.length,"Matched:",s,"Not matched:",r.length-s);

Đây là một phiên bản thay thế. /a/.testvề mặt kỹ thuật là một chức năng, nhưng không đáp ứng các tiêu chí của chúng tôi :

/ .[ERv]|a.u|l.x|<i|eo|yp|ol|nf|tar|[C;ÿ-ff]/.test

Điều này đạt 71,90% (697 sao, 741 không có sao).


Tôi đã chạy một số phân tích trên các danh sách để xem nhóm regex nào phù hợp với các bài đăng được gắn sao nhiều nhất và ít sao nhất. Các phân tích có thể được tìm thấy trong Gist này . Cho đến nay, tôi đã kiểm tra aaa.aphù hợp. a.ugiảm xuống khoảng # 50 với số điểm 28, nhưng đây là trận đấu hiệu quả nhất trong định dạng của nó ...


Chỉ có 1000 tin nhắn ...?
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Một số là nhiều dòng, không được tính trong đoạn trích. Điều này đã được sửa chữa.
Sản phẩm ETH

Tại sao không ai sử dụng /regexp/.test()? Tôi nghĩ rằng nó có thể ép trong một vài trường hợp với điều đó.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

8
Hôm nay tôi đã học được rằng tôi có thể có được những ngôi sao trò chuyện chỉ bằng cách nói tên của chính mình.
Alex A.

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Cảm ơn, dunno tôi đã không nghĩ về điều đó như thế nào
ETHproductions 18/1/2016

15

Bình thường, 50 byte, 67,9%

0000000: 21 40 6a 43 22 03 91 5d d3 c3 84 d5 5c df 46 69 b5 9d  !@jC"..]....\.Fi..
0000012: 42 9a 75 fa 74 71 d9 c1 79 1d e7 5d fc 25 24 63 f8 bd  B.u.tq..y..].%$c..
0000024: 1d 53 45 14 d7 d3 31 66 5f e8 22 32 43 7a              .SE...1f_."2Cz

Điều này băm đầu vào trong một trong 322 thùng và chọn Boolean tùy thuộc vào nhóm đó.

Chấm điểm

$ xxd -c 18 -g 1 startest.pyth
0000000: 72 53 6d 21 40 6a 43 22 03 91 5d d3 c3 84 d5 5c df 46  rSm!@jC"..]....\.F
0000012: 69 b5 9d 42 9a 75 fa 74 71 d9 c1 79 1d e7 5d fc 25 24  i..B.u.tq..y..].%$
0000024: 63 f8 bd 1d 53 45 14 d7 d3 31 66 5f e8 22 32 43 64 2e  c...SE...1f_."2Cd.
0000036: 7a 38                                                  z8
$ echo $LANG
en_US
$ pyth/pyth.py startest.pyth < starred.txt
[[345, False], [655, True]]
$ pyth/pyth.py startest.pyth < unstarred.txt
[[703, False], [297, True]]

14

CJam, 45 byte, 65,55%

l_c"\"#&'(-.19<CEFHIJLMOPSTXY[_qಠ"e=\1b8672>|

Điều này kiểm tra xem ký tự đầu tiên có trong một danh sách cụ thể hay tổng của tất cả các điểm mã lớn hơn 8,672.

Chấm điểm

$ cat startest.cjam
1e3{l_c"\"#&'(-.19<CEFHIJLMOPSTXY[_qಠ"e=\1b8672>|}*
$ java -jar cjam-0.6.5.jar startest.cjam < starred.txt | fold -1 | sort | uniq -c
    308 0
    692 1
$ java -jar cjam-0.6.5.jar startest.cjam < unstarred.txt | fold -1 | sort | uniq -c
    619 0
    381 1

+1 để dạy tôi về foldlệnh, cùng với câu trả lời thực tế.
Doorknob

6

Matlab / Octave, 17 byte 60,15%

Phân loại chính xác 490 tin nhắn là nhìn chằm chằm, 713 tin nhắn không được chuẩn bị

Phiên bản hiện tại:

Chỉ cần kiểm tra chiều dài.

f=@(w)numel(w)>58

Phiên bản cũ:

Có thể được dịch sang bất kỳ ngôn ngữ khác. Nó chỉ kiểm tra xem tin nhắn có chứa các từ sao hay không.score: 59/911/52.5%

f=@(w)nnz(strfind(lower(w),'star'))>0 %

Kết quả cho các thử nghiệm sử dụng mã này:

slCharacterEncoding('UTF-8');

fid = fopen('codegolf_starred_messages_starred.txt');
line = fgetl(fid);
starred = 0;
while ischar(line)
    if f(line);
        starred = starred +1;
    end

    disp(line)
    line = fgetl(fid);
end
fclose(fid);


fid = fopen('codegolf_starred_messages_unstarred.txt');
line = fgetl(fid);
unstarred = 0;
while ischar(line)
    if ~f(line);
        unstarred = unstarred +1;
    end

    disp(line)
    line = fgetl(fid);
end
fclose(fid);

disp(['  correctly classified as *ed: ',num2str(starred)])
disp(['correctly classified as un*ed: ',num2str(unstarred)])
disp(['                  total score: ',num2str((starred+unstarred)/20),'\%'])

3

CJam, 32 byte, Điểm tổng thể là 0,5605 (56%).

Xác định chính xác 428 tin nhắn được gắn dấu sao và 693 tin nhắn chưa được gắn dấu sao. Tổng số điểm là (360+730)/2000=0.545.

l_el"sta"/,1>\,)4%!|

Không hy vọng chiến thắng, Ill xem cách nó thực hiện. Trên đây là mã cho một tin nhắn, để chạy với nhiều người sử dụng phiên bản sửa đổi này trả về số lượng tin nhắn được gắn dấu sao:

1000{l_el"star"/,1>\,)6%!|}fA]:+

Chỉ cần kiểm tra nó với STDIN là văn bản thô của một trong hai tệp. Trả về true nếu thông báo chứa "sao" hoặc nếu length + 1 mod 4 = 0.


2
Vậy ... nếu bốn phân chia nhiều hơn một chiều dài của một tin nhắn, thì nó có cơ hội được gắn dấu sao không?
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Có, nhưng nó cung cấp điểm số cao
GamrCorps

3

JavaScript ES6, 0,615 = 61,5%

342 xác định chính xác là được gắn dấu sao, 888 được xác định chính xác là không có dấu sao, (342+888)/2000 = 0.615

x=>-~x.search(/(bo|le)x|sta|ಠ|ツ/i)

Kiểm tra như thế này trên này hoặc này :

r=document.body.innerHTML.replace(/<\/*pre>/g,"").split`
`.filter(x=>-~x.search`(bo|le)x|sta|ಠ|ツ`).length

TÔI VẪN CÒN NHẬN BẠN, PRETTY CỦA TÔI!


1
Tôi đã có bạn ngay bây giờ;)
Sản phẩm điện tử

@ETHproductions GG. Tôi sẽ tìm kiếm một số mẫu phổ biến hơn.
Conor O'Brien

3

Võng mạc, 46 byte, 68,55

^.*([zj_C;&¡-ff]|sta|san|soc|bo|eo|xk|l.x|<.>)

679 sao: 692 sao

Chuyển sang Retina để nhận thêm một số biểu thức trong ... Vẫn chưa được thực hiện.


Ồ vâng, quên mất điều đó. Tôi sẽ sửa chữa nó.
Mama Fun Roll

1

C # 6.0 (.NET Framework 4.6), 50 byte, 63,60%

bool s(string i)=>Regex.IsMatch(i,"ol|tar|l.x|ಠ");

Chương trình tôi sử dụng cho mục đích thử nghiệm:

void Main()
{
    var starred = @"C:\starred.txt";
    var unstarred = @"C:\unstarred.txt";

    var linesStarred = File.ReadAllLines(starred);
    var linesUnstarred = File.ReadAllLines(unstarred);

    var cls = linesStarred.Count();
    var clsc = 0;

    foreach (var line in linesStarred)
    {
        if ( s(line) ) clsc++;
    }

    var clu = linesUnstarred.Count();
    var cluc = 0;

    foreach (var line in linesUnstarred)
    {
        if (!s(line)) cluc++;
    }

    $"Starred {clsc}/{cls} correct ({(clsc/cls*100):0.00}%)".Dump();
    $"Unstarred {cluc}/{clu} correct ({(cluc /clu*100):0.00}%)".Dump();
    $"{(((clsc+cluc)/(decimal)(cls+clu))*100):0.00}".Dump();
}

bool s(string i)=>Regex.IsMatch(i,"ol|tar|l.x|ಠ");
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.