Прогнозуйте, чи буде повідомлення розміщено зірочкою чи ні в 50 байтах


41

З огляду на введення рядка, що складається з будь-якого повідомлення з нашої веб-кімнати чату, взятого зі списку, описаного та зв'язаного нижче, виведіть або істинне, або хибне значення, намагаючись передбачити, чи було це повідомлення зірочкою чи ні в 50 байт або менше.

Ви можете використовувати будь-які значення " truthy" або "хибні" , але вони повинні бути однаковими (тобто повинні бути лише два можливі результати, один truthy та один false). Вхід буде наданий у вигляді необробленого HTML із видаленими новими рядками, і він може містити символи Unicode, що не належать до ASCII. Якщо вам потрібно ввести щось інше, ніж UTF-8, будь ласка, скажіть це у своїй відповіді.

Виграшним поданням на цей виклик буде те, що прогнозує найвищий відсоток повідомлень у чаті, із списку, зв'язаного нижче. Якщо два подані матеріали мають однаковий показник успішності, коротше подання виграє.

Надайте інструкції щодо запуску коду для всього набору повідомлень та обчислення правильного відсотка. В ідеалі це повинен бути трохи код котла (не зараховується до ваших 50 байт), який перебирає позитивні тестові випадки та виводить, скільки з них ваш код виправився, а потім робить те ж саме для негативних тестових випадків. (Потім загальний бал можна обчислити вручну (correctPositive + correctNegative) / totalMessages.)

Щоб ваш код був достатньо перевірений, він повинен заповнитись за 5 хвилин або менше для всього списку повідомлень чату на розумному сучасному обладнанні.

Повний список повідомлень у чаті ви можете знайти тут , і він складається з 1000 останніх повідомлень із зіркою як прості тестові випадки та 1000 останніх непроведених повідомлень як фальшивих тестових справ. Зауважте, що у суті є два файли; прокрутіть приблизно наполовину вниз для непроголошених повідомлень.


4
Знаючи поведінку чату, я думаю, що цього Піта було б достатньо:O2
Арктур

9
Розглядаючи історію минулих повідомлень із зіркою, Regex, 11 байт:Don'?t star
Пуховик

11
Це було б набагато простіше, якби ви також були надані користувачеві як частина вводу.
Mama Fun Roll

3
У якийсь момент я відповів би на Regex, 2 байти \^
PurkkaKoodari

14
Я думаю, вам слід запустити це ще раз на наступних 1000 повідомленнях, і побачити, яке з них насправді передбачив зірковість
abligh

Відповіді:


29

Сітківка , 50 байт, 71,8% 72,15%

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

Спробував кілька гольф-реджексів на пропозицію @ 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який з'являється в розділах Onebox вивішеного новими повідомлень бот
  • ol: Матчі, rel="nofollow"які є у багатьох посиланнях та одних скриньках
  • l.x: Матчі @AlexA.,@trichoplax
  • eo: В основному збіги people, але також три справи для@Geobits
  • a.u: У основному відповідає graduation, status, featureіabuse
  • pin: Відповідники pingта слова, що закінчуються на ping. Також відповідає декільком публікацій в дискусії про pineapple, як приклад надмірного пристосування.
  • nu: Відповідає змішаному мішку слів, найпоширенішим з яких є number
  • o.f: Матчі golf,conf(irm|use)
  • "$: Відповідає подвійній цитаті як останньому символу, наприклад @phase He means "Jenga."

У цьому [немає нічого особливого - у мене просто залишився персонаж, тож я зрозумів, що зможу використовувати його, щоб відповідати ще одному випадку.


(Я ще не розміщував код тестування, тому що він, здається, працює досить повільно, і я хотів би розібратися, чому. Хоча зараз уже пізно.)
Sp3000

1
Виконання Retina один раз для кожного тестового випадку займе багато часу. Багаторядковий режим повідомляє про заявлений результат майже миттєво.
Денніс

@Dennis Спасибі, я зовсім забув, що можу це зробити.
Sp3000

3
LOL, тепер мене звуть зірковий магніт?
ETHproductions

18

JavaScript ES6, 50 байт, 71,10%

Правильно ідентифікує 670 зірочок та 752 без зірок.

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

Тепер через 70% бар'єр, і б'ють усіх, окрім Сітківки!

Повертається, trueякщо повідомлення містить щось із цього:

  • Слово з яких друга буква D, E, Rабо v;
  • tar(зазвичай star);
  • aі uз одним знаком між ними;
  • lі xз одним знаком між ними (як правило alex);
  • курсивний текст;
  • eoабо ol;
  • a C, крапка з комою або a .

Ось ще кілька плідних матчів, які, здається, не варто позбуватися від інших:

  • 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 без зірок).


Я проводив кілька аналізів у списках, щоб побачити, які групи регулярних виразів відповідають найпопулярнішим і найменш незіркованим публікаціям. Аналізи можна знайти в цій суті . Поки що я перевіряв aaі a.aзбіги. a.uзнижується на рівні близько 50 з оцінкою 28, але це найефективніша відповідність її формату ...


Є всього 1000 повідомлень ...?
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Деякі були багаторядковими, які не враховувались у фрагменті. Це було виправлено.
ETHproductions

Чому ніхто не використовує /regexp/.test()? Я думаю, що в цьому можна ще кілька випадків.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

8
Сьогодні я дізнався, що можу отримати зірок чату, просто сказавши власне ім’я.
Олексій А.

@ 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команду разом із фактичною відповіддю.
Дверна ручка

6

Матлаб / Октава, 17 байт 60,15%

Правильно класифікує 490 повідомлень як відмічені, 713 повідомлень як нестандартні

Поточна версія:

Просто перевірка довжини.

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

Стара версія:

Можна перекласти на будь-яку іншу мову. Він просто перевіряє, чи містить повідомлення зірочку чи ні.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, який є неочищеним текстом будь-якого файлу. Повертає істину, якщо повідомлення містить "зірку" або якщо 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. Я буду шукати ще кілька поширених моделей.
Конор О'Браєн

3

Сітківка, 46 байт, 68,55

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

679 зірка: 692 зір

Перейшов на Retina, щоб отримати ще кілька регулярних регексів у ... Ще не зроблено.


О так, забув про це. Я це виправлю.
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|ಠ");
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.