Bir mesajın 50 baytta yıldızlı olup olmayacağını tahmin et


41

Aşağıda açıklanan ve bağlantı verilen listeden alınan site sohbet odamızdaki herhangi bir iletiden oluşan bir dize girişi göz önüne alındığında , bu iletinin 50 bayt veya daha kısa bir sürede başlayıp başlamadığını tahmin etmeye çalışan bir ya da yanlış ya da sahte bir değer çıktı.

Herhangi bir gerçek veya sahte değer kullanabilirsiniz , ancak bunlar aynı olmalıdır (yani yalnızca iki olası çıktı, bir gerçek ve bir sahte olmalıdır). Girdi, yeni satırlar kaldırılmış olarak ham HTML olarak verilecek ve ASCII olmayan Unicode karakterler içerebilir. UTF-8 dışında bir şey girmeniz gerekiyorsa, lütfen cevabınızı söyleyin.

Bu zorluğa kazanan gönderim, aşağıda listelenen listeden en yüksek sohbet mesajı yüzdesini doğru tahmin edebilecek olan olacaktır. Verilen iki başvuru aynı başarı oranına sahipse, kısa sunum kazanacaktır.

Lütfen kodunuzu tüm mesaj dizisinde çalıştırmak ve doğru yüzdeyi hesaplamak için talimatlar verin. İdeal olarak, bu, pozitif test durumlarından geçen ve kodunuzun bunlardan kaç tanesinin doğru çıktı verdiğini ve negatif test durumları için de aynı şeyi veren bir parça kod kodu (50 baytınıza kadar sayılmaz) olmalıdır. (Daha sonra toplam puan üzerinden manuel olarak hesaplanabilir (correctPositive + correctNegative) / totalMessages.)

Kodunuz makul bir şekilde test edilebilir olduğundan, makul modern donanımdaki tüm sohbet mesajları listesi için 5 dakika veya daha kısa bir sürede tamamlaması gerekir.

Sohbet mesajlarının tam listesi burada bulunabilir ve truthy test senaryoları olarak en son 1000 yıldızlı iletilerden ve sahte test senaryoları olarak en yeni 1000 yıldızlı notlardan oluşur. Oyunda iki dosya olduğuna dikkat edin; yıldızlanmamış mesajların yarısı kadar aşağı kaydırın.


4
Sohbetin davranışlarını bilerek, şu Pyth'in yeterli olacağını düşünüyorum:O2
Arcturus,

9
Geçmiş yıldızlı mesajların tarihini göz önünde bulundurarak, Regex, 11 bayt:Don'?t star
Downgoat,

11
Girişin bir parçası olarak kullanıcıya verilmiş olsaydı bu daha kolay olurdu.
Mama Fun Roll

3
Bir noktada \^
Regex'e

14
Senin gelecek 1.000 iletilere yine bu çalıştırın ve tek görmeliyiz gerçekten tahmin starredness
abligh

Yanıtlar:


29

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

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

MartinBüttner'ın önerisine göre bazı regex golf oynamaya çalıştım. Bu, 704 yıldızlı iletilerle eşleşir ve 739 yıldızsız iletiyle eşleşmez.

