Trova un percorso tra due articoli di Wikipedia


25

introduzione

Di recente, stavo saltando con un gruppo di amici e ci siamo annoiati e non avevamo nulla da fare, quindi abbiamo "inventato" un "gioco" (alcune persone nei commenti hanno sottolineato che questo gioco è giocabile online e molto popolare, quindi sicuramente non l'ho inventato, sebbene non lo avessi mai visto prima). Il motivo per cui ho messo la parola "gioco" tra virgolette è perché non è un vero gioco per computer, ma è giocato su Wikipedia.

È davvero facile da giocare: qualcuno sceglie un articolo di Wikipedia come obiettivo. Assumiamo Code Golf per questo esempio. Tutti i giocatori devono quindi iniziare da un articolo casuale (premendo l' articolo casuale nella barra laterale o andando su questo URL) e devono raggiungere "l'obiettivo" il più rapidamente possibile utilizzando solo gli articoli collegati dell'articolo in cui ci si trova attualmente . Le regole includono:

  • La funzione di ricerca non è consentita (ovviamente)
  • Puoi solo fare clic sui collegamenti nel testo principale dell'articolo (in particolare tutto il testo all'interno <div id="bodyContent">)
  • Se la tua pagina casuale o qualsiasi altra pagina che incontri non ha link validi (link non funzionanti, loop, ecc.) O nessun link puoi rotolare di nuovo.

La sfida

Ecco dove entri: sfortunatamente sono piuttosto cattivo in questo gioco, ma sono anche un imbroglione sporco. Quindi voglio che tu implementi questo bot per me. Sono anche un programmatore, quindi naturalmente il mio disco rigido è pieno di cose come codice, librerie e simili e ho solo pochi byte di memoria da risparmiare. Pertanto questa sfida è Code Golf, la risposta con il minor numero di byte vince.

Dettagli di implementazione:

  • Ovviamente non è necessario implementare un bot intelligente che conosca le connessioni tra gli argomenti e rilevi automaticamente il percorso ottimale. La forza bruta è più che sufficiente ai fini di questa sfida
  • Nel gioco reale, il tempo conta. Il tuo programma non dovrebbe richiedere più di 1 ora per trovare l'articolo (questo per evitare scappatoie come i ricercatori casuali che "alla fine" troveranno l'obiettivo)
  • Se non è possibile trovare un percorso verso l'obiettivo (ad esempio collegamenti morti o un loop), puoi scegliere cosa fare dall'elenco seguente:
    • Esci (il punteggio rimane lo stesso)
    • Ottieni un altro articolo casuale e riprova e non fare nulla sui loop (punteggio - = 10)
    • Ottieni un altro articolo casuale su un collegamento morto o un loop (rileva automaticamente i loop) (punteggio - = 50)
    • (Per "punteggio" intendo il conteggio dei byte qui)
  • Altri 20 byte bonus verranno sottratti se si "traccia" il percorso, quindi si stampa il titolo di ogni singola pagina visitata.
  • È possibile utilizzare librerie di rete standard (per evitare scappatoie come "Ho creato la mia libreria di rete che esegue la scansione degli articoli di Wikipedia")
    • L'unica cosa che dovrebbe fare il tuo programma in rete è inviare una richiesta HTTP per scaricare una pagina di Wikipedia
  • Se il tuo programma trova la pagina, dovrebbe uscire, ma in qualche modo segnala che è finita (è sufficiente stampare il carattere "f" o il titolo della pagina)
  • Le scappatoie standard devono essere evitate

Divertiti a giocare a golf!

(Questa è la mia prima domanda qui, quindi per favore fai notare ovvie lacune e avvertenze nei commenti prima di sfruttarle - grazie: D)


1
Abbastanza interessante per una sfida, ma non abbastanza per me per inondare un sito di richieste.
arte

2
@manatwork Sono abbastanza sicuro che Wikipedia abbia abbastanza bandwith per gestire "attacchi" come questo
Christoph Böhmwalder,

1
Non esattamente una scappatoia, ma vorrei cercare persone che si lamentano del fatto che questa è solo una domanda di ricerca grafica che non porta molte nuove idee sul tavolo. Penso comunque che vada bene, questo sito ha bisogno di più domande. (Anche se non hai inventato questo "gioco": P.)
Calvin's Hobbies,


1
Questo avrebbe potuto essere buono come una sfida koth che portava il numero medio di salti su 50 corse con ogni bot. Darebbe più incentivi per costruire un bot più intelligente.
rans

Risposte:


12

Python 373 -> 303

Legge la destinazione di Wikipedia da input()(input dell'utente) e dovrebbe essere nel formato di /wiki/dest. Quindi, qualcosa come /wiki/Code_golfo /wiki/United_States. Utilizza anche uno spazio per i rientri e http://enwp.orginvece dell'URL completo di Wikipedia per salvare i byte.

  • -50 perché se trova un URL non funzionante ottiene un nuovo URL casuale.
  • -20 perché stampa il titolo di ogni URL visitato (potrebbe cambiare il titolo -> URL, ma il titolo è più pulito e in realtà ingrandisce la mia fonte).

Si blocca ogni tanto e non riesco a capire perché. Forse a causa dei limiti di tasso di Wikipedia?

Ho trovato la pagina Wikipedia del Boston Red Sox in 9 minuti e 20 secondi e la pagina degli Stati Uniti in meno di 10 secondi, quindi non dovrei impiegare troppo tempo a trovare 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)

Non conosco molto pitone, ma sembra carino
Christoph Böhmwalder,

Rileva i loop però? In caso contrario, sono 10 punti bonus invece di 50
Christoph Böhmwalder il

@HackerCow sì, non visiterà lo stesso URL due volte tranne l' /wiki/Special:RandomURL. Di conseguenza, dopo aver visitato molti URL consumerà tutta la tua RAM.
Eric Lagergren,

Dico solo questo: from ... import*.
Julıʇǝɥʇuʎs,

1
@DevanLoper oh spara, fraintendi il tuo commento. Sì, lo sono. Originariamente stavo usando import mechanize as me l'assegnazione m.Browser()di amodo che quando chiamo a.open()io sono in effetti chiamando mechanize.Browser().open()ora sto solo l'importazione di tutti mechanizee arrivare a saltare la ... as mparte.
Eric Lagergren,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.