Todo mundo sabe que o conteúdo faz a pergunta. Mas um bom título também ajuda, e é a primeira coisa que vemos. É hora de transformar a primeira impressão em um programa e descobrir que tipos de títulos recebem mais votos.
Você é desafiado a escrever um programa ou função que tome o título de uma pergunta do PPCG como entrada e retorne uma previsão de sua pontuação.
Por exemplo, você pode receber Counting Grains of Rice
como entrada e tentaria retornar algo próximo à pontuação, 59
nesse caso. As suposições não inteiras são boas, mas as suposições iguais ou inferiores -20
não são.
Aqui estão os dados, para teste e pontuação:
http://data.stackexchange.com/codegolf/query/244871/names-and-upvotes
Pontuação: seu programa será executado em todas as perguntas no histórico deste site (PPCG), sem contar as perguntas fechadas. A função ln(score + 20)
será aplicada a cada pontuação e a cada palpite. O erro quadrático médio entre os dois conjuntos de valores resultantes é a sua pontuação. Menor é melhor.
Por exemplo, um programa que adivinhou 0 todas as vezes teria 0,577, enquanto um programa que adivinharia 11 todas teria 0,326.
Calcule sua pontuação e inclua-a no título da sua resposta. Inclua também a previsão do seu programa para quantas votações positivas esta pergunta receberá.
Restrições:
Para evitar códigos excessivos, no máximo 1000 caracteres.
Deve ser executado em todo o conjunto de dados acima em menos de um minuto em uma máquina razoável.
As brechas padrão estão fechadas.
Aqui está um testador escrito em Python, para seu uso e / ou para esclarecer ambiguidades:
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))
fonte
[closed]
e[on hold]
, onde aplicável?Respostas:
Python 2, 991 caracteres, pontuação 0,221854834221, prever 11
Explicação:
Esta é uma codificação vergonhosa, mas tentando fazê-lo com eficiência.
Pré-processando:
Em um código separado, eu dividi cada título em um valor entre 0 e 256 ^ 2-1. Vamos chamar esses valores de caixas. Para cada posição, calculei a pontuação média. (A média é necessária porque, para uma fração minúscula dos compartimentos, há colisões - mais de 1 hashes de título no mesmo compartimento. Mas, para a grande maioria, cada título é mapeado para um compartimento próprio).
A idéia por trás do código de 2 bytes para cada título é que 1 byte não é suficiente - temos muitas colisões, então não sabemos realmente qual pontuação atribuir a cada compartimento de 1 byte. Mas com compartimentos de 2 bytes, quase não há colisões, e obtemos efetivamente uma representação de 2 bytes de cada título.
Em seguida, classifique os compartimentos - calcule o ganho na pontuação se atribuirmos a este compartimento seu valor calculado, em vez de apenas adivinhar 11. Pegue os N compartimentos superiores e codifique-os em uma string (que é d no código real).
A codificação: a chave do compartimento é codificada como 2 bytes. o valor é codificado usando 1 byte. Encontrei valores entre -8 e 300 + algo, então tive que apertar um pouco para obter 1 byte: x -> (x + 8) / 2.
Código atual:
leia d como trigêmeos de bytes, decodificando a codificação explicada acima. Quando um título é fornecido, calcule seu hash (módulo 256 ^ 2) e, se essa chave for encontrada no dict, retorne o valor para o qual ele mapeia. Caso contrário, retorne 11.
fonte
Javascript ES6
Pontuação: 0.245663
Comprimento: 1000 bytes
Prevê: 5
(Acho que a pergunta se deve a uma avalanche inesperada de votos negativos.: P)
Minificado
Expandido
A função
S
aceita uma sequência (título) e retorna sua pontuação.Notas sobre comportamento:
fonte
Python 2, Pontuação = 0,335027, 999 caracteres, Preveja 11,34828 para esta pergunta
Só para fazer a bola rolar. Isso não é o ideal.
A coisa chique do SVM é apenas minha ideia aleatória e tive vontade de implementá-la, então aqui está. Isso melhora a linha de base em 0,02 pontos, então estou feliz o suficiente com isso. Mas para mostrar que a entrada codificada é a origem da maior parte da melhoria, eu também codifico algumas respostas.
Sem a codificação codificada, a pontuação é de 0,360 (e, na verdade, todas as previsões são de 11, haha)
Estou usando o scikit-learn e o nltk
fonte
Python 2, 986 caracteres, pontuação 0,3480188, prever 12
A função relevante é
J
.O programa é essencialmente Naive Bayes usando as palavras-título como recursos, mas é extremamente restrito graças ao limite de caracteres. Quão restrito? Bem...
w
acima). A compactação é feita reorganizando os trigêmeos para que o maior número possível de letras dobradas esteja presente, e esses pares são substituídos por suas maiúsculas ASCII correspondentes (por exemplo, fiLoNoN ... → fil, lon, non, ...)m
,s
acima, usando o facto de que o / SD média são, no máximo, 90 (permitindo uma codificação ASCII direta, uma vez que existem 95 ASCII imprimível)G
é a função de distribuição normal - arredondamos e para 2dp e a raiz quadrada inversa de 2 pi para 1 dp para economizar em caracteres.No geral, o limite extremo de caracteres tornou essa uma das piores idéias que já tive, mas estou muito feliz com o quanto consegui me concentrar (mesmo que não funcione muito bem). Se alguém tiver idéias melhores para compactação, entre em contato :)
(Obrigado ao KennyTM por apontar minha compactação inútil)
fonte
w='grge…scse';w=[w[i:i+2]for i in range(0,len(w),2)]
é de 165 bytes enquanto o seuC=lambda:…;w=C('…')
é de 179 bytes.Python 2, 535 caracteres, pontuação 0,330910, prevê 11,35
Faça a média da pontuação dos títulos que contêm cada palavra e, em seguida, use as 50 palavras superior e inferior para possivelmente modificar a pontuação BASE na
guess(title)
função.Código Python:
fonte
C
Pontuação: Desconhecido
Comprimento: 5 bytes
Prevê: 5
Golfe:
Ungolfed:
Uma consulta às pontuações fornece uma pontuação média de 5.
Eu não tenho a capacidade de testá-lo no momento, outros podem executar / editar.
fonte