En este desafío, su tarea es hacer escribir un programa con menos de 300 caracteres que tome un párrafo corto o unas pocas oraciones que haya dicho un candidato y genere quién lo dijo.
Entrada : puede tomarse como parámetro de una función, entrada a un programa, etc. Será un párrafo corto, puntuado correctamente.
Salida : El candidato que crees que es. Este podría ser uno de
Ben Carson (1)
Ted Cruz (2)
John Kasich (3)
Marco Rubio (4)
Donald Trump (5)
Hillary Clinton (6)
Bernie Sanders (7)
Dejé los nombres de las personas que abandonaron el 1 de marzo. Puede generar el nombre mismo o, más convenientemente, el número que corresponde al nombre.
Puntuación: su puntuación es el porcentaje de casos de prueba que obtiene correctamente. La puntuación más alta gana. Los empates (o puntajes perfectos) se dividen por la longitud del código como en un código de golf.
Los casos de prueba se pueden extraer de:
http://www.presidency.ucsb.edu/debates.php
Haga clic en cada debate, tanto demócrata como republicano que haya sucedido hasta ahora (antes del 1 de marzo). Cada párrafo es un caso de prueba, a menos que el "párrafo" tenga menos de 20 caracteres de longitud.
Aquí hay un código que extrae los casos de prueba de una página en particular:
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);
}
Entonces puedes hacer categ.SANDERS
para obtener una lista de todos los párrafos que ha dicho el senador Sanders.
Puede descartar cualquier cosa que no haya dicho los candidatos mencionados anteriormente (p. Ej. categ.BUSH
Ocateg.CHRISTIE
).
Aquí está el archivo con todos los casos de prueba: https://drive.google.com/file/d/0BxMn8--P71I-bDZBS2VZMDdmQ28/view?usp=sharing
El archivo está organizado por candidato
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.
Un ejemplo de envío parcial sería:
if (/ win | wall | great | beautiful/.test(p)) return 5;
if (/ percent | top one | rigged /.test(p)) return 7;
// etc. for all candidates
o
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 */
Aquí hay un lugar donde puede probar las soluciones de JavaScript: https://jsfiddle.net/prankol57/abfuhxrh/
El código usa el parámetro p
para representar la frase a clasificar. Código de ejemplo que obtiene un puntaje de alrededor del 20% (adivinar obtendría alrededor del 11%):
if (/ rigged | top | percent | Wall Street /.test(p)) return 'Sanders';
return 'Trump';
Exactamente lo que estoy preguntando: escriba un programa / función en menos de 300 caracteres que tome como entrada una frase que un candidato ha dicho y devuelva como salida qué candidato lo dijo. Su puntaje es el porcentaje de casos de prueba que obtiene correctamente. La puntuación más alta gana.
Sí, sé que muchas líneas tienen [laughter]
o [cheering]
en ellas. Estos no serán eliminados. En el peor de los casos, son información adicional que puede ignorar; en el mejor de los casos, son información adicional que puede usar (por ejemplo, inventé esto, pero tal vez la risa de la gente es evidencia de que Marco Rubio está hablando). Los casos de prueba son como aparecen en el archivo de texto.
fuente
Respuestas:
Políglota, ~ 18.6%
Esto funciona en: Cjam, Pyth, TeaScript, Japt, Seriously, 05AB1E, GolfScript, Jelly y probablemente muchos más.
Esto genera Hillary para todas las entradas. Esto se debe a que Hillary dijo más. Si bien no es la forma más ingeniosa de hacer esto. Funciona ¯ \ _ (ツ) _ / ¯
fuente
Pyth, 34.16% (297 bytes)
(tenga en cuenta que algunas líneas terminan en espacios)
Elegí la opción más simple que se me ocurrió: verifique una lista de patrones y, tan pronto como encuentre una coincidencia, envíe el candidato correspondiente. Si todo lo demás falla, muestre el candidato más probable del resto. Después de eso, se trata de agrupar tantos datos en 300 bytes como sea posible.
Descompostura:
Entonces, ¿de dónde provienen esos datos? Bueno, la estructura es simplemente:
(con una entrada al final sin frase para actuar como el último recurso)
¿Pero por qué esos artículos en particular? Escribí un programa en C ++ para analizar el conjunto de datos proporcionado (primero con una limpieza manual de las nuevas líneas para que la estructura sea coherente). Examina todas las subcadenas ("tokens") en cada cita (1-16 caracteres), luego verifica repetidamente el token que brinda el mayor beneficio para ir a continuación en la lista. Una vez que un patrón está en la lista, elimine las comillas que coincidan y repita (se vuelve un poco más complicado mantenerlo rápido, pero eso es lo básico). El código es probablemente demasiado largo para incluirlo aquí, pero podría ponerlo en github más tarde (cuando lo haya limpiado un poco).
Probé un par de sistemas de puntuación. Al final fui con este:
Un enfoque más estricto de permitir solo nuevos elementos que no introducen respuestas incorrectas pareció atorarse en aproximadamente 20-25%, necesitando muchos patrones para ser más altos. Este enfoque más difuso funciona mucho mejor y aún puede alcanzar una precisión de ~ 80% (con 550 elementos). El puntaje presentado tiene 38 elementos, que fue lo máximo que pude en el límite de 300 caracteres.
El resultado del 34% en realidad proviene de un programa de prueba C ++ que realiza los mismos pasos. Debería coincidir, pero no tengo un arnés de prueba Pyth para verificarlo.
Esta es la primera vez que utilizo Pyth, así que imagino que se podrían reducir algunos bytes más, permitiendo un poco más de datos.
fuente
."
.Javascript, 32.87%
299 caracteres:
Estrategia:
Hice una búsqueda de fuerza bruta en qué segmentos de palabras incluir en un "hash". Luego, se realiza una búsqueda de cadena con ese hash de tal manera que elige al candidato más probable para ese hash.
El código en sí:
Esta es mi primera presentación de código de golf, por lo que las sugerencias son bienvenidas :)
fuente
Mathematica, 23.7775%
Cuenta las ocurrencias de palabras clave comunes únicas para cada candidato y genera el número del candidato con la puntuación más alta.
Básicamente, encontré las palabras más comunes de todos los candidatos.
y elija las palabras clave comunes que son únicas para cada candidato.
Después de eliminar manualmente algunas de las palabras clave, esta es la tabla final:
Con estas palabras clave, la longitud total de la función es de 211 caracteres. Probé la función sobre todas las citas:
lo que da una precisión del 23.7775%.
fuente
Python, 25.677868%
Elegido arbitrariamente cuatro personajes diferentes que se utilizarían para identificar a los candidatos. A cada candidato se le asigna un factor de puntuación por personaje basado en una búsqueda de escalada que realicé durante unos minutos para terminar en 25.68%.
Supongo que esto al menos demuestra que el concepto es mejor que elegir un candidato con los ojos vendados o simplemente elegir a Clinton, pero me interesaría ver a alguien aplicar un mejor algoritmo de búsqueda, tanto por los factores como por los caracteres utilizados.
fuente
Javascript, TBD
Convierte cada cadena en un código hash, luego usa métodos probabilísticos para determinar el hablante. Sería bueno si alguien con una buena configuración pudiera probar esto por mí.
fuente
a+=
debe haber sido un error tipográfico.