Все знают, что содержание делает вопрос. Но хороший заголовок тоже помогает, и это первое, что мы видим. Пришло время превратить это первое впечатление в программу и выяснить, какие названия получают больше голосов.
Настоящим вам предлагается написать программу или функцию, которая принимает название вопроса PPCG в качестве входных данных и возвращает прогноз его оценки.
Например, вы можете получить Counting Grains of Rice
в качестве входных данных, и 59
в этом случае вы пытаетесь вернуть что-то близкое к результату . Нецелочисленные догадки хороши, но догадки на уровне или ниже -20
- нет.
Вот данные для тестирования и оценки:
http://data.stackexchange.com/codegolf/query/244871/names-and-upvotes
Оценка: Ваша программа будет выполняться по каждому вопросу в истории этого сайта (PPCG), не считая закрытых вопросов. Затем эта функция ln(score + 20)
будет применена к каждому результату и каждому предположению. Среднеквадратическая ошибка между двумя результирующими наборами значений является вашей оценкой. Ниже - лучше.
Например, программа, которая угадывала 0 каждый раз, набрала бы 0,577, а программа, которая угадала 11 каждый раз, получит 0,362.
Пожалуйста, рассчитайте свой счет и включите его в заголовок вашего ответа. Пожалуйста, также включите прогноз вашей программы о том, сколько голосов получит этот вопрос.
Ограничения:
Для предотвращения чрезмерного жесткого кодирования, не более 1000 символов.
Должен работать на всех данных, указанных выше, менее чем за минуту на разумной машине.
Стандартные лазейки закрыты.
Вот тестер, написанный на Python, для вашего использования и / или устранения неясностей:
import sys
import math
import csv
scores_dict = {}
with open(sys.argv[1], 'r') as csv_file:
score_reader = csv.reader(csv_file)
for score, title in score_reader:
if score == 'Score':
continue
scores_dict[title] = int(score)
def rate_guesses(guesser):
def transform(score):
return math.log(score + 20) if score > -20 else 0
off_by_total = 0
lines_count = 0
for title in scores_dict:
guessed_score = guesser(title)
real_score = scores_dict[title]
off_by_total += (transform(real_score) - transform(guessed_score)) ** 2
return (off_by_total/len(scores_dict)) ** .5
def constant11(title):
return 11
print(rate_guesses(constant11))
источник
[closed]
и[on hold]
, где это применимо?Ответы:
Python 2, 991 символ, оценка 0,221854834221, прогноз 11
Объяснение:
Это бесстыдное жесткое кодирование, но попытка сделать это эффективно.
Предварительная обработка:
В отдельном коде я хэшировал каждый заголовок со значением от 0 до 256 ^ 2-1. Давайте назовем эти значения мусорными ведрами. Для каждого бина я подсчитал средний балл. (Среднее необходимо, потому что для крошечной доли бинов есть коллизии - более 1 хэша заголовков в одном бине. Но для подавляющего большинства каждый заголовок отображается в свой бин).
Идея, лежащая в основе 2-байтового кода для каждого заголовка, заключается в том, что одного байта недостаточно - мы получаем слишком много коллизий, поэтому мы не знаем, какой счет назначить каждому 1-байтовому бину. Но с 2-байтовыми бинами почти нет столкновений, и мы фактически получаем 2-байтовое представление каждого заголовка.
Тогда ранг закрома - вычислить выигрыш в счете , если мы относим этот BIN его вычисленное значение, а не просто угадать 11. Возьмите верхний N бункера, и код их в строку (которая d в реальном коде).
Кодировка: ключ бина кодируется как 2 байта. значение кодируется с использованием 1 байта. Я нашел значения между -8 и 300 + что-то, поэтому пришлось немного сжать, чтобы получить его в 1 байт: x -> (x + 8) / 2.
Актуальный код:
считайте d как байтовые триплеты, расшифровав код, описанный выше. Когда дан заголовок, вычислите его хеш (по модулю 256 ^ 2), и, если этот ключ найден в dict, верните значение, на которое он отображается. В противном случае верните 11.
источник
Javascript ES6
Оценка: 0,245663
Длина: 1000 байт
Прогнозы: 5
(Я предполагаю, что вопрос из-за неожиданной лавины понижений.: P)
Минимизированный
расширенный
Функция
S
принимает строку (заголовок) и возвращает ее оценку.Примечания о поведении:
источник
Python 2, оценка = 0,335027, 999 символов, прогноз 11,34828 по этому вопросу
Просто чтобы мяч катился. Это нигде не оптимально.
Причудливая вещь SVM - это всего лишь моя случайная идея, и мне хотелось реализовать ее, так что вот она. Это улучшает базовую линию на 0,02 балла, поэтому я достаточно доволен этим. Но чтобы показать, что жесткое кодирование ввода является источником большинства улучшений, я также жестко кодирую некоторые ответы.
Без жесткого кодирования оценка составляет 0,360 (и на самом деле все прогнозы около 11, ха-ха)
Я использую scikit-learn и nltk
источник
Python 2, 986 символов, оценка 0.3480188, прогноз 12
Соответствующая функция есть
J
.Программа, по сути, наивная байесовская, использующая в качестве функций заглавные слова, но она чрезвычайно ограничена благодаря ограничению числа символов. Насколько ограничен? Что ж...
w
выше). Сжатие выполняется путем перестановки триплетов так, чтобы присутствовало как можно больше удвоенных букв, и эти пары заменяются соответствующими прописными буквами ASCII (например, fiLoNoN ... → fil, lon, non, ...)m
,s
выше, используя тот факт , что средние / сд являются не более чем на 90 ( что позволяет прямое кодирование ASCII, так как есть 95 версия для печати ASCII)G
это нормальная функция распределения - мы округляем e до 2dp и обратный квадратный корень от 2 pi до 1 dp, чтобы сэкономить на символах.В целом, экстремальный предел числа символов сделал это одной из худших идей, которые я когда-либо придумывал, но я очень доволен тем, как много мне удалось втиснуть (хотя это не очень хорошо работает). Если у кого-то есть идеи для сжатия, пожалуйста, дайте мне знать :)
(Спасибо KennyTM за указание на мое бессмысленное сжатие)
источник
w='grge…scse';w=[w[i:i+2]for i in range(0,len(w),2)]
это 165 байт, а вашC=lambda:…;w=C('…')
- 179 байт.Python 2, 535 символов, оценка 0,330910, прогноз 11,35
Средняя оценка для названий, содержащих каждое слово, затем используйте верхние и нижние 50 слов, чтобы, возможно, изменить оценку BASE в
guess(title)
функции.Код Python:
источник
С
Оценка: неизвестно
Длина: 5 байт
Прогнозы: 5
Golfed:
Ungolfed:
Запрос оценок дает средний балл 5.
У меня нет возможности проверить это в настоящее время, другие могут запускать / редактировать.
источник