В этой задаче ваша задача состоит в том, чтобы написать программу длиной менее 300 символов, которая содержит короткий параграф или несколько предложений, которые сказал кандидат, и выдает их.
Ввод : может быть взят в качестве параметра для функции, для ввода в программу и т. Д. Это будет короткий абзац, отмеченный должным образом.
Вывод : кандидат, который, как вы думаете, есть. Это может быть одним из
Ben Carson (1)
Ted Cruz (2)
John Kasich (3)
Marco Rubio (4)
Donald Trump (5)
Hillary Clinton (6)
Bernie Sanders (7)
Я исключил имена людей, которые выпали из 1 марта. Вы можете вывести само имя или, что более удобно, номер, соответствующий имени.
Подсчет баллов: ваш балл - это процент тестовых случаев, которые вы получили. Самый высокий балл выигрывает. Галстуки (или отличные результаты) разбиваются по длине кода, как в коде гольфа.
Контрольные примеры могут быть получены из:
http://www.presidency.ucsb.edu/debates.php
Нажмите на каждую дискуссию, как демократов, так и республиканцев, которые произошли до сих пор (до 1 марта). Каждый абзац является тестовым примером, если только «абзац» не содержит менее 20 символов.
Вот код, который вытаскивает контрольные примеры с определенной страницы:
var t = $(".tools").parentNode.querySelectorAll("p");
var categ = {}, cur = 0;
for (var i = 0; i < t.length; ++i) {
var p = t[i], str = p.innerText;
if (p.querySelector("b")) {
cur = p.querySelector("b").innerText.replace(':', '');
str = str.replace(/^.*?:\s/, '');
}
str = str.replace(/\[applause\]/g, '')
if (str.length < 20) continue;
if (categ[cur] == null) categ[cur] = [];
categ[cur].push(str);
}
Затем вы categ.SANDERS
можете получить список всех абзацев, которые сказал сенатор Сандерс.
Вы можете отказаться от всего, что не сказано кандидатами, перечисленными выше (например, categ.BUSH
или categ.CHRISTIE
).
Вот файл со всеми тестами: https://drive.google.com/file/d/0BxMn8--P71I-bDZBS2VZMDdmQ28/view?usp=sharing
Файл организован кандидатом
CANDIDATE CANDIDATE_LAST_NAME
(empty line)
Series of statements. Each paragraph is separated by (NEW PARAGRAPH)-
(empty line)
CANDIDATE NEXT_CANDIDATE_LAST_NAME
(empty line)
etc.
Пример частичного представления будет:
if (/ win | wall | great | beautiful/.test(p)) return 5;
if (/ percent | top one | rigged /.test(p)) return 7;
// etc. for all candidates
или
var words = p.split(' ');
// majority of words have less than 5 characters
if (words.length - words.filter(a => a.length < 5).length < 4) evidence[5]++;
// at the end
return /* index with the most evidence */
Вот место, где вы можете протестировать решения javascript: https://jsfiddle.net/prankol57/abfuhxrh/
Код использует параметр p
для представления фразы для классификации. Пример кода, который набирает около 20% (угадывание получит около 11%):
if (/ rigged | top | percent | Wall Street /.test(p)) return 'Sanders';
return 'Trump';
Именно то, что я спрашиваю: напишите программу / функцию длиной менее 300 символов, которая принимает в качестве входных данных фразу, которую сказал кандидат, и возвращает в качестве выходной информации, какой кандидат сказал это. Ваша оценка - это процент тестовых случаев, которые вы получили правильно. Самый высокий балл выигрывает.
Да, я знаю, что много строк есть [laughter]
или [cheering]
в них. Они не будут удалены. В худшем случае это дополнительная информация, которую вы можете игнорировать; в лучшем случае это дополнительная информация, которую вы можете использовать (например, я придумал это, но, может быть, смех людей свидетельствует о том, что говорит Марко Рубио). Контрольные примеры, как они появляются в текстовом файле.
источник
Ответы:
Полиглот, ~ 18,6%
Это работает в: Cjam, Pyth, TeaScript, Japt, Seriously, 05AB1E, GolfScript, Jelly и, возможно, многих других.
Это выводит Хиллари для всех входов. Это потому, что Хиллари сказала больше всего. Пока это не самый гениальный способ сделать это. Это работает ¯ \ _ (ツ) _ / ¯
источник
Pyth, 34,16% (297 байт)
(обратите внимание, что некоторые строки заканчиваются пробелами)
Я выбрал самый простой вариант: проверить список шаблонов и, как только вы найдете совпадение, вывести соответствующий кандидат. Если ничего не помогает, выведите наиболее вероятного кандидата из остатка. После этого все сводится к тому, чтобы собрать как можно больше данных в 300 байт.
Сломать:
Так откуда эти данные? Ну структура просто:
(с записью в конце без фразы, которая будет действовать как последний запасной вариант)
Но почему именно эти предметы? Я написал программу на C ++ для анализа предоставленного набора данных (сначала с некоторой ручной очисткой строк, чтобы сделать структуру согласованной). Он просматривает все подстроки ("токены") в каждой кавычке (1-16 символов), затем многократно проверяет токен, который дает наибольшую выгоду, чтобы идти дальше в списке. Как только шаблон находится в списке, удалите все кавычки, которые ему соответствуют, и повторите (становится немного сложнее, чтобы сохранить его быстрым, но это основы). Код, вероятно, слишком длинный для включения в него, но я мог бы поместить его на github позже (когда я немного его почистил).
Я попробовал пару систем оценки. В конце концов я пошел с этим:
Более строгий подход, заключающийся в том, что допускаются только новые элементы, которые не содержат неправильных ответов, застрял примерно на 20-25%, и для этого нужно было много моделей. Этот нечеткий подход делает намного лучше, и все еще может достигать точности ~ 80% (с 550 пунктами). В представленном счете 38 пунктов, и это было самое большее, что я мог вместить в 300 символов.
34% -ный результат фактически получается из тестовой программы C ++, которая выполняет те же шаги. Он должен совпадать, но у меня нет тестовой оснастки Pyth для проверки.
Это первый раз, когда я использую Pyth, поэтому я предполагаю, что можно сжать еще несколько байтов, что позволит немного больше данных.
источник
."
.Javascript, 32,87%
299 символов:
Стратегия:
Я выполнил поиск по методу Брюса, какие сегменты слова должны быть включены в «хэш». Затем происходит поиск строки с этим хешем таким образом, чтобы выбрать наиболее вероятного кандидата для этого хеша.
Сам код:
Это моя первая подача кода в гольф, поэтому предложения приветствуются :)
источник
Mathematica, 23,7775%
Он подсчитывает количество общих ключевых слов, уникальных для каждого кандидата, и выводит количество кандидатов с наибольшим количеством баллов.
В основном, я нашел наиболее распространенные слова всех кандидатов
и выбрал общие ключевые слова, которые являются уникальными для каждого кандидата.
После удаления некоторых ключевых слов вручную получается финальная таблица:
С этими ключевыми словами общая длина функции составляет 211 символов. Я проверил функцию над всеми кавычками:
что дает точность 23,7775%.
источник
Python, 25,677868%
Произвольно выбрал четыре разных персонажа, которые будут использоваться для идентификации кандидатов. Каждому кандидату присваивается коэффициент оценки на каждого персонажа на основе поиска по восхождению на холм, который я выполнял в течение нескольких минут, чтобы в итоге получить 25,68%.
Я предполагаю, что это, по крайней мере, доказывает, что концепция лучше, чем выбор кандидата с завязанными глазами или просто выбор Клинтона, но мне было бы интересно увидеть кого-то, кто применяет лучший алгоритм поиска, как по факторам, так и по используемым символам.
источник
Javascript, TBD
Преобразует каждую строку в хеш-код, а затем использует вероятностные методы для определения говорящего. Было бы хорошо, если бы кто-то с хорошей настройкой мог проверить это для меня.
источник
a+=
должно быть, это опечатка.