Memprediksi apakah suatu pesan akan dikilaukan bintangnya atau tidak dalam 50 byte

41

Diberikan input dari string yang terdiri dari pesan apa pun dari ruang obrolan situs kami yang diambil dari daftar yang dijelaskan dan ditautkan di bawah ini, menghasilkan nilai yang benar atau salah yang mencoba memprediksi apakah pesan itu dibintangi atau tidak dalam 50 byte atau kurang.

Anda dapat menggunakan nilai kebenaran atau kepalsuan apa pun , tetapi nilai tersebut harus identik (yaitu hanya akan ada dua kemungkinan keluaran, satu kebenaran dan satu kepalsuan). Input akan diberikan sebagai HTML mentah dengan baris baru dihapus, dan mungkin berisi karakter Unicode non-ASCII. Jika Anda membutuhkan input selain UTF-8, harap katakan demikian dalam jawaban Anda.

Pengajuan pemenang untuk tantangan ini akan menjadi yang memprediksi persentase tertinggi dari pesan obrolan dengan benar, dari daftar yang ditautkan di bawah. Jika dua kiriman yang diberikan memiliki tingkat keberhasilan yang sama, kiriman yang lebih pendek akan menang.

Harap berikan instruksi untuk menjalankan kode Anda pada seluruh rangkaian pesan dan menghitung persentase dengan benar. Idealnya, ini harus sedikit kode boilerplate (tidak dihitung terhadap 50 byte Anda) yang loop melalui kasus uji positif dan output berapa banyak dari mereka kode Anda sudah benar dan kemudian melakukan hal yang sama untuk kasus uji negatif. (Skor keseluruhan kemudian dapat dihitung secara manual melalui (correctPositive + correctNegative) / totalMessages.)

Agar kode Anda dapat diuji secara wajar, harus diselesaikan dalam 5 menit atau kurang untuk seluruh daftar pesan obrolan pada perangkat keras modern yang masuk akal.

Daftar lengkap pesan obrolan dapat ditemukan di sini , dan itu terdiri dari 1000 pesan berbintang terbaru sebagai kasus uji kebenaran dan 1000 pesan terbaru tanpa bintang sebagai kasus uji palsu. Perhatikan bahwa ada dua file di intinya; gulir sekitar setengah ke bawah untuk pesan yang tidak berbintang.

Gagang pintu
sumber
4
Mengetahui perilaku obrolan, saya pikir Pyth berikut ini sudah cukup:O2
Arcturus
9
Mempertimbangkan sejarah pesan yang Don'?t star
berkilau
11
Ini akan jauh lebih mudah jika Anda juga diberi pengguna sebagai bagian dari input.
Mama Fun Roll
3
Pada titik tertentu saya akan menjawab Regex, 2 byte \^
PurkkaKoodari
14
Saya pikir Anda harus menjalankan ini lagi pada 1.000 pesan berikutnya, dan melihat mana yang benar-benar meramalkan kebencian
abligh

Jawaban:

29

Retina , 50 byte, 71,8% 72,15%

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

Mencoba beberapa golf regex atas saran @ MartinBüttner. Ini cocok dengan 704 pesan berbintang dan tidak cocok dengan 739 pesan tanpa bintang.

