Temukan rute antara dua artikel Wikipedia

25

pengantar

Baru-baru ini, saya skyping dengan sekelompok teman dan kami bosan dan tidak ada hubungannya, jadi kami "menemukan" sebuah "permainan" (beberapa orang di komentar menunjukkan bahwa permainan ini dapat dimainkan secara online dan sangat populer, jadi kami secara pasti tidak menciptakannya, meskipun saya belum pernah melihatnya). Alasan saya memasukkan kata "permainan" dalam tanda kutip adalah karena itu bukan permainan komputer yang sebenarnya, tetapi dimainkan di Wikipedia.

Ini sangat mudah dimainkan: Seseorang memilih beberapa artikel Wikipedia sebagai tujuannya. Mari kita asumsikan Code Golf untuk contoh ini. Semua pemain kemudian harus mulai dari artikel acak (dengan menekan Artikel Acak di bilah sisi atau pergi ke URL ini ) dan harus sampai ke "tujuan" secepat mungkin menggunakan hanya artikel yang ditautkan dari artikel tempat Anda berada saat ini . Aturan termasuk:

  • Fungsi pencarian tidak diizinkan (jelas)
  • Anda hanya dapat mengklik tautan di teks utama artikel (khususnya semua teks di dalamnya <div id="bodyContent">)
  • Jika halaman acak Anda atau halaman lain yang Anda temui tidak memiliki tautan yang valid (tautan mati, putaran, dll.) Atau tidak ada tautan sama sekali yang dapat Anda putar lagi.

Tantangan

Di sinilah Anda masuk: sayangnya saya sangat buruk dalam permainan ini, tapi saya juga penipu kotor. Jadi saya ingin Anda menerapkan bot ini untuk saya. Saya juga seorang programmer, jadi tentu saja hard disk saya penuh dengan hal-hal seperti kode, perpustakaan dan semacamnya dan saya hanya punya beberapa byte memori untuk cadangan. Oleh karena itu tantangan ini adalah Code Golf, jawaban dengan byte paling sedikit menang.

Detail Implementasi:

  • Tentu saja Anda tidak perlu mengimplementasikan bot cerdas yang mengetahui koneksi antar topik dan secara otomatis mendeteksi rute optimal. Pemaksaan kasar lebih dari cukup untuk tujuan tantangan ini
  • Dalam permainan yang sebenarnya, waktu diperhitungkan. Program Anda seharusnya tidak perlu lebih dari 1 jam untuk menemukan artikel (ini untuk menghindari celah seperti pencari acak yang akan "akhirnya" menemukan tujuannya)
  • Jika tidak ada jalur ke tujuan (mis. Tautan mati atau loop), Anda dapat memilih apa yang harus dilakukan dari daftar di bawah ini:
    • Berhenti (skor tetap sama)
    • Dapatkan artikel acak lain dan coba lagi dan jangan lakukan apa pun di loop (skor - = 10)
    • Dapatkan artikel acak lainnya pada tautan mati atau putaran (deteksi loop otomatis) (skor - = 50)
    • (Dengan "skor" Maksud saya jumlah byte Anda di sini)
  • 20 byte bonus lainnya akan dikurangi jika Anda "melacak" rute, sehingga Anda mencetak judul setiap halaman yang Anda kunjungi.
  • Pustaka jaringan standar dapat digunakan (untuk menghindari celah seperti "Saya membuat pustaka jaringan saya sendiri yang merayapi artikel wikipedia")
    • Satu-satunya hal yang berhubungan dengan jaringan yang harus dilakukan program Anda adalah mengirim permintaan HTTP untuk mengunduh halaman wikipedia
  • Jika program Anda menemukan halaman, itu harus keluar, tetapi entah bagaimana menandakan bahwa itu selesai (mencetak karakter "f" atau judul halaman sudah cukup)
  • Celah standar harus dihindari

Bersenang-senang bermain golf!

(Ini adalah pertanyaan pertama saya di sini, jadi tolong tunjukkan celah dan peringatan yang jelas dalam komentar sebelum mengeksploitasi mereka - terima kasih: D)

Christoph Böhmwalder
sumber
1
Cukup menarik untuk sebuah tantangan, tetapi tidak cukup alasan bagi saya untuk membanjiri situs dengan permintaan.
manatwork
2
@manatwork Saya cukup yakin Wikipedia memiliki bandwidth yang cukup untuk menangani "serangan" seperti ini
Christoph Böhmwalder
1
Bukan celah yang pasti, tetapi saya akan mencari orang yang mengeluh bahwa ini hanyalah pertanyaan pencarian grafik yang tidak membawa banyak ide baru ke meja. Namun saya pikir tidak masalah, situs ini membutuhkan lebih banyak pertanyaan. (Meskipun Anda pasti tidak menciptakan "permainan" ini: P.)
Calvin's Hobbies
1
Ini bisa bagus sebagai tantangan utama mengambil jumlah rata-rata lompatan dari 50 berjalan dengan masing-masing bot. Akan memberi lebih banyak insentif untuk membangun bot yang lebih cerdas.
rdans

Jawaban:

12

Python 373 -> 303

Bunyinya tujuan Wikipedia dari input()(input pengguna) dan harus dalam format /wiki/dest. Jadi, sesuatu seperti /wiki/Code_golfatau /wiki/United_States. Itu juga menggunakan satu ruang untuk indentasi dan http://enwp.orgbukannya URL lengkap Wikipedia untuk menyimpan byte.

  • -50 karena jika ia menemukan URL yang rusak itu mendapat URL acak baru.
  • -20 karena mencetak judul setiap URL yang dikunjungi (bisa mengubah judul -> URL, tetapi judul lebih bersih dan sebenarnya membuat sumber saya lebih besar).

Menggantung sekali-sekali, dan saya tidak tahu mengapa. Mungkin karena batasan kurs Wikipedia?

Saya menemukan halaman Boston Red Sox Wikipedia dalam waktu 9 menit 20 detik, dan halaman Amerika Serikat dalam waktu kurang dari 10 detik, jadi seharusnya tidak terlalu lama untuk menemukan 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
sumber
Saya tidak tahu banyak tentang python, tapi ini terlihat bagus
Christoph Böhmwalder
Apakah itu mendeteksi loop? Jika tidak, itu 10 poin bonus, bukan 50
Christoph Böhmwalder
@ Hacker ya itu tidak akan mengunjungi url yang sama dua kali kecuali untuk /wiki/Special:Randomurl. Akibatnya, setelah mengunjungi banyak url, itu akan memakan seluruh RAM Anda.
Eric Lagergren
Saya hanya akan mengatakan ini: from ... import*.
ɐɔıʇǝɥʇuʎ
1
@DevanLoper oh tembak, salah baca komentar Anda. Ya, benar. Awalnya saya menggunakan import mechanize as mdan menugaskan m.Browser()untuk ajadi ketika saya sebut a.open()saya berlaku memanggil mechanize.Browser().open()sekarang aku hanya mengimpor semua mechanizedan untuk melewatkan ... as mbagian.
Eric Lagergren