Encuentre una ruta entre dos artículos de Wikipedia

25

Introducción

Recientemente, estaba en el cielo con un grupo de amigos y nos aburrimos y no teníamos nada que hacer, así que "inventamos" un "juego" (algunas personas en los comentarios señalaron que este juego se puede jugar en línea y es muy popular, así que definitivamente no lo inventé, aunque no lo había visto antes). La razón por la que puse la palabra "juego" entre comillas es porque no es un juego de computadora real, sino que se juega en Wikipedia.

Es realmente fácil de jugar: alguien elige un artículo de Wikipedia como objetivo. Asumamos Code Golf para este ejemplo. Todos los jugadores deben comenzar desde un artículo aleatorio (presionando Artículo aleatorio en la barra lateral o ir a esta URL) y deben llegar al "objetivo" lo más rápido posible utilizando solo los artículos vinculados del artículo en el que se encuentran actualmente . Las reglas incluyen:

  • La función de búsqueda no está permitida (obviamente)
  • Solo puede hacer clic en los enlaces en el texto principal del artículo (específicamente todo el texto dentro <div id="bodyContent">)
  • Si su página aleatoria o cualquier otra página que encuentre no tiene enlaces válidos (enlaces inactivos, bucles, etc.) o no tiene enlaces, puede pasar de nuevo.

El reto

Aquí es donde entras tú: lamentablemente soy bastante malo en este juego, pero también soy un tramposo sucio. Así que quiero que implementen este bot por mí. También soy programador, así que, naturalmente, mi disco duro está lleno de cosas como código, bibliotecas y demás, y solo tengo unos pocos bytes de memoria de sobra. Por lo tanto, este desafío es Code Golf, la respuesta con menos bytes gana.

Detalles de implementacion:

  • Por supuesto, no tiene que implementar un bot inteligente que conozca las conexiones entre los temas y detecte automáticamente la ruta óptima. La fuerza bruta es más que suficiente para el propósito de este desafío.
  • En el juego real, el tiempo cuenta. Su programa no debería tomar más de 1 hora para encontrar el artículo (esto es para evitar lagunas como los buscadores aleatorios que "eventualmente" encontrarán el objetivo)
  • Si no se puede encontrar una ruta hacia el objetivo (por ejemplo, enlaces muertos o un bucle), puede elegir qué hacer de la siguiente lista:
    • Salir (la puntuación sigue siendo la misma)
    • Obtenga otro artículo al azar e intente nuevamente y no haga nada en los bucles (puntaje - = 10)
    • Obtenga otro artículo aleatorio en un enlace muerto o un bucle (detecte bucles automáticamente) (puntaje - = 50)
    • (Por "puntaje" me refiero a su número de bytes aquí)
  • Se restarán otros 20 bytes adicionales si "traza" la ruta, por lo que imprime el título de cada página individual que visita.
  • Se pueden usar bibliotecas de red estándar (para evitar lagunas como "He creado mi propia biblioteca de red que rastrea artículos de Wikipedia")
    • Lo único que debe hacer su programa relacionado con la red es enviar una solicitud HTTP para descargar una página de wikipedia
  • Si su programa encuentra la página, debería salir, pero de alguna manera indica que terminó (imprimir el carácter "f" o el título de la página es suficiente)
  • Se deben evitar las lagunas estándar

Diviértete jugando al golf!

(Esta es mi primera pregunta aquí, así que señale las lagunas y advertencias obvias en los comentarios antes de explotarlas, gracias: D)

Christoph Böhmwalder
fuente
1
Lo suficientemente interesante como para un desafío, pero no es razón suficiente para que inunde un sitio con solicitudes.
manatwork
2
@manatwork Estoy bastante seguro de que Wikipedia tiene suficiente ancho de banda para manejar "ataques" como este
Christoph Böhmwalder
1
No es exactamente un vacío legal, pero buscaría personas que se quejan de que esta es solo una pregunta de búsqueda gráfica que no trae muchas ideas nuevas a la mesa. Sin embargo, creo que está bien, este sitio necesita más preguntas. (Aunque definitivamente no inventaste este "juego": P.)
Calvin's Hobbies
1
Esto podría haber sido bueno como un desafío koth, ya que el número promedio de saltos de 50 carreras con cada bot. Daría más incentivos para construir un bot más inteligente.
rdans

Respuestas:

12

Python 373 -> 303

Lee el destino de Wikipedia desde input()(entrada del usuario) y debe estar en el formato de /wiki/dest. Entonces, algo como /wiki/Code_golfo /wiki/United_States. También usa un espacio para las sangrías y en http://enwp.orglugar de la URL completa de Wikipedia para guardar bytes.

  • -50 porque si encuentra una URL rota , obtiene una nueva URL aleatoria.
  • -20 porque imprime el título de cada URL visitada (podría cambiar el título -> URL, pero el título es más limpio y en realidad hace que mi fuente sea más grande).

Se cuelga de vez en cuando, y no puedo entender por qué. ¿Quizás por los límites de velocidad de Wikipedia?

Encontré la página de Wikipedia de los Medias Rojas de Boston en 9 minutos y 20 segundos, y la página de Estados Unidos en menos de 10 segundos, por lo que no debería llevar mucho tiempo encontrar Code Golf ...

from mechanize import*;from lxml.html import*;from random import*;a=Browser();a.set_handle_robots(0);i='http://enwp.org/Special:Random';t=input();d={};k=a.open
def f(o):
 if o!=i:d[o]=o
 if o in d:f(i)
 try:v=fromstring(k(o).read()).xpath('//div[@id="content"]//a/@href')
 except:f(i)
 print a.title()
 if t in v:k(t);print 'f';exit()
 else:f(choice(v)) if v else f(i)
f(i)
Eric Lagergren
fuente
No sé mucho de Python, pero esto se ve bien
Christoph Böhmwalder
¿Detecta bucles sin embargo? Si no es así, son 10 puntos de bonificación en lugar de 50
Christoph Böhmwalder
@HackerCow, sí, no visitará la misma url dos veces, excepto la /wiki/Special:Randomurl. En consecuencia, después de visitar muchas URL, se comerá toda la RAM.
Eric Lagergren
Voy a decir esto: from ... import*.
18ıʇǝɥʇuʎs
1
@DevanLoper oh dispara, lee mal tu comentario. Sí lo soy. Originalmente estaba usando import mechanize as my asignando m.Browser()a, aasí que cuando llamo a.open(), en realidad estoy llamando mechanize.Browser().open()ahora, solo estoy importando todo mechanizey puedo omitir la ... as mparte.
Eric Lagergren