ทำนายว่าข้อความจะติดดาวหรือไม่ใน 50 ไบต์


41

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

คุณอาจใช้ค่าความจริงหรือเท็จใด ๆแต่จะต้องเหมือนกัน (เช่นควรมีเพียงสองเอาต์พุตที่เป็นไปได้ความจริงหนึ่งและเท็จหนึ่ง) อินพุตจะถูกกำหนดให้เป็น HTML แบบดิบที่มีการขึ้นบรรทัดใหม่และอาจมีอักขระ Unicode ที่ไม่ใช่ ASCII หากคุณต้องการข้อมูลในสิ่งอื่นที่ไม่ใช่ UTF-8 โปรดพูดในคำตอบของคุณ

การส่งที่ได้รับรางวัลสำหรับความท้าทายนี้จะเป็นสิ่งที่คาดการณ์เปอร์เซ็นต์สูงสุดของข้อความแชทอย่างถูกต้องจากรายการที่ลิงก์ด้านล่าง หากการส่งที่ได้รับสองรายการมีอัตราความสำเร็จเท่ากันการส่งที่สั้นกว่าจะเป็นผู้ชนะ

โปรดให้คำแนะนำสำหรับการเรียกใช้รหัสของคุณในชุดข้อความทั้งหมดและคำนวณเปอร์เซ็นต์ที่ถูกต้อง ตามหลักแล้วนี่ควรเป็นรหัส boilerplate เล็กน้อย (ไม่นับต่อ 50 bytes ของคุณ) ที่วนรอบกรณีทดสอบเชิงบวกและส่งออกจำนวนรหัสของคุณที่ถูกต้องแล้วทำเช่นเดียวกันกับกรณีทดสอบเชิงลบ (คะแนนโดยรวมสามารถคำนวณได้ด้วยตนเองผ่านทาง(correctPositive + correctNegative) / totalMessages)

เพื่อให้รหัสของคุณสามารถทดสอบได้อย่างสมเหตุสมผลจะต้องเสร็จสมบูรณ์ภายใน 5 นาทีหรือน้อยกว่าสำหรับรายการแชททั้งหมดบนฮาร์ดแวร์ที่ทันสมัย

รายการข้อความแชททั้งหมดสามารถพบได้ที่นี่และประกอบด้วย 1,000 ข้อความที่ติดดาวล่าสุดเป็นกรณีทดสอบความจริงและข้อความที่ไม่ติดดาวล่าสุด 1,000 ข้อความเป็นกรณีทดสอบที่ผิดพลาด โปรดทราบว่ามีสองไฟล์ในส่วนสำคัญ; เลื่อนลงครึ่งหนึ่งเพื่อดูข้อความที่ไม่ติดดาว


4
รู้พฤติกรรมของการแชทที่ผมคิดว่าต่อไปนี้จะ Pyth พอเพียง:O2
Arcturus

9
เมื่อพิจารณาประวัติของข้อความที่ติดดาว Regex ขนาด 11 ไบต์:Don'?t star
Downgoat

11
สิ่งนี้จะง่ายขึ้นมากถ้าคุณให้ผู้ใช้เป็นส่วนหนึ่งของอินพุตด้วย
Mama Fun Roll

3
เมื่อถึงจุดหนึ่งฉันจะได้ตอบRegex, 2 ไบต์ \^
PurkkaKoodari

14
ฉันคิดว่าคุณควรจะทำสิ่งนี้อีกครั้งในข้อความ 1,000 ข้อความถัดไปและดูว่าหนึ่งในดวงดาวที่ทำนายไว้จริงๆ
abligh

คำตอบ:


29

เรติน่า 50 ไบต์71.8% 72.15%

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

ลองเล่นกอล์ฟ regex ตามคำแนะนำของ @ MartinBüttner สิ่งนี้ตรงกับข้อความที่ติดดาว 704 ข้อความและไม่ตรงกับข้อความที่ไม่ติดดาว 739 ข้อความ

