2つのウィキペディアの記事間のルートを見つける


25

前書き

最近、私はたくさんの友人と空を飛び回っていて、退屈して何もすることがなかったので、「ゲーム」を「発明」しました私はそれを見たことがなかったが、それを発明しなかった)。「ゲーム」という言葉を引用符で囲んだのは、それが実際のコンピューターゲームではなく、ウィキペディアでプレイされているためです。

遊ぶのは本当に簡単です。誰かがウィキペディアの記事を目標として選択します。この例では、Code Golfを想定します。すべてのプレイヤーは、ランダムな記事から開始し(サイドバーの[ ランダムな記事]を押すか、この URLに移動します)、現在の記事のリンクされた記事のみを使用して、できるだけ早く「目標」に到達する必要があります。ルールが含まれます:

  • 検索機能は許可されていません(明らかに)
  • 記事のメインテキスト(具体的には内のすべてのテキスト<div id="bodyContent">)内のリンクのみをクリックできます。
  • ランダムページまたは発生した他のページに有効なリンク(デッドリンク、ループなど)がないか、リンクがまったくない場合は、再度ロールバックできます。

チャレンジ

ここがあなたの出番です:残念ながら、私はこのゲームにはかなり苦手ですが、私は汚い詐欺師でもあります。だから、私にこのボットを実装してほしい。私はプログラマでもあるので、当然、私のハードディスクにはコードやライブラリなどがいっぱいで、空きメモリは数バイトしかありません。したがって、この課題はコードゴルフであり、バイト数が最小の答えが勝ちます。

実装の詳細:

  • もちろん、トピック間の接続を認識し、最適なルートを自動的に検出するインテリジェントなボットを実装する必要はありません。ブルートフォーシングは、この課題の目的には十分すぎるほどです。
  • 実際のゲームでは、時間が重要です。あなたのプログラムは記事を見つけるのに1時間以上かかるべきではありません(これは「最終的に」目標を見つけるランダムな検索者のような抜け穴を避けるためです)
  • ゴールへのパスが見つからない場合(デッドリンクやループなど)、以下のリストから何をするかを選択できます。
    • 終了(スコアは同じままです)
    • 別のランダムな記事を取得して再試行し、ループでは何もしません(スコア-= 10)
    • デッドリンクまたはループに関する別のランダムな記事を取得する(ループを自動的に検出する)(スコア-= 50)
    • (「スコア」とは、ここでのバイト数を意味します)
  • ルートを「トレース」すると、さらに20ボーナスバイトが差し引かれるため、訪問する個々のページのタイトルを印刷します。
  • 標準のネットワークライブラリを使用できます(「ウィキペディアの記事をクロールする独自のネットワークライブラリを作成しました」などの抜け穴を避けるため)
    • プログラムがネットワークに関連する唯一のことは、HTTPリクエストを送信してウィキペディアページをダウンロードすることです
  • プログラムがページを見つけると、プログラムは終了しますが、何らかの形で終了したことを知らせます(文字「f」またはページのタイトルを印刷するだけで十分です)
  • 標準的な抜け穴を避ける

ゴルフをお楽しみください!

(これが私の最初の質問ですので、それらを利用する前にコメントの明らかな抜け穴と警告を指摘してください-ありがとう:D)


1
チャレンジには十分興味深いが、サイトをリクエストであふれさせる理由は十分ではない。
マナトワーク14

2
@manatwork私はウィキペディアは、このような「攻撃」を処理するのに十分な帯域幅を持っているかなり確信している
クリストフBöhmwalder

1
抜け穴ではありませんが、これはテーブルに多くの新しいアイデアをもたらすものではない単なるグラフ検索の質問であると不満を言う人を探しています。ただし、このサイトにはもっと質問が必要だと思います。(あなたは間違いなくこの「ゲーム」を発明しませんでしたが:P。)
カルビンの趣味14


1
これは、各ボットでの50回の実行から平均ホップ数を取得するためのコットチャレンジとしては良いことでした。よりインテリジェントなボットを構築するインセンティブを与えます。
ルダン14

回答:


12

Python 373-> 303

Wikipediaの宛先をinput()(ユーザー入力)から読み取ります/wiki/dest。形式はである必要があります。だから、/wiki/Code_golfまたはのようなもの/wiki/United_States。また、インデントに1つのスペースを使用しhttp://enwp.org、Wikipediaの完全なURLの代わりにバイトを節約します。

  • -50壊れたURLを見つけると、新しいランダムURLを取得するため。
  • -20は、アクセスした各URLのタイトルを印刷するためです(タイトル-> URLを変更できますが、タイトルはきれいで、実際にはソースが大きくなります)。

時々ハングしますが、その理由はわかりません。おそらく、ウィキペディアのレート制限のためですか?

私が見つかりましたボストン・レッドソックスWikipediaのページを 9分20秒で、米国のページ10秒の下で、それは取るべきではない、あまりにもコードゴルフを見つけるために長いです...

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)

私は多くのpythonを知りませんが、これは
良さ

ただし、ループは検出されますか?そうでない場合、それは50ではなく10のボーナスポイントです
クリストフベームヴァルダー14

@HackerCowええ、/wiki/Special:RandomURL を除いて同じURLに2回アクセスすることはありません。その結果、多くのURLにアクセスした後、RAM全体を使い果たしてしまいます。
エリックラガーグレン14

これを言うだけです:from ... import*
ɐɔıʇǝɥʇuʎs

1
@DevanLoperおっと、コメントを読み間違えました。はい、そうです。もともと私は使用import mechanize as mしていm.Browser()aので、私a.open()が実際に呼び出しているときに呼び出すと、私はmechanize.Browser().open()すべてをインポートして、mechanizeその... as m部分をスキップするようになります。
エリックラガーグレン14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.