^.*( ... )Emin Retina varsayılan olarak eşleşme sayısını verir çünkü, ya hep 0 veya 1 eşleşme olduğunu yapmaktır. m`Çok satırlı mod için hazırlanıp ardından çalıştırarak programı giriş dosyalarında puanlayabilirsiniz .

Retina stars.retina < starred.txt

ve aynı şekilde unstarred.txt.


Analiz / açıklama

Bir programı kullanarak yukarıdaki parçacıkları (ve daha pek çoğunu) oluşturdum, daha sonra manuel olarak istediklerimi seçtim. Yukarıdaki parçacıkların neden çalıştığına dair bazı sezgiler:

  • C: Maçlar PPCG,@CᴏɴᴏʀO'Bʀɪᴇɴ
  • E: Maçlar @ETHproductions,@El'endiaStarman
  • ;: Test durumları HTML olduğundan, bu &lt;ve&gt;
  • ಠ-ﭏ: En belirgin ಠ_ಠve en belirgin olan bir dizi Unicode karakteri ile eşleşir.@Doorknob冰
  • tar: Varyasyonları eşleşir star, @El'endiaStarman(tekrar) ve aynı zamanda gravataryeni mesaj botlar tarafından yayınlanan onebox'ları göründüğü
  • ol: rel="nofollow"Çok fazla bağlantıda ve kutuda olan eşleşmeler
  • l.x: Maçlar @AlexA.,@trichoplax
  • eo: Temelde eşleşir people, ancak üç durum için@Geobits
  • a.u: Ağırlıklı olarak eşleşir graduation, status, featureveabuse
  • pin: Maçlar pingve biten kelimeler ping. Ayrıca pineapple, fazladan takma örneği olarak bir tartışmadaki birkaç gönderiyle eşleşiyor .
  • nu: En yaygın kullanılanları karışık bir sözcük çantasıyla eşleşir. number
  • o.f: Maçlar golf,conf(irm|use)
  • "$: İkili alıntıyı son karakter olarak eşleştirir, örn. @phase He means "Jenga."

Bu [özel bir şey değil - sadece bir karakterim kalmıştı, böylece bir davayı daha eşleştirmek için kullanabileceğimi düşündüm.


(Oldukça yavaş çalışıyor gibi görünüyor, çünkü henüz test kodu yayınlanmıştır değil, nedenini anlamaya istiyorum olsa artık çok geç..)
SP3000

1
Her test vakası için Retina'nın bir defa yürütülmesi uzun zaman alacaktır. Çok hatlı mod, talep edilen puanı hemen anında bildirir.
Dennis

@Dennis Teşekkürler, yapabileceğimi tamamen unuttum.
Sp3000

3
LOL, şimdi benim adım bir yıldız mıknatısı mı?
ETHProductions

18

JavaScript ES6, 50 bayt,% 71,10

670 yıldızlı ve 752 yıldızlı olmayanları doğru olarak tanımlar.

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

Şimdi% 70 bariyer karşısında ve Retina hariç herkesi yeniyor!

trueMesaj aşağıdakilerden herhangi birini içeriyorsa döndürür :

  • İkinci harf olan bir kelime D, E, Rya da v;
  • tar(genellikle star);
  • ave uaralarında bir karakter;
  • lve xaralarında bir karakter (genellikle alex);
  • italik yazı;
  • eoveya ol;
  • a C, noktalı virgül veya a .

İşte diğerlerinden kurtulmaya değmez gibi görünen bir kaç verimli maç:

  • nf
  • nu
  • yp
  • n.m

Bu, Retina'nın cevabına daha da yaklaştı ve bu gelişmelerin çoğunu kendi başıma buldum.

Bu sayfalardan birinin konsolunda test edin: yıldız metinler , yıldız olmayan metinler

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

İşte alternatif bir sürüm. /a/.testteknik olarak bir işlevdir, ancak kriterlerimizi karşılamıyor :

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

Bu puan% 71,90'dır (697 yıldızlı, 741 yıldızsız).


Hangi regex gruplarının en yıldızlı ve en az yıldızlı olmayan yayınlarla eşleştiğini görmek için listelerde bazı analizler yapıyorum. Analizler bu Gist'te bulunabilir . Şimdiye kadar, kontrol ettim aave a.aeşleştirdim. a.u28 puanla 50 numaraya düştü, ancak formatının en etkili maçı ...


Sadece 1000 mesaj var ...?
Conor O'Brien,

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Bazıları, snippet'te hesaba katılmamış çok satırlıydı. Bu giderildi.
ETH Sunumları

Neden kimse kullanmıyor /regexp/.test()? Bununla birkaç durumda daha sıkmak mümkün olduğunu düşünüyorum.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

8
Bugün sadece kendi adımı söyleyerek sohbet yıldızları alabileceğimi öğrendim.
Alex A.

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ Teşekkürler, bunu nasıl düşünmediğimi bilmiyorum
ETHproductions

15

Pyth, 50 bayt,% 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

Bu, girişi 322 kovadan birine hash eder ve bu kovana bağlı olarak Boole değerini seçer.

puanlama

$ 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 bayt,% 65,55

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

Bu, ilk karakterin belirli bir listede olup olmadığını veya tüm kod noktalarının toplamının 8,672'den büyük olup olmadığını kontrol eder.

puanlama

$ 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

foldAsıl cevabın yanı sıra emir hakkında bana bilgi vermek için +1 .
Doorknob

6

Matlab / Octave, 17 bayt% 60.15

490 iletiyi doğru olarak sınıflandırılmış, 713 iletisini başlangıçsız olarak sınıflandırır.

Şimdiki versiyonu:

Sadece uzunluğu kontrol ediyorum.

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

Eski versiyon:

Başka bir dile çevrilebilir. Sadece mesajın yıldız kelimelerini içerip içermediğini kontrol eder .score: 59/911/52.5%

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

Bu kodu kullanan testlerin sonuçları:

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 bayt, Toplam skor 0.5605 (% 56).

428 yıldızlı mesajları ve 693 yıldızsız mesajları doğru bir şekilde tanımlar. Toplam puan (360+730)/2000=0.545.

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

Kazanmayı beklemiyorum, Nasıl performans gösterdiğine bakarım. Yukarıda, tek bir mesajın kodu, birden fazla kullanımla çalıştırmak için, yıldızlı iletilerin miktarını döndüren bu değiştirilmiş sürümü kullanıyorsunuz:

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

Her iki dosyanın da ham metni STDIN ile sınayın. Mesaj "yıldız" içeriyorsa veya döndürürse true değerini verir length + 1 mod 4 = 0.


2
Yani ... dördü bir mesajın uzunluğundan bir tanesinden fazla bölerse, o zaman o yıldız olma şansı olur?
Conor O'Brien,

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Evet, ancak yüksek puan
almanızı sağlıyor

3

JavaScript ES6, 0.615 =% 61,5

342 doğru olarak yıldız işaretli, 888 doğru olarak yıldız işaretlenmemiş, (342+888)/2000 = 0.615

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

Bu gibi test bu ya bu :

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

HALA ALABİLİRSİNİZ!


1
Şimdi seni anladım;)
ETHproductions

@ETHproductions GG. Bazı genel kalıpları arayacağım.
Conor O'Brien,

3

Retina, 46 bayt, 68,55

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

679 yıldızı: 692 yıldızsız

Daha fazla regex almak için Retina'ya geçtim ... Hala bitmedi.


Evet, unut gitsin. Düzelteceğim.
Mama Fun Roll

1

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

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

Test amaçlı kullandığım program:

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|ಠ");
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.