メッセージに50バイトのスターを付けるかどうかを予測する


41

以下に説明およびリンクされているリストから取得したサイトチャットルームからのメッセージで構成される文字列の入力が与えられた場合、そのメッセージがスター付きかどうかを50バイト以下で予測しようとする真偽値または偽の値を出力します。

真実または偽の値を使用できますが、それらは同一でなければなりません(つまり、1つの真実と1つの偽の2つの可能な出力のみが存在する必要があります)。入力は、改行が削除された生のHTMLとして提供され、ASCII以外のUnicode文字が含まれる場合があります。UTF-8以外での入力が必要な場合は、回答でそう言ってください。

このチャレンジに対する受賞作品は、以下にリンクされているリストから、チャットメッセージの最も高い割合を正しく予測するものになります。指定された2つの提出の成功率が同じ場合、短い提出が優先されます。

メッセージのセット全体でコードを実行し、正しい割合を計算するための指示を提供してください。理想的には、これはボイラープレートコード(50バイトにはカウントされない)であり、ポジティブテストケースをループし、コードが正しくなった数を出力し、ネガティブテストケースに対して同じことを行う必要があります。(全体のスコアはを介して手動で計算でき(correctPositive + correctNegative) / totalMessagesます。)

コードを合理的にテストできるようにするには、合理的な現代のハードウェアでチャットメッセージのリスト全体に対して5分以内に完了する必要があります。

チャットメッセージの完全なリストはここにあり、真実のテストケースとしての最新のスター付きメッセージ1000件と、偽のテストケースとしての最新のスターなしメッセージ1000件で構成されています。要点には2つのファイルがあることに注意してください。スターを付けていないメッセージについては、下にスクロールしてください。


4
チャットの動作を知っていれば、次のPythで十分だと思います。– O2
Arcturus

9
過去のスター付きメッセージ、Regex、11バイトの履歴を考慮して:Don'?t star
Downgoat

11
入力の一部としてユーザーも指定されている場合、これははるかに簡単です。
ママファンロール

3
ある時点で、私は \^
正規表現

14
次の1,000件のメッセージでこれを再度実行し、どれが本当にスター
付きを

回答:


29

網膜、50バイト、71.8% 72.15%

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

@MartinBüttnerの提案で正規表現のゴルフをいくつか試しました。これは、スター付きのメッセージ704個と一致しますが、スターなしのメッセージ739個とは一致しません。

^.*( ... )網膜は、デフォルトでは、一致の数を出力するので0または1試合は、どちらか常にあることを確認することです。入力ファイルでプログラムを採点するには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に表示されます。
  • olrel="nofollow"多くのリンクとワンボックスにある一致
  • l.x:一致@AlexA.@trichoplax
  • eo:主に一致peopleしますが、@Geobits
  • a.u:主にマッチしgraduationstatusfeatureおよびabuse
  • pin:でping終わる一致および単語ping。またpineapple、オーバーフィットの例として、に関する議論のいくつかの投稿に一致します。
  • nu:単語の混合袋に一致します。最も一般的なのは number
  • o.f:一致golfconf(irm|use)
  • "$:最後の文字として二重引用符に一致します。たとえば @phase He means "Jenga."

これ[は特別なことではありません-キャラクターが残っているので、もう1つのケースに一致させるために使用できると考えました。


(テストコードはまだゆっくり実行されているように見えるので、まだ投稿していません。理由を知りたいと思います。今では遅すぎます。)
Sp3000

1
テストケースごとにRetinaを1回実行すると、時間がかかります。複数行モードでは、請求されたスコアがほとんど瞬時に報告されます。
デニス

@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メッセージに次のいずれかが含まれているかどうかを返します。

  • 第二の文字はその単語DER、またはv;
  • tar(通常star)。
  • aそして、uの間に1つの文字と、
  • lそして、x(通常の間に1つの文字付きalex
  • 斜体のテキスト。
  • eoまたはol;
  • a C、セミコロン、または

以下は、他の人を排除する価値がないと思われる、さらに実り多い試合です。

  • nf
  • nu
  • yp
  • n.m

これは、Retinaの答えにどんどん近づいていますが、ほとんどの改善は自分で見つけました。

次のいずれかのページのコンソールでテストしてください:スターテキストスターなしテキスト

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スターなし)です。


リストでいくつかの分析を実行し、どの正規表現グループが最もスターが付いている投稿と最もスターが付いていない投稿に一致するかを確認しました。分析はこのGistにあります。これまでのところ、チェックaaしてa.a一致させました。a.uスコアが28で約50位に低下していますが、その形式の中で最も効率的な一致です...


メッセージは1000件しかありません...?
コナーオブライエン

2
@CᴏɴᴏʀO'Bʀɪᴇɴ一部は複数行で、スニペットには含まれていませんでした。これは修正されました。
ETHproductions

なぜ誰も使用し/regexp/.test()ないのですか?私はそれでさらにいくつかのケースで絞ることが可能であると思います。
-n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

8
今日、私は自分の名前を言うだけでチャットスターを獲得できることを学びました。
アレックス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

fold実際の答えとともに、コマンドについて教えてくれた+1 。
ドアノブ

6

Matlab / Octave、17バイト60.15%

490メッセージをスター付き、713メッセージをスターなしとして正しく分類します。

現行版:

長さを確認するだけです。

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

旧版:

他の言語に翻訳できます。メッセージにstarという単語が含まれているかどうかを確認するだけです。score: 59/911/52.5%

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

このコードを使用したテストケースの結果:

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をいずれかのファイルの生のテキストとしてテストします。メッセージに「スター」が含まれる場合、またはの場合、trueを返しますlength + 1 mod 4 = 0


2
だから... 4つがメッセージの長さよりも1つ多く分割されている場合、スターが付いている可能性がありますか?
コナーオブライエン

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。もっと一般的なパターンを探します。
コナーオブライエン

3

網膜、46バイト、68.55

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

679つ星:692つ星

いくつかの正規表現を取得するためにRetinaに切り替えました...まだ完了していません。


そうそう、それを忘れていました。直します。
ママファンロール

1

C#6.0(.NET Framework 4.6)、50バイト、63,60%

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

テスト目的で使用されるプログラムi:

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.