İki Wikipedia makalesi arasında bir rota bulun


25

Giriş

Son zamanlarda bir sürü arkadaşımla birlikte uçtum ve sıkıldık ve yapacak bir şeyimiz olmadı, bu yüzden "bir" oyun "icat ettik (yorumlarda bazı insanlar bu oyunun çevrimiçi olarak oynanabilir ve çok popüler olduğunu belirtti, bu yüzden kesinlikle daha önce görmemiş olmama rağmen icat etmedi). "Oyun" kelimesini tırnak içine almamın nedeni gerçek bir bilgisayar oyunu olmaması, ancak Wikipedia'da oynanması.

Oynamak çok kolay: Birileri bazı Wikipedia makalelerini hedef olarak seçti. Bu örnek için Code Golf varsayalım . Daha sonra tüm oyuncuların rastgele bir yazıdan başlaması ( kenar çubuğundaki Rastgele Makale'ye basarak veya bu URL’ye giderek ) ve yalnızca şu anda bulunduğunuz makalenin bağlantılı makalelerini kullanarak mümkün olan en kısa sürede "hedefe" ulaşması gerekir . Kurallar şunları içerir:

  • Arama işlevine izin verilmiyor (belli ki)
  • Yalnızca makalenin ana metnindeki bağlantıları tıklayabilirsiniz (özellikle içindeki tüm metinler <div id="bodyContent">)
  • Rastgele sayfanızda ya da karşılaştığınız başka bir sayfanın geçerli bağlantıları (ölü bağlantılar, döngüler, vb.) Yoksa ya da hiç bağlantınız yoksa tekrar rulo atabilirsiniz.

Meydan okuma

İşte girdiğiniz yer: maalesef bu oyunda oldukça kötüyüm ama aynı zamanda kirli bir dolandırıcıyım. Bu yüzden benim için bu botu uygulamanı istiyorum. Ben aynı zamanda bir programcıyım, bu yüzden doğal olarak sabit diskim kod, kitaplık ve benzeri şeyler ile doludur ve yalnızca birkaç byte'lık boş hafızam var. Bu nedenle bu zorluk Code Golf'dur, en az bayt olan cevap kazanır.

Uygulama ayrıntıları:

  • Elbette, konular arasındaki bağlantıları bilen ve optimum rotayı otomatik olarak algılayan akıllı bir bot uygulamak zorunda değilsiniz. Brute zorlama bu zorluğun amacı için fazlasıyla yeterli
  • Gerçek oyunda, zaman sayar. Makalenizin programınızın bulunması 1 saatten uzun sürmemelidir (bu, hedefi "sonunda bulabilecek" gibi rasgele aramalar gibi boşluklardan kaçınmaktır)
  • Hedefe giden bir yol bulunamazsa (ör. Ölü linkler veya bir döngü) aşağıdaki listeden ne yapılacağını seçebilirsiniz:
    • Çık (puan aynı kalır)
    • Başka bir rastgele makale alın ve tekrar deneyin ve döngüler üzerinde hiçbir şey yapmayın (puan - = 10)
    • Ölü bir link veya döngü üzerine rastgele bir makale daha al (döngüleri otomatik olarak algıla) (skor - = 50)
    • ("Puan" derken, burada bayt sayınızı kastediyorum)
  • Rotayı "izlerseniz" başka 20 bonus baytı çıkarılır, böylece ziyaret ettiğiniz her sayfanın başlığını yazarsınız.
  • Standart ağ kütüphaneleri kullanılabilir ("wikipedia makalelerini tarayan kendi ağ kütüphanemi hazırladım" gibi boşluklardan kaçınmak için)
    • Programın ağ ile ilgili yapması gereken tek şey, bir wikipedia sayfasını indirmek için bir HTTP isteği göndermek.
  • Programınız sayfayı bulursa, çıkmalı, ancak bir şekilde bitmiş olduğunu işaret etmelidir ("f" karakterini basmak veya sayfanın başlığını yazmak yeterlidir)
  • Standart boşluklardan kaçınılmalıdır

Golf eğlenin!

(Buradaki ilk sorum bu, lütfen onları sömürmeden önce yorumlardaki açık boşlukları ve uyarıları belirtin - teşekkürler: D)


1
Bir meydan okuma için yeterince ilgi çekici, ancak bir siteyi isteklerle doldurmam için yeterli neden yok.
Manatwork

2
Oldukça belli Vikipedi böyle sap "saldırılar" yeterli bant genişliği vardır olduğum @manatwork
Christoph Böhmwalder

1
Tam olarak bir kaçamak değil, ama bunun masaya pek çok yeni fikir getirmeyen bir grafik arama sorusu olduğundan şikayet eden insanlara bakardım. Ancak bunun iyi olduğunu düşünüyorum, bu sitenin daha fazla soruya ihtiyacı var. (Her ne kadar kesinlikle bu "oyunu" icat etmemiş olsanız da: P.)
Calvin'in Hobileri


1
Bu, her botla yapılan 50 koşudan ortalama atlamalı sayıları almak gibi zorlu bir mücadele olabilirdi. Daha akıllı bir bot inşa etmek için daha fazla teşvik verirdi.
rdans

Yanıtlar:


12

Python 373 -> 303

Vikipedi hedefini input()(kullanıcı girişi) okur ve biçiminde olmalıdır /wiki/dest. Yani, /wiki/Code_golfya da gibi bir şey /wiki/United_States. Ayrıca, girintiler için tek bir boşluk kullanır ve http://enwp.orgbaytları kaydetmek için Wikipedia'nın tam URL'si yerine kullanılır.

  • -50 çünkü eğer bozuk bir URL bulursa, rastgele yeni bir URL alır.
  • -20, ziyaret edilen her URL'nin başlığını yazdırdığı için (başlığı değiştirebilir -> URL, ancak başlık daha temiz ve kaynağımı daha büyük yapar).

Her defasında bir defa kilitleniyor ve nedenini çözemiyorum. Belki Vikipedi oran sınırları nedeniyle?

Boston Red Sox Wikipedia sayfasını 9 dakika 20 saniye içinde ve Amerika Birleşik Devletleri sayfalarını 10 saniyenin altında buldum , bu yüzden Code Golf'ü bulmak çok uzun sürmedi ...

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)

Çok fazla python bilmiyorum, ama bu güzel görünüyor
Christoph Böhmwalder

Yine de döngüler algılıyor mu?
Olmazsa

@HackerCow evet, /wiki/Special:Randomurl dışında iki kez aynı URL’yi ziyaret etmez . Sonuç olarak, birçok url'yi ziyaret ettikten sonra, tüm RAM'inizi yer.
Eric Lagergren

Sadece bu söylerim: from ... import*.
ɐɔıʇǝɥʇuʎs

1
@DevanLoper oh ateş, yorumunuzu yanlış okuyun. Evet benim. Başlangıçta kullanıyordum import mechanize as mve atama m.Browser()yapmak aiçin kullandığımda şimdi a.open()etkin olarak arama mechanize.Browser().open()yapıyorum sadece hepsini alıyorum mechanizeve ... as mkısmı atlamak için alıyorum .
Eric Lagergren
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.