Finden Sie eine Route zwischen zwei Wikipedia-Artikeln

25

Einführung

Vor kurzem war ich mit ein paar Freunden unterwegs und wir haben uns gelangweilt und hatten nichts zu tun, also haben wir ein "Spiel" "erfunden" (einige Leute in den Kommentaren wiesen darauf hin, dass dieses Spiel online spielbar und sehr beliebt ist, also haben wir es definitiv habe es nicht erfunden, obwohl ich es vorher nicht gesehen hatte). Ich habe das Wort "Spiel" in Anführungszeichen gesetzt, weil es kein tatsächliches Computerspiel ist, sondern auf Wikipedia gespielt wird.

Es ist wirklich einfach zu spielen: Jemand wählt einen Wikipedia-Artikel als Ziel. Nehmen wir für dieses Beispiel Code Golf an. Alle Spieler müssen dann von einem zufälligen Artikel ausgehen (durch Drücken von Zufälliger Artikel in der Seitenleiste oder Aufrufen dieser URL) und müssen so schnell wie möglich zum "Ziel" gelangen, indem sie nur verknüpfte Artikel des Artikels verwenden, an dem Sie sich gerade befinden . Die Regeln beinhalten:

  • Die Suchfunktion ist (offensichtlich) nicht erlaubt
  • Sie können nur auf Links im Haupttext des Artikels klicken (insbesondere auf den gesamten darin enthaltenen Text <div id="bodyContent">).
  • Wenn Ihre zufällige Seite oder eine andere Seite, auf die Sie stoßen, keine gültigen Links (tote Links, Schleifen usw.) oder überhaupt keine Links enthält, können Sie erneut rollen.

Die Herausforderung

Hier kommen Sie ins Spiel: Leider bin ich ziemlich schlecht in diesem Spiel, aber ich bin auch ein schmutziger Betrüger. Ich möchte, dass Sie diesen Bot für mich implementieren. Ich bin auch Programmierer, daher ist meine Festplatte natürlich voll mit Code, Bibliotheken und so weiter, und ich habe nur ein paar Bytes Speicher zur Verfügung. Daher ist diese Herausforderung Code Golf, die Antwort mit den wenigsten Bytes gewinnt.

Implementierungsdetails:

  • Natürlich müssen Sie keinen intelligenten Bot implementieren, der die Zusammenhänge zwischen den Themen kennt und automatisch die optimale Route erkennt. Brute Forcing ist mehr als genug für den Zweck dieser Herausforderung
  • Im eigentlichen Spiel zählt die Zeit. Ihr Programm sollte nicht länger als 1 Stunde dauern, um den Artikel zu finden (um Lücken wie zufällige Sucher zu vermeiden, die "irgendwann" das Ziel finden).
  • Wenn kein Pfad zum Ziel gefunden werden kann (z. B. tote Links oder eine Schleife), können Sie aus der folgenden Liste auswählen, was zu tun ist:
    • Beenden (Punktzahl bleibt gleich)
    • Holen Sie sich einen anderen zufälligen Artikel und versuchen Sie es erneut und tun Sie nichts auf Schleifen (Punktzahl - = 10)
    • Holen Sie sich einen anderen zufälligen Artikel über einen toten Link oder eine Schleife (Loops automatisch erkennen) (Punktzahl - = 50)
    • (Mit "Punktzahl" meine ich Ihre Byteanzahl hier)
  • Weitere 20 Bonusbytes werden abgezogen, wenn Sie die Route "verfolgen", sodass Sie den Titel jeder einzelnen von Ihnen besuchten Seite ausdrucken.
  • Es können Standard-Netzwerkbibliotheken verwendet werden (um Schlupflöcher wie "Ich habe meine eigene Netzwerkbibliothek erstellt, die Wikipedia-Artikel crawlt" zu vermeiden).
    • Das einzige, was Ihr Programm im Zusammenhang mit dem Netzwerk tun sollte, ist eine HTTP-Anfrage zum Herunterladen einer Wikipedia-Seite zu senden
  • Wenn Ihr Programm die Seite findet, sollte es beendet werden, aber irgendwie signalisieren, dass es fertig ist (das Drucken des Zeichens "f" oder des Titels der Seite ist ausreichend)
  • Standardlücken sind zu vermeiden

Viel Spaß beim Golfen!

(Dies ist meine erste Frage hier. Bitte weisen Sie in den Kommentaren auf offensichtliche Lücken und Vorbehalte hin, bevor Sie sie ausnutzen - danke: D)

Christoph Böhmwalder
quelle
1
Interessant genug für eine Herausforderung, aber nicht Grund genug für mich, eine Site mit Anfragen zu überfluten.
Manatwork
2
@manatwork Ich bin mir ziemlich sicher, dass Wikipedia genügend Bandbreite hat, um mit "Angriffen" wie diesen
umzugehen
1
Nicht gerade ein Schlupfloch, aber ich würde mich nach Leuten umsehen, die sich beschweren, dass dies nur eine Grafiksuchfrage ist, die nicht viele neue Ideen auf den Tisch bringt. Ich denke jedoch, es ist in Ordnung, diese Seite braucht mehr Fragen. (Obwohl Sie dieses "Spiel" definitiv nicht erfunden haben: P.)
Calvins Hobbys
1
Dies hätte eine gute Herausforderung sein können, wenn man die durchschnittliche Anzahl von Hops von 50 Läufen mit jedem Bot genommen hätte. Würde mehr Anreiz geben, einen intelligenteren Bot zu bauen.
rdans

Antworten:

12

Python 373 -> 303

Es liest das Wikipedia-Ziel aus input()(Benutzereingabe) und sollte im Format von sein /wiki/dest. Also sowas wie /wiki/Code_golfoder /wiki/United_States. Es wird auch ein Leerzeichen für die Einrückungen und http://enwp.organstelle der vollständigen URL von Wikipedia zum Speichern von Bytes verwendet.

  • -50, weil wenn eine fehlerhafte URL gefunden wird, eine neue zufällige URL abgerufen wird.
  • -20 weil es den Titel jeder besuchten URL ausgibt (könnte den Titel ändern -> URL, aber der Titel ist sauberer und vergrößert meine Quelle tatsächlich).

Es hängt von Zeit zu Zeit, und ich kann nicht herausfinden, warum. Vielleicht aufgrund von Wikipedia-Gebührenbeschränkungen?

Ich fand die Wikipedia-Seite von Boston Red Sox in 9 Minuten und 20 Sekunden und die Seite der Vereinigten Staaten in weniger als 10 Sekunden. Es sollte also nicht zu lange dauern , Code Golf zu finden ...

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
quelle
Ich kenne nicht viel Python, aber das sieht gut aus
Christoph Böhmwalder
Erkennt es trotzdem Schleifen? Wenn es nicht der Fall ist, ist , dass 10 Bonuspunkte anstelle von 50
Christoph Böhmwalder
@HackerCow Ja, es wird nicht zweimal die gleiche URL aufgerufen, mit Ausnahme der /wiki/Special:RandomURL. Folglich wird nach dem Besuch vieler URLs der gesamte Arbeitsspeicher aufgebraucht.
Eric Lagergren
Ich werde dies nur sagen: from ... import*.
ɐɔıʇǝɥʇuʎs
1
@ DevanLoper oh schießen, falsch verstanden Ihren Kommentar. Ja bin ich. Ursprünglich habe ich import mechanize as mund die Zuweisung m.Browser()dazu verwendet a, wenn ich anrufe , rufe a.open()ich tatsächlich mechanize.Browser().open()jetzt an, importiere einfach alles mechanizeund kann das ... as mTeil überspringen .
Eric Lagergren