The ^.*( ... )adalah untuk memastikan bahwa selalu ada 0 atau 1 pertandingan, karena Retina output jumlah pertandingan secara default. Anda dapat mencetak skor program pada file input dengan menambahkan m`untuk mode multiline, kemudian menjalankan

Retina stars.retina < starred.txt

dan juga untuk unstarred.txt.


Analisis / penjelasan

Saya membuat cuplikan di atas (dan banyak lagi) menggunakan program, lalu memilih yang saya inginkan secara manual. Inilah beberapa intuisi mengapa potongan di atas bekerja:

  • C: Cocok PPCG,@CᴏɴᴏʀO'Bʀɪᴇɴ
  • E: Cocok @ETHproductions,@El'endiaStarman
  • ;: Karena kotak uji adalah HTML, ini cocok dengan &lt;dan&gt;
  • ಠ-ﭏ: Cocok dengan serangkaian karakter Unicode, paling jelas untuk ಠ_ಠdan@Doorknob冰
  • tar: Mencocokkan variasi star, @El'endiaStarman(lagi) dan juga gravataryang muncul di kotak dialog yang diposting oleh bot posting baru
  • ol: Cocok dengan rel="nofollow"yang ada di banyak tautan dan onebox
  • l.x: Cocok @AlexA.,@trichoplax
  • eo: Terutama cocok people, tetapi juga tiga kasus untuk@Geobits
  • a.u: Terutama cocok graduation, status, featuredanabuse
  • pin: Kecocokan pingdan kata-kata yang berakhir dengan ping. Juga cocok dengan beberapa posting dalam diskusi tentang pineapple, sebagai contoh overfitting.
  • nu: Cocok dengan campuran kata-kata, yang paling umum adalah number
  • o.f: Cocok golf,conf(irm|use)
  • "$: Mencocokkan kutipan ganda sebagai karakter terakhir, mis @phase He means "Jenga."

Tidak [ada yang istimewa - saya hanya punya karakter yang tersisa jadi saya pikir saya bisa menggunakannya untuk mencocokkan satu case lagi.

Sp3000
sumber
(Saya belum memposting kode pengujian karena tampaknya berjalan agak lambat, dan saya ingin mencari tahu mengapa. Namun sekarang sudah terlambat.)
Sp3000
1
Menjalankan Retina satu kali untuk setiap test case akan memakan waktu lama. Mode multi-line melaporkan skor yang diklaim cukup banyak secara instan.
Dennis
@ Dennis Terima kasih, saya benar-benar lupa saya bisa melakukan itu.
Sp3000
3
LOL, sekarang nama saya adalah magnet bintang?
ETHproduk
18

JavaScript ES6, 50 byte, 71,10%

Identifikasi dengan benar 670 berbintang dan 752 tidak berbintang.

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

Sekarang melintasi 70% penghalang, dan mengalahkan semua orang kecuali Retina!

Kembali truejika pesan berisi hal-hal berikut:

  • Sebuah kata yang huruf kedua adalah D, E, R, atau v;
  • tar(biasanya star);
  • adan udengan satu char di antaranya;
  • ldan xdengan satu char di antaranya (biasanya alex);
  • teks miring;
  • eoatau ol;
  • a C, titik koma, atau a .

Berikut adalah beberapa pertandingan yang bermanfaat yang tampaknya tidak layak disingkirkan dari orang lain:

  • nf
  • nu
  • yp
  • n.m

Ini telah tumbuh semakin dekat dan semakin dekat dengan jawaban Retina, tetapi saya telah menemukan sebagian besar perbaikan sendiri.

Uji di konsol salah satu halaman ini: teks bintang , teks tanpa bintang

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

Ini versi alternatifnya. /a/.testsecara teknis fungsi, tetapi tidak memenuhi kriteria kami :

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

Ini skor 71,90% (697 berbintang, 741 tidak berbintang).


Saya telah menjalankan beberapa analisis pada daftar untuk melihat grup regex mana yang cocok dengan postingan yang paling berbintang dan yang paling tidak berbintang. Analisis dapat ditemukan di Intisari ini . Sejauh ini, saya sudah memeriksa aadan a.amencocokkan. a.uturun di sekitar # 50 dengan skor 28, namun itu pertandingan paling efisien dari formatnya ...

Produksi ETH
sumber
Hanya ada 1000 pesan ...?
Conor O'Brien
2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Beberapa multi-line, yang tidak diperhitungkan dalam cuplikan. Ini sudah diperbaiki.
ETHproduk
Kenapa tidak ada yang menggunakan /regexp/.test()? Saya pikir mungkin untuk memeras beberapa kasus lagi dengan itu.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
8
Hari ini saya belajar bahwa saya bisa mendapatkan bintang obrolan hanya dengan menyebutkan nama saya sendiri.
Alex A.
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Terima kasih, tidak tahu bagaimana saya tidak memikirkan hal itu
ETHproduksi
15

Pyth, 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

Ini hash input di salah satu dari 322 ember dan memilih Boolean tergantung pada ember itu.

Mencetak gol

$ 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]]
Dennis
sumber
14

CJam, 45 byte, 65,55%

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

Ini memeriksa apakah karakter pertama ada dalam daftar tertentu atau jumlah semua poin kode lebih besar dari 8.672.

Mencetak gol

$ 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
Dennis
sumber
+1 untuk mengajari saya tentang foldperintah, bersama dengan jawaban yang sebenarnya.
Gagang Pintu
6

Matlab / Oktaf, 17 byte 60,15%

Klasifikasi 490 pesan dengan benar, 713 pesan sebagai tidak ditatap

Versi sekarang:

Hanya memeriksa panjangnya.

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

Versi lama:

Dapat diterjemahkan ke bahasa lain mana pun. Itu hanya memeriksa apakah pesan berisi kata-kata bintang atau tidak.score: 59/911/52.5%

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

Hasil untuk testcases menggunakan kode ini:

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),'\%'])
cacat
sumber
3

CJam, 32 byte, Skor keseluruhan 0,5605 (56%).

Mengidentifikasi 428 pesan yang berbintang dengan benar dan 693 pesan yang tidak berbintang. Skor total adalah (360+730)/2000=0.545.

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

Tidak berharap untuk menang, saya akan melihat kinerjanya. Di atas adalah kode untuk satu pesan, untuk dijalankan dengan banyak gunakan versi modifikasi ini yang mengembalikan jumlah pesan yang berkilau bintangnya:

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

Cukup mengujinya dengan STDIN menjadi teks mentah dari kedua file. Mengembalikan nilai true jika pesan berisi "bintang" atau jika length + 1 mod 4 = 0.

GamrCorps
sumber
2
Jadi ... jika empat membagi satu lebih dari panjang pesan, maka ia memiliki peluang untuk dibintangi?
Conor O'Brien
2
@CᴏɴᴏʀO'Bʀɪᴇɴ Ya, tetapi memberikan skor tinggi
GamrCorps
3

JavaScript ES6, 0,615 = 61,5%

342 diidentifikasi dengan benar sebagai bintang, 888 dengan benar diidentifikasi sebagai tidak berbintang, (342+888)/2000 = 0.615

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

Tes seperti ini pada ini atau ini :

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

SAYA MASIH MUNGKIN MENDAPATKAN ANDA, CUKUP SAYA!

Conor O'Brien
sumber
1
Aku punya kamu sekarang;)
ETHproduk
@ ETHproduk GG. Saya akan mencari beberapa pola yang lebih umum.
Conor O'Brien
3

Retina, 46 byte, 68,55

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

679 bintang: 692 tidak berbintang

Beralih ke Retina untuk mendapatkan beberapa regex lagi di ... Masih belum selesai.

Mama Fun Roll
sumber
Oh ya, lupakan itu. Saya akan memperbaikinya.
Mama Fun Roll
1

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

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

Program yang saya gunakan untuk tujuan pengujian:

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|ಠ");
Stephan Schinkel
sumber