สิ่งสำคัญ^.*( ... )คือต้องตรวจสอบให้แน่ใจว่ามีการจับคู่ทั้ง 0 หรือ 1 เสมอตั้งแต่ Retina ส่งออกจำนวนการจับคู่ตามค่าเริ่มต้น คุณสามารถให้คะแนนโปรแกรมในไฟล์อินพุตโดยการm`เตรียมสำหรับโหมดหลายบรรทัดจากนั้นรัน

Retina stars.retina < starred.txt

unstarred.txtและเช่นเดียวกันสำหรับ


การวิเคราะห์ / คำอธิบาย

ฉันสร้างตัวอย่างด้านบน (และอีกมากมาย) โดยใช้โปรแกรมจากนั้นเลือกสิ่งที่ฉันต้องการด้วยตนเอง นี่คือสัญชาตญาณว่าทำไมตัวอย่างด้านบนทำงาน:

  • C: ตรงกันPPCG,@CᴏɴᴏʀO'Bʀɪᴇɴ
  • E: ตรงกัน@ETHproductions,@El'endiaStarman
  • ;: เนื่องจากกรณีทดสอบคือ HTML การจับคู่แบบนี้&lt;และ&gt;
  • ಠ-ﭏ: จับคู่ช่วงของอักขระ Unicode ที่โดดเด่นที่สุดสำหรับಠ_ಠและ@Doorknob冰
  • tar: จับคู่รูปแบบของstar, @El'endiaStarman(อีกครั้ง) และรูปแบบgravatarที่ปรากฏใน oneboxes ที่โพสต์โดยบอทโพสต์ใหม่
  • ol: การจับคู่rel="nofollow"ที่อยู่ในลิงค์จำนวนมากและ oneboxes
  • l.x: ตรงกัน@AlexA.,@trichoplax
  • eo: ส่วนใหญ่ตรงกันpeopleแต่ยังมีสามกรณี@Geobits
  • a.u: ส่วนใหญ่ตรงกับgraduation, status, featureและabuse
  • pin: การจับคู่pingและคำที่ลงท้ายpingด้วย ยังจับคู่โพสต์สองสามรายการในการสนทนาเกี่ยวกับpineappleตัวอย่างของการ overfitting
  • nu: จับคู่คำที่ผสมกันซึ่งมักพบบ่อยที่สุดคือ number
  • o.f: ตรงกันgolf,conf(irm|use)
  • "$: จับคู่เครื่องหมายคำพูดคู่เป็นอักขระตัวสุดท้ายเช่น @phase He means "Jenga."

[อะไรพิเศษ - ฉันเพิ่งมีตัวอักษรที่เหลือดังนั้นฉันคิดว่าฉันสามารถใช้มันเพื่อให้ตรงกับกรณีหนึ่งที่เพิ่มเติม


(ฉันยังไม่ได้โพสต์รหัสทดสอบเนื่องจากดูเหมือนว่าจะทำงานค่อนข้างช้าและฉันต้องการทราบสาเหตุว่าทำไมมันสายเกินไปแล้ว)
Sp3000

1
การใช้งาน Retina หนึ่งครั้งสำหรับแต่ละกรณีทดสอบจะใช้เวลานาน โหมดหลายสายรายงานคะแนนที่อ้างสิทธิ์ทันที
Dennis

@ เดนนิสขอบคุณฉันลืมไปเลยว่าทำได้
Sp3000

3
ฮ่า ๆ ๆ ตอนนี้ฉันชื่อแม่เหล็กดึงดูดดาวใช่ไหม
ETHproductions

18

JavaScript ES6, 50 ไบต์, 71.10%

ระบุอย่างถูกต้อง 670 ดาวและ 752 ที่ไม่ติดดาว

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

ตอนนี้ข้ามกำแพง 70% และเอาชนะทุกคนยกเว้น Retina!

ส่งคืนtrueถ้าข้อความมีสิ่งเหล่านี้:

  • คำที่ตัวอักษรตัวที่สองคือD, E, Rหรือv;
  • tar(ปกติstar);
  • aและuมีตัวละครตัวหนึ่งอยู่ระหว่าง;
  • lและxมีหนึ่งอักขระในระหว่าง (ปกติalex);
  • ข้อความตัวเอียง
  • eoหรือol;
  • C, อัฒภาคหรือ

ต่อไปนี้คือการจับคู่ที่ประสบความสำเร็จมากกว่าที่ไม่น่าจะเป็นการกำจัดผู้อื่น

  • nf
  • nu
  • yp
  • n.m

สิ่งนี้ได้เติบโตอย่างใกล้ชิดและใกล้ชิดกับคำตอบของจอประสาทตามากขึ้น แต่ฉันพบว่าการปรับปรุงส่วนใหญ่ของฉันเอง

ทดสอบในคอนโซลของหนึ่งในหน้าเหล่านี้: ข้อความดาว , ข้อความที่ไม่ติดดาว

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

นี่คือรุ่นอื่น /a/.testเป็นฟังก์ชันทางเทคนิค แต่ไม่เป็นไปตามเกณฑ์ของเรา :

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

คะแนนนี้ 71.90% (697 ดาว, 741 ดาวไม่ติดดาว)


ฉันใช้การวิเคราะห์บางอย่างในรายการเพื่อดูว่ากลุ่ม regex ใดที่ตรงกับติดดาวและโพสต์ที่ติดดาวน้อยที่สุด การวิเคราะห์สามารถพบได้ในส่วนสำคัญนี้ จนถึงตอนนี้ฉันได้ตรวจสอบaaและa.aจับคู่แล้ว a.uลดลงอยู่ที่ประมาณ 50 ด้วยคะแนน 28 แต่เป็นการจับคู่ที่มีประสิทธิภาพที่สุดของรูปแบบ ...


มี 1,000 ข้อความเท่านั้น ... ?
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴบางคนเป็นแบบหลายสายซึ่งไม่ได้คิดในตัวอย่าง สิ่งนี้ได้รับการแก้ไขแล้ว
ETHproductions

ทำไมไม่มีใครใช้/regexp/.test()? ฉันคิดว่ามันเป็นไปได้ที่จะบีบในอีกสองสามกรณีด้วย
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

8
วันนี้ฉันได้เรียนรู้ว่าฉันสามารถรับดาวแชทได้โดยพูดชื่อตัวเอง
Alex A.

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ ขอบคุณไม่ทราบว่าฉันไม่คิดอย่างนั้น
ETHproductions

15

Pyth, 50 ไบต์, 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

สิ่งนี้จะทำการแฮชอินพุตในหนึ่งใน 322 ถังและเลือกบูลีนขึ้นอยู่กับที่ฝากข้อมูลนั้น

เกณฑ์การให้คะแนน

$ 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 ไบต์, 65.55%

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

นี้จะตรวจสอบว่าตัวละครตัวแรกอยู่ในรายการที่เฉพาะเจาะจงหรือผลรวมของจุดรหัสทั้งหมดมีขนาดใหญ่กว่า 8,672

เกณฑ์การให้คะแนน

$ 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 สำหรับการสอนฉันเกี่ยวกับfoldคำสั่งพร้อมกับคำตอบจริง
Doorknob

6

Matlab / Octave 17 ไบต์ 60.15%

จำแนกข้อความอย่างถูกต้อง 490 ข้อความถูกจ้อง, 713 ข้อความเป็นข้อความที่ไม่ติด

รุ่นปัจจุบัน:

เพียงตรวจสอบความยาว

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

เวอร์ชั่นเก่า:

สามารถแปลเป็นภาษาอื่นได้ มันแค่ตรวจสอบว่าข้อความมีคำว่าดาวหรือไม่score: 59/911/52.5%

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

ผลลัพธ์สำหรับ testcases โดยใช้รหัสนี้:

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 ไบต์, คะแนนโดยรวม 0.5605 (56%)

ระบุอย่างถูกต้อง 428 ข้อความที่ติดดาวและ 693 ข้อความที่ติดดาว (360+730)/2000=0.545คะแนนรวม

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

ไม่ได้คาดหวังว่าจะชนะโปรดดูว่ามันมีประสิทธิภาพอย่างไร ด้านบนเป็นรหัสสำหรับข้อความเดียวหากต้องการเรียกใช้หลาย ๆ ครั้งให้ใช้เวอร์ชันที่แก้ไขนี้ซึ่งส่งคืนจำนวนข้อความที่ติดดาว:

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

เพียงทดสอบกับ STDIN เป็นข้อความดิบของไฟล์ใดไฟล์หนึ่ง ผลตอบแทนจริงถ้าข้อความประกอบด้วย "ดาว" length + 1 mod 4 = 0หรือถ้า


2
ดังนั้น ... ถ้าสี่แบ่งมากกว่าหนึ่งความยาวของข้อความก็มีโอกาสที่จะติดดาว?
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴใช่ แต่ให้คะแนนสูง
GamrCorps

3

JavaScript ES6, 0.615 = 61.5%

ระบุ 342 อย่างถูกต้องว่าติดดาว, 888 ระบุอย่างถูกต้องว่าติดดาว (342+888)/2000 = 0.615

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

ทดสอบแบบนี้กับสิ่งนี้หรือสิ่งนี้ :

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

ฉันจะยังคงได้รับคุณสวยของฉัน!


1
ฉันมีคุณแล้ว;)
ETHproductions

@ETHproductions GG ฉันจะหารูปแบบทั่วไปเพิ่มเติม
Conor O'Brien

3

เรติน่า 46 ไบต์ 68.55

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

679 ดาว: 692 ไม่ติดดาว

เปลี่ยนเป็น Retina เพื่อรับ regexes เพิ่มเติมใน ... ยังไม่เสร็จ


โอ้ใช่ลืมเรื่องนั้นไป ฉันจะแก้ไข
Mama Fun Roll

1

C # 6.0 (.NET Framework 4.6), 50 ไบต์, 63,60%

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

โปรแกรมที่ฉันใช้สำหรับการทดสอบ:

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