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)
Respostas:
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_golf
ou/wiki/United_States
. Ele também usa um espaço para os recuos e, emhttp://enwp.org
vez do URL completo da Wikipedia, para salvar bytes.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 ...
fonte
/wiki/Special:Random
URL. Consequentemente, depois de visitar muitos URLs, ele consumirá toda a sua RAM.from ... import*
.import mechanize as m
ea atribuirm.Browser()
aa
isso, quando eu chamoa.open()
, estou ligandomechanize.Browser().open()
agora, estou apenas importando tudomechanize
e pular a... as m
parte.