Encontre uma rota entre dois artigos da Wikipedia

25

Introdução

Recentemente, eu estava conversando com um monte de amigos e ficamos entediados e não tínhamos nada a fazer, então "inventamos" um "jogo" (algumas pessoas nos comentários apontaram que este jogo é jogável on-line e muito popular, por isso, definitivamente não o inventei, embora eu nunca o tivesse visto antes). A razão pela qual coloquei a palavra "jogo" entre aspas é porque não é um jogo de computador real, mas é jogado na Wikipedia.

É realmente fácil de jogar: alguém escolhe um artigo da Wikipedia como objetivo. Vamos assumir o Code Golf neste exemplo. Todos os jogadores precisam começar de um artigo aleatório (pressionando Artigo aleatório na barra lateral ou acessando este URL) e precisam chegar ao "objetivo" o mais rápido possível, usando apenas artigos vinculados do artigo em que você está atualmente . As regras incluem:

  • A função de pesquisa não é permitida (obviamente)
  • Você só pode clicar em links no texto principal do artigo (especificamente todo o texto <div id="bodyContent">)
  • Se sua página aleatória ou qualquer outra página que você encontrar não tiver links válidos (links mortos, loops etc.) ou nenhum link, você poderá rolar novamente.

O desafio

Aqui é onde você entra: infelizmente sou muito ruim nesse jogo, mas também sou um trapaceiro. Então, eu quero que você implemente esse bot para mim. Eu também sou programador, então, naturalmente, meu disco rígido está cheio de coisas como código, bibliotecas e outras, e eu tenho apenas alguns bytes de memória de sobra. Portanto, esse desafio é o Code Golf, a resposta com o mínimo de bytes vence.

Detalhes da implementação:

  • É claro que você não precisa implementar um bot inteligente que conheça as conexões entre os tópicos e detecte automaticamente a rota ideal. A força bruta é mais que suficiente para o objetivo deste desafio
  • No jogo atual, o tempo conta. Seu programa não deve demorar mais de uma hora para encontrar o artigo (isso evita brechas como pesquisadores aleatórios que "eventualmente" encontrarão a meta)
  • Se nenhum caminho para a meta puder ser encontrado (por exemplo, links mortos ou um loop), você poderá escolher o que fazer na lista abaixo:
    • Sair (a pontuação permanece a mesma)
    • Obtenha outro artigo aleatório e tente novamente e não faça nada nos loops (pontuação - = 10)
    • Obter outro artigo aleatório em um link ou loop morto (detectar loops automaticamente) (pontuação - = 50)
    • (Por "pontuação", quero dizer sua contagem de bytes aqui)
  • Outros 20 bytes de bônus serão subtraídos se você "rastrear" a rota, para imprimir o título de cada página individual que visitar.
  • Bibliotecas de rede padrão podem ser usadas (para evitar brechas como "Criei minha própria biblioteca de rede que rastreia artigos da wikipedia")
    • A única coisa que seu programa relacionado à rede deve fazer é enviar uma solicitação HTTP para baixar uma página da wikipedia
  • Se o seu programa encontrar a página, ele deve sair, mas de alguma forma sinalizar que terminou (basta imprimir o caractere "f" ou o título da página)
  • As brechas padrão devem ser evitadas

Divirta-se jogando golfe!

(Esta é minha primeira pergunta aqui, por favor, indique brechas e advertências óbvias nos comentários antes de explorá-las - obrigado: D)

Christoph Böhmwalder
fonte
1
Interessante o suficiente para um desafio, mas não há motivos suficientes para inundar um site com solicitações.
Manatwork 17/07/2014
2
@manatwork Tenho certeza de que a Wikipedia tem largura de banda suficiente para lidar com "ataques" como este #
Christoph Böhmwalder
1
Não é exatamente uma brecha, mas eu procuraria pessoas reclamando que essa é apenas uma pergunta de pesquisa gráfica que não traz muitas idéias novas para a mesa. No entanto, acho que está tudo bem, este site precisa de mais perguntas. (Embora você definitivamente não tenha inventado esse "jogo": P).
Calvin's Hobbies
1
Isso poderia ter sido bom como um desafio koth, levando o número médio de saltos de 50 corridas com cada bot. Daria mais incentivo para construir um bot mais inteligente.
Rdans

Respostas:

12

Python 373 -> 303

Ele lê o destino da Wikipedia em input()(entrada do usuário) e deve estar no formato de /wiki/dest. Então, algo como /wiki/Code_golfou /wiki/United_States. Ele também usa um espaço para os recuos e, em http://enwp.orgvez do URL completo da Wikipedia, para salvar bytes.

  • -50, porque se encontrar um URL quebrado, ele obtém um novo URL aleatório.
  • -20 porque imprime o título de cada URL visitado (pode alterar o título -> URL, mas o título é mais limpo e, na verdade, aumenta minha fonte).

Ele trava de vez em quando, e eu não consigo entender o porquê. Talvez por causa dos limites de taxa da Wikipedia?

Encontrei a página da Wikipedia do Boston Red Sox em 9 minutos e 20 segundos e a página dos Estados Unidos em menos de 10 segundos, por isso não deve demorar muito para encontrar o 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
fonte
Eu não conheço muito python, mas isso parece legal #
Christoph Böhmwalder
Ele detecta loops? Se isso não acontecer, que é 10 pontos de bônus em vez de 50
Christoph Böhmwalder
@HackerCow, sim, ele não visitará o mesmo URL duas vezes, exceto pelo /wiki/Special:RandomURL. Consequentemente, depois de visitar muitos URLs, ele consumirá toda a sua RAM.
22814 Eric Lagergren
Eu só vou dizer isto: from ... import*.
ɐɔıʇǝɥʇuʎs
1
@DevanLoper oh dispara, interpreta mal seu comentário. Sim, eu sou. Inicialmente eu estava usando import mechanize as mea atribuir m.Browser()a aisso, quando eu chamoa.open() , estou ligando mechanize.Browser().open()agora, estou apenas importando tudo mechanizee pular a ... as mparte.
22814 Eric Erlgrgren