Предсказать, будет ли сообщение помечено или нет в 50 байтов


41

Учитывая ввод строки, состоящей из любого сообщения из чата нашего сайта, взятого из списка, описанного и связанного ниже, выведите либо истинное, либо ложное значение, пытаясь предсказать, было ли это сообщение помечено звездочкой или нет, в 50 байтах или меньше.

Вы можете использовать любые достоверные или ложные значения , но они должны быть идентичны (т. Е. Должно быть только два возможных выхода: один достоверный и один ложный). Входные данные будут предоставлены в виде необработанного HTML-кода с удаленными символами новой строки, и он может содержать не-ASCII символы Unicode. Если вам требуется что-то, кроме UTF-8, укажите это в своем ответе.

Победившим представителем этого задания будет тот, который правильно прогнозирует наибольший процент сообщений чата из списка, указанного ниже. Если два заданных представления имеют одинаковую норму успеха, более короткое представление выиграет.

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

Чтобы ваш код был достаточно тестируемым, он должен завершиться за 5 минут или меньше для всего списка сообщений чата на разумном современном оборудовании.

Полный список сообщений чата можно найти здесь , и он состоит из 1000 последних помеченных сообщений в качестве достоверных тестовых случаев и 1000 последних не помеченных сообщений в качестве ложных тестовых случаев. Обратите внимание, что в сущности есть два файла; прокрутите примерно на полпути вниз, чтобы найти сообщения без звезд.


4
Зная поведение чата, я думаю, следующего Pyth будет достаточно:O2
Arcturus

9
Учитывая историю прошлых Don'?t star
помеченных

11
Это было бы намного проще, если бы вам также дали пользователя как часть ввода.
Mama Fun Roll

3
В какой-то момент я бы ответил на Regex, 2 байта \^
PurkkaKoodari

14
Я думаю , вы должны запустить этот раз на следующие 1000 сообщений, и посмотреть , что один действительно предсказанное starredness
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;
  • ಠ-ﭏ: Соответствует диапазону символов Юникода, наиболее заметно для ಠ_ಠи@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, как пример переоснащения.
  • nu: Соответствует смешанному пакету слов, наиболее распространенным из которых является number
  • o.f: Матчи golf,conf(irm|use)
  • "$: Соответствует двойной кавычке в качестве последнего символа, например @phase He means "Jenga."

В [этом нет ничего особенного - у меня просто остался персонаж, поэтому я решил использовать его, чтобы соответствовать еще одному случаю.


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

1
Выполнение Retina один раз для каждого тестового случая займет много времени. Многострочный режим мгновенно сообщает о заявленном счете.
Деннис

@ Деннис Спасибо, я совсем забыл, что могу это сделать.
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% барьер и победить всех, кроме Retina!

Возвращает, trueесли сообщение содержит одну из следующих вещей:

  • Слово из которых вторая буква D, E, Rили v;
  • tar(обычно star);
  • aи uс одним символом между ними;
  • lи xс одним символом между ними (обычно alex);
  • курсивный текст;
  • eoили ol;
  • а 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 без звезд).


Я провел несколько анализов в списках, чтобы увидеть, какие группы регулярных выражений соответствуют сообщениям с наибольшим количеством звездочек и с наименьшим количеством звездочек. Анализы можно найти в этом Гисте . До сих пор я проверял aaи a.aсовпадал. a.uнаходится на отметке # 50 со счетом 28, но это самый эффективный вариант в своем формате ...


Есть только 1000 сообщений ...?
Конор О'Брайен

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

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 %

Результаты для тестовых случаев с использованием этого кода:

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, если сообщение содержит «звездочку» или if length + 1 mod 4 = 0.


2
Итак ... если четыре делит на единицу больше, чем длина сообщения, то есть ли у него шанс стать звездой?
Конор О'Брайен